TOP

Lezione SQL 9. Sottoquery

Fino ad ora, abbiamo ottenuto i dati dal database utilizzando semplici query e una singola istruzione SELECT. Tuttavia, molto spesso dovremo selezionare dati che soddisfino molte condizioni e qui non possiamo fare a meno di query avanzate. Per questo in SQL ci sono sottoquery o query annidate, dove un'istruzione SELECT è annidata all'interno di un'altra.

Una sottoquery è un'istruzione SELECT annidata all'interno di un'altra SELECT, SELECT...INTO, INSERT...INTO, DELETE, UPDATE o all'interno di un'altra sottoquery.

Il testo della sottoquery deve essere racchiuso tra parentesi. Le subquery vengono spesso utilizzate al posto dell'unione di tabelle (JOIN).


1. Filtraggio utilizzando sottoquery

Le tabelle del database utilizzate nel DBMS Access sono tabelle relazionali, ovvero tutte le tabelle possono essere collegate tra loro tramite campi comuni. Supponiamo di archiviare i dati in due tabelle diverse e di dover selezionare i dati in una di esse, a seconda di quali dati si trovano nell'altra. Per questo, creeremo un'altra tabella nel nostro database. Questa sarà, ad esempio, la tabella Sellers con le informazioni sui fornitori:

Ora abbiamo due tabelle: Sumproduct e Sellers che hanno lo stesso campo City. Diciamo che dobbiamo contare quanti prodotti sono stati venduti solo in Canada. Le subquery ci aiuteranno a farlo. Quindi, per prima cosa, scriviamo una query per un campione di città situate in Canada:

Run SQLSELECT City 
FROM Sellers 
WHERE Country = 'Canada'

Ora passiamo questi dati alla seguente query, che selezionerà i dati dalla tabella Sumproduct:

Run SQLSELECT SUM(Quantity) AS Qty_Canada 
FROM Sumproduct 
WHERE City IN ('Montreal','Toronto')

Possiamo anche combinare queste due richieste in una sola. Pertanto, una richiesta che trasmette dati in output sarà quella principale e la seconda richiesta che trasferisce dati in input sarà ausiliaria (sottoquery). Per inserire una sottoquery utilizzeremo la costruzione WHERE ... IN (...), di cui abbiamo parlato nella sezione Filtraggio avanzato:

Run SQLSELECT SUM(Quantity) AS Qty_Canada 
FROM Sumproduct 
WHERE City IN (SELECT City 
               FROM Sellers 
               WHERE Country = 'Canada')

Possiamo vedere che abbiamo ottenuto gli stessi dati di due query separate. Allo stesso modo, possiamo aumentare la profondità di nidificazione delle query nidificando le sottoquery quante volte vogliamo.

2. Utilizzo delle subquery come campi di liquidazione

Possiamo anche utilizzare le sottoquery come campi calcolati. Visualizziamo, ad esempio, il numero di prodotti venduti per ciascun venditore utilizzando la seguente query:

Run SQLSELECT Seller_name, (SELECT SUM(Quantity) 
                     FROM Sumproduct 
                     WHERE Sellers.City = Sumproduct.City) AS Qty 
FROM Sellers

La prima istruzione SELECT visualizza due colonne: Seller_name e Qty. Viene calcolato il campo Qty, formato come risultato dell'esecuzione della sottoquery, che è racchiusa tra parentesi tonde. Questa sottoquery viene eseguita una volta per ogni record nel campo Seller_name e verrà eseguita quattro volte in totale poiché sono selezionati quattro nomi di venditori.

Inoltre, nella sottoquery, la clausola WHERE esegue la funzione di unione, perché con l'aiuto di WHERE abbiamo unito le due tabelle tramite il campo City, utilizzando i nomi completi delle colonne (Table.Field).