Torna all'elenco degli articoli Articoli
Tempo di lettura: 8 minuti

Come esercitarsi con le subquery in SQL

Vi siete mai chiesti cosa separa i principianti dagli utenti avanzati di SQL? Si tratta di cose come, ad esempio, le subquery. In questo articolo vi spiego la loro importanza e perché dovete esercitarvi con le subquery SQL per diventare esperti.

Che cos'è una subquery SQL?

L'SQL è un linguaggio facile da imparare. Tuttavia, ci sono alcune caratteristiche e tecniche complesse del linguaggio che richiedono pratica. Una di queste caratteristiche è la subquery, che aggiunge una grande potenza espressiva al linguaggio e ai vostri progetti.

In questo articolo, esaminiamo alcuni esempi per fare il primo passo verso la pratica delle subquery. Citiamo anche articoli e corsi dove trovare altro materiale, come lezioni ed esercizi, per continuare a migliorare nell'uso delle subquery.

Se non sapete di cosa sto parlando, iniziate con il corso. SQL per principianti corso. È il punto di partenza perfetto per imparare l'SQL. Se invece conoscete già un po' l'argomento ma non sapete come esercitarvi con le subquery, continuate a leggere.

In termini semplici, una subquery è una query all'interno di una query. SQL ci permette di inserire le subquery in diverse parti di una query SQL, come le clausole WHERE e FROM, tra le altre. Creare una subquery è molto semplice, perché la sua struttura è la stessa di una normale query. È sufficiente conoscere alcune regole su come collegare la query e la subquery.

Prima di iniziare con gli esempi, chiariamo un po' di vocabolario: nel resto di questo articolo, chiameremo la query esterna in cui risiede una sottoquery "query esterna".

Introduciamo un semplice database con due tabelle: employee e department.

Tabella employee

employee_idlast_namefirst_namesalarydepartment_id
1001SmithJohn145000.00100
1002BelleMary115000.00101
1003DalePeter155000.00102
1004GarrahanSusan195000.00100
1005GarrahanMary94000.00102
1006FiesJulia92000.00101

Tabella department

department_iddept_namemanager_idbudgetbuilding
100Sales23240000.00CentralPark
101Accounting56130000.00CentralPark
102IT34150000.00Oblivious

Supponiamo di voler ottenere il nome del dipartimento con il budget più elevato. Possiamo scrivere la seguente query, che include una sottoquery (in blu):

SELECT dept_name, budget
FROM   department
WHERE budget = ( SELECT MAX(budget) FROM department )

Abbiamo una sottoquery (in blu) nella clausola WHERE che restituisce il bilancio più grande della tabella department tabella. Quindi, utilizziamo questo valore nella clausola WHERE della query esterna per confrontarlo con la colonna budget. Tutti i record della tabella department tabella che hanno un budget pari al valore massimo del budget vengono restituiti.

Si noti che la subquery è racchiusa tra parentesi. In SQL, le sottoquery devono sempre essere racchiuse tra parentesi.

Con questo esempio abbiamo visto quanto sia facile e semplice creare una subquery. Tuttavia, ci sono alcune regole su come collegare la subquery con la query esterna. Occorre anche sapere dove deve trovarsi una sottoquery all'interno dell'istruzione SELECT. Esistono diverse clausole (come WHERE, FROM e HAVING) nella query esterna in cui è possibile inserire una sottoquery. Questi sono alcuni dei motivi per cui è importante fare pratica con le subquery.

Infine, per chi è alla ricerca di risorse per mettere in pratica le proprie competenze in SQL, suggerisco il corso Esercizi SQL. Vi si trovano più di 80 esercizi interattivi, che vanno da semplici operazioni con le istruzioni di SELECT FROM a problemi più avanzati che coinvolgono più subquery. Un'altra interessante serie di esercizi SQL si trova nel sito Pratica Mensile su SQL, dove si vede il proprio codice SQL in azione e si riceve un feedback immediato.

Un altro esempio di subquery SQL

Abbiamo visto una subquery che restituisce un insieme di risultati con un solo record e una sola colonna. Questo tipo di subquery è abbastanza comune ed è facile integrare o collegare la subquery con la query esterna utilizzando l'operatore equal (=).

Vediamo ora una subquery che restituisce una sola colonna ma più record, in contrasto con una subquery che produce un solo record.

Supponiamo di dover ottenere gli ID dei dipendenti e i nomi dei dipendenti che lavorano nell'edificio CentralPark. Possiamo scrivere una query SQL come la seguente. Anche in questo caso, la sottoquery è in blu.

SELECT employee_id, last_name, first_name
FROM   employee
WHERE department_id IN ( SELECT department_id
                         FROM   department
                         WHERE  building = ‘CentralPark’
                       )

La prima cosa da notare è il numero di record restituiti dalla subquery. Restituisce due record perché nell'edificio CentralPark ci sono due dipartimenti: Vendite e Contabilità. Pertanto, la sottoquery genera un set di risultati con due ID di reparto, 100 e 101.

La seconda cosa da notare è l'operatore IN usato nella clausola WHERE della query esterna. Quando una sottoquery restituisce più righe, non si può usare l'operatore equal (=) come nel primo esempio. Si utilizza invece l'operatore IN, che funziona come l'operatore "appartiene a". In altre parole, la condizione:

department_id IN ( SELECT department_id
                         FROM   department
                         WHERE  building = ‘CentralPark’
                       )

restituisce VERO quando il valore di department_id esiste nell'insieme di risultati della sottoquery e FALSE quando il valore di department_id non è incluso nell'insieme di risultati della sottoquery.

