T-SQL - Sottoquery

UN sub-query o Inner query o Nested queryè una query all'interno di un'altra query di SQL Server e incorporata nella clausola WHERE. Una sottoquery viene utilizzata per restituire i dati che verranno utilizzati nella query principale come condizione per limitare ulteriormente i dati da recuperare.

Le sottoquery possono essere utilizzate con le istruzioni SELECT, INSERT, UPDATE e DELETE insieme a operatori come =, <,>,> =, <=, IN, BETWEEN, ecc.

Ci sono alcune regole che le sottoquery devono seguire:

  • È necessario racchiudere una sottoquery tra parentesi.

  • Una sottoquery deve includere una clausola SELECT e una clausola FROM.

  • Una sottoquery può includere clausole WHERE, GROUP BY e HAVING facoltative.

  • Una sottoquery non può includere clausole COMPUTE o FOR BROWSE.

  • È possibile includere una clausola ORDER BY solo quando è inclusa una clausola TOP.

  • Puoi nidificare sottoquery fino a 32 livelli.

Sottoquery con istruzione SELECT

Sintassi

Le sottoquery vengono utilizzate più di frequente con l'istruzione SELECT. Di seguito è riportata la sintassi di base.

SELECT column_name [, column_name ] 
FROM   table1 [, table2 ] 
WHERE  column_name OPERATOR 
   (SELECT column_name [, column_name ] 
   FROM table1 [, table2 ] 
   [WHERE])

Esempio

Considera la tabella CLIENTI con i seguenti record.

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

Applichiamo la seguente sottoquery con l'istruzione SELECT.

SELECT *  
   FROM CUSTOMERS
   WHERE ID IN (SELECT ID FROM CUSTOMERS WHERE SALARY > 4500)

Il comando precedente produrrà il seguente output.

ID  NAME       AGE       ADDRESS          SALARY 
4   Chaitali   25        Mumbai           6500.00 
5   Hardik     27        Bhopal           8500.00 
7   Muffy      24        Indore           10000.00

Sottoquery con istruzione INSERT

Le sottoquery possono essere utilizzate anche con le istruzioni INSERT. L'istruzione INSERT utilizza i dati restituiti dalla sottoquery per inserirli in un'altra tabella. I dati selezionati nella sottoquery possono essere modificati con qualsiasi funzione di carattere, data o numero.

Sintassi

Di seguito è riportata la sintassi di base.

INSERT INTO table_name [ (column1 [, column2 ]) ] 
   SELECT [ *|column1 [, column2 ] 
   FROM table1 [, table2 ] 
   [ WHERE VALUE OPERATOR ]

Esempio

Considera una tabella CUSTOMERS_BKP con struttura simile alla tabella CUSTOMERS. Di seguito è riportata la sintassi per copiare la tabella CUSTOMERS completa in CUSTOMERS_BKP.

INSERT INTO CUSTOMERS_BKP 
   SELECT * FROM CUSTOMERS  
   WHERE ID IN (SELECT ID FROM CUSTOMERS)

Sottoquery con istruzione UPDATE

La sottoquery può essere utilizzata insieme all'istruzione UPDATE. È possibile aggiornare una o più colonne in una tabella quando si utilizza una sottoquery con l'istruzione UPDATE.

Sintassi

Di seguito è riportata la sintassi di base.

UPDATE table 
SET column_name = new_value 
[ WHERE OPERATOR [ VALUE ] 
   (SELECT COLUMN_NAME 
   FROM TABLE_NAME) 
   [ WHERE) ]

Esempio

Supponiamo di avere disponibile la tabella CUSTOMERS_BKP che è il backup della tabella CUSTOMERS.

L'esempio di comando seguente aggiorna SALARY di 0,25 volte nella tabella CLIENTI per tutti i clienti la cui ETÀ è maggiore o uguale a 27.

UPDATE CUSTOMERS 
   SET SALARY = SALARY * 0.25 
   WHERE AGE IN (SELECT AGE FROM CUSTOMERS_BKP WHERE AGE >= 27 )

Ciò avrà un impatto su due righe e alla fine la tabella CUSTOMERS avrà i seguenti record.

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

Sottoquery con istruzione DELETE

La sottoquery può essere utilizzata insieme all'istruzione DELETE come con qualsiasi altra istruzione menzionata sopra.

Sintassi

Di seguito è riportata la sintassi di base.

DELETE FROM TABLE_NAME 
[ WHERE OPERATOR [ VALUE ] 
   (SELECT COLUMN_NAME 
   FROM TABLE_NAME) 
   [ WHERE) ]

Esempio

Supponiamo di avere disponibile la tabella CUSTOMERS_BKP che è il backup della tabella CUSTOMERS.

L'esempio di comando seguente elimina i record dalla tabella CUSTOMERS per tutti i clienti la cui ETÀ è maggiore o uguale a 27.

DELETE FROM CUSTOMERS 
   WHERE AGE IN (SELECT AGE FROM CUSTOMERS_BKP WHERE AGE >=27 )

Ciò avrebbe un impatto su due righe e alla fine la tabella CUSTOMERS avrà i seguenti record.

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