T-SQL - Subconsultas
UMA sub-query ou Inner query ou Nested queryé uma consulta dentro de outra consulta do SQL Server e incorporada na cláusula WHERE. Uma subconsulta é usada para retornar dados que serão usados na consulta principal como uma condição para restringir ainda mais os dados a serem recuperados.
Subconsultas podem ser usadas com as instruções SELECT, INSERT, UPDATE e DELETE junto com os operadores como =, <,>,> =, <=, IN, BETWEEN, etc.
Existem algumas regras que as subconsultas devem seguir -
Você deve colocar uma subconsulta entre parênteses.
Uma subconsulta deve incluir uma cláusula SELECT e uma cláusula FROM.
Uma subconsulta pode incluir cláusulas WHERE, GROUP BY e HAVING opcionais.
Uma subconsulta não pode incluir cláusulas COMPUTE ou FOR BROWSE.
Você pode incluir uma cláusula ORDER BY somente quando uma cláusula TOP estiver incluída.
Você pode aninhar subconsultas em até 32 níveis.
Subconsultas com instrução SELECT
Sintaxe
As subconsultas são usadas com mais freqüência com a instrução SELECT. A seguir está a sintaxe básica.
SELECT column_name [, column_name ]
FROM table1 [, table2 ]
WHERE column_name OPERATOR
(SELECT column_name [, column_name ]
FROM table1 [, table2 ]
[WHERE])
Exemplo
Considere a tabela CUSTOMERS com os seguintes registros.
ID NAME AGE ADDRESS SALARY
1 Ramesh 32 Ahmedabad 2000.00
2 Khilan 25 Delhi 1500.00
3 kaushik 23 Kota 2000.00
4 Chaitali 25 Mumbai 6500.00
5 Hardik 27 Bhopal 8500.00
6 Komal 22 MP 4500.00
7 Muffy 24 Indore 10000.00
Vamos aplicar a seguinte subconsulta com a instrução SELECT.
SELECT *
FROM CUSTOMERS
WHERE ID IN (SELECT ID FROM CUSTOMERS WHERE SALARY > 4500)
O comando acima produzirá a seguinte saída.
ID NAME AGE ADDRESS SALARY
4 Chaitali 25 Mumbai 6500.00
5 Hardik 27 Bhopal 8500.00
7 Muffy 24 Indore 10000.00
Subconsultas com instrução INSERT
Subconsultas também podem ser usadas com instruções INSERT. A instrução INSERT usa os dados retornados da subconsulta para inserir em outra tabela. Os dados selecionados na subconsulta podem ser modificados com qualquer uma das funções de caractere, data ou número.
Sintaxe
A seguir está a sintaxe básica.
INSERT INTO table_name [ (column1 [, column2 ]) ]
SELECT [ *|column1 [, column2 ]
FROM table1 [, table2 ]
[ WHERE VALUE OPERATOR ]
Exemplo
Considere uma tabela CUSTOMERS_BKP com estrutura semelhante à tabela CUSTOMERS. A seguir está a sintaxe para copiar a tabela CUSTOMERS completa para CUSTOMERS_BKP.
INSERT INTO CUSTOMERS_BKP
SELECT * FROM CUSTOMERS
WHERE ID IN (SELECT ID FROM CUSTOMERS)
Subconsultas com instrução UPDATE
A subconsulta pode ser usada em conjunto com a instrução UPDATE. Tanto uma coluna quanto várias colunas em uma tabela podem ser atualizadas ao usar uma subconsulta com a instrução UPDATE.
Sintaxe
A seguir está a sintaxe básica.
UPDATE table
SET column_name = new_value
[ WHERE OPERATOR [ VALUE ]
(SELECT COLUMN_NAME
FROM TABLE_NAME)
[ WHERE) ]
Exemplo
Vamos supor que temos a tabela CUSTOMERS_BKP disponível, que é o backup da tabela CUSTOMERS.
O exemplo de comando a seguir atualiza SALÁRIO em 0,25 vezes na tabela CLIENTES para todos os clientes cuja IDADE é maior ou igual a 27.
UPDATE CUSTOMERS
SET SALARY = SALARY * 0.25
WHERE AGE IN (SELECT AGE FROM CUSTOMERS_BKP WHERE AGE >= 27 )
Isso afetará duas linhas e, finalmente, a tabela CUSTOMERS terá os seguintes registros.
ID NAME AGE ADDRESS SALARY
1 Ramesh 32 Ahmedabad 500.00
2 Khilan 25 Delhi 1500.00
3 kaushik 23 Kota 2000.00
4 Chaitali 25 Mumbai 6500.00
5 Hardik 27 Bhopal 2125.00
6 Komal 22 MP 4500.00
7 Muffy 24 Indore 10000.00
Subconsultas com instrução DELETE
A subconsulta pode ser usada em conjunto com a instrução DELETE como com qualquer outra instrução mencionada acima.
Sintaxe
A seguir está a sintaxe básica.
DELETE FROM TABLE_NAME
[ WHERE OPERATOR [ VALUE ]
(SELECT COLUMN_NAME
FROM TABLE_NAME)
[ WHERE) ]
Exemplo
Vamos supor que temos a tabela CUSTOMERS_BKP disponível, que é o backup da tabela CUSTOMERS.
O exemplo de comando a seguir exclui registros da tabela CLIENTES para todos os clientes cuja IDADE seja maior ou igual a 27.
DELETE FROM CUSTOMERS
WHERE AGE IN (SELECT AGE FROM CUSTOMERS_BKP WHERE AGE >=27 )
Isso impactaria duas linhas e, finalmente, a tabela CUSTOMERS terá os seguintes registros.
ID NAME AGE ADDRESS SALARY
2 Khilan 25 Delhi 1500.00
3 kaushik 23 Kota 2000.00
4 Chaitali 25 Mumbai 6500.00
6 Komal 22 MP 4500.00
7 Muffy 24 Indore 10000.00