Cercare sempre di identificare in anticipo il numero di record restituiti dalla subquery. Si tratta di una subquery con più record o di una subquery con un solo record? In base a ciò, si deve capire come collegarla alla query esterna. Per maggiori dettagli sulle subquery multirecord e single-record, consiglio vivamente di leggere gli articoli "Guida per principianti alla subquery SQL" e "Quali sono i diversi tipi di subquery SQL?".

Per chi vuole approfondire il tema delle subquery, un altro articolo interessante è "Subquery vs. JOIN", in cui si apprendono diversi modi per creare query SQL equivalenti utilizzando join e subquery.

Utilizzo delle subquery SQL in altre parti della query

Abbiamo mostrato esempi di subquery nella clausola WHERE dell'istruzione SELECT. In questa sezione mostriamo le subquery in altre clausole.

La clausola FROM è quella in cui di solito si specifica la tabella da leggere nella query. Tuttavia, è possibile inserire una sottoquery nella clausola FROM per creare una sorta di insieme di risultati intermedi. Successivamente, questo insieme di risultati può essere utilizzato come una tabella virtuale dalla query esterna.

Vediamo un esempio. Supponiamo di avere dei reparti in cui lo stipendio totale di tutti i dipendenti supera il budget del reparto. Per individuare questi casi, vogliamo ottenere il budget e l'importo totale degli stipendi pagati da ciascun reparto. Aggiungiamo al report anche un'espressione matematica per ottenere la parte non utilizzata del budget. Vediamo la query:

SELECT 	d1.dept_name,
d1.budget,
total.total_salaries,
d1.budget - total.total_salaries AS budget_after_salaries
FROM		( SELECT department_id, SUM(salary) AS total_salaries
		  FROM employee
		 GROUP BY department_id
		) AS total
INNER JOIN    department d1 ON d1.department_id = total.department_id

La subquery in blu nella clausola FROM crea una tabella intermedia denominata total con le colonne department_id e total_salaries. Dopodiché, si esegue un JOIN collegamento tra la tabella intermedia total e la tabella regolare department. Nell'elenco delle colonne di SELECT, calcoliamo la differenza tra il budget del reparto e l'importo totale dello stipendio. Chiamiamo questo valore budget_after_salaries. Vediamo il risultato della query:

dept_namebudgettotal_salariesbudget_after_salaries
Sales240000340000-100000
Accounting28000020700073000
IT2490002500001000

Si possono inserire sottoquery anche in altre clausole dell'istruzione SELECT, come la clausola HAVING utilizzata per filtrare gruppi di record. Supponiamo di voler mostrare i reparti il cui totale degli stipendi è superiore alla media dei totali dei reparti. Otteniamo la media dei totali dei reparti con una sottoquery. Vediamo la query:

SELECT 	d1.dept_name,
SUM(salary)
FROM		employee e
INNER JOIN  department d1 ON d1.department_id = e.department_id
GROUP BY  d1.dept_name
HAVING SUM(salary) > (
SELECT SUM(salary)/COUNT(distinct department_id)
FROM   employee
   )

Otteniamo il totale degli stipendi di ogni reparto con l'espressione SUM(salary). Poi, nella clausola HAVING, confrontiamo questo importo con il totale medio dei reparti ottenuto nella sottoquery. I reparti il cui SUM(salary) è maggiore del risultato della sottoquery vengono mostrati nel risultato della query, come si vede qui sotto:

dept_nametotal_salaries
Sales340000

Per coloro che desiderano sapere dove è supportata la subquery in SQL, i prossimi due articoli spiegano altri luoghi in cui le subquery possono essere collocate. L'articolo "Subquery vs. CTE: un primo SQL" spiega le CTE, mentre nell'articolo "Come usare le subquery nelle dichiarazioni INSERT, UPDATE e DELETE", come dice il titolo, si imparano le subquery SQL in altre dichiarazioni come INSERT, UPDATE, e DELETE.

Esercitarsi con le subquery SQL per migliorare le proprie capacità

Abbiamo visto diverse subquery SQL in diverse clausole. Le subquery SQL sono solitamente utilizzate in un'istruzione SELECT; tuttavia, è possibile utilizzarle in altre istruzioni. Inoltre, esistono altri tipi di subquery SQL, come le subquery correlate e le CTE, che aggiungono ulteriore espressività al linguaggio SQL.

L'apprendimento di SQL è facile e intuitivo, soprattutto nei primi passi. Tuttavia, come per qualsiasi altro linguaggio, è necessario fare pratica per raggiungere un livello tale da poter gestire e creare ogni tipo di query e report. Più tempo si passa a risolvere problemi con il linguaggio SQL, maggiori saranno le competenze SQL acquisite.

Vorrei concludere con alcune ottime risorse per l'apprendimento dell'SQL. In primo luogo, ecco un paio di articoli che si concentrano sulla pratica dell'SQL: "Di quanto Pratica su SQL hai bisogno per diventare un professionista?" e "Perché Esercizi SQL è il mio corso online preferito?" In entrambi gli articoli si trovano molti suggerimenti e consigli per esercitarsi con l'SQL e raggiungere il livello di SQL master. In secondo luogo, si possono trovare diversi modi per esercitarsi con SQL in LearnSQL.it's Pratica Mensile su SQL in 2022. Infine, l'articolo "5 Tips for You From a Senior SQL Data Analyst" descrive come diventare analista di dati, una professione che richiede una solida conoscenza di SQL.

Migliorate le vostre competenze e investite su voi stessi!