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