Subquery
Una query dentro un’altra
Sezione intitolata “Una query dentro un’altra”Una subquery è una query scritta dentro un’altra query.
Serve quando la risposta finale dipende da un passaggio intermedio: prima calcoli un risultato, poi lo usi nella query principale.
Immagina di voler trovare i clienti che hanno fatto almeno un ordine sopra 100 euro. Puoi pensarla in due passi:
- trova gli ordini sopra 100 euro
- trova i clienti collegati a quegli ordini
In SQL diventa:
SELECT nomeFROM clientiWHERE id IN ( SELECT cliente_id FROM ordini WHERE totale > 100);La query interna è questa:
SELECT cliente_idFROM ordiniWHERE totale > 100Produce una lista di id cliente. La query esterna usa quella lista per trovare i nomi nella tabella clienti.
Perché usare una subquery
Sezione intitolata “Perché usare una subquery”Una subquery è utile quando il problema si legge naturalmente a tappe.
Per esempio:
- trova i prodotti più costosi della media
- mostra i clienti che hanno fatto ordini
- cerca gli studenti iscritti a un certo corso
In tutti questi casi, una parte della query prepara il risultato per l’altra.
Subquery con una lista
Sezione intitolata “Subquery con una lista”Quando la query interna restituisce più valori, puoi usare IN.
SELECT nomeFROM clientiWHERE id IN ( SELECT cliente_id FROM ordini);Qui stai dicendo:
“Mostrami i clienti il cui id compare nella lista dei
cliente_idpresenti negli ordini.”
Subquery con un solo valore
Sezione intitolata “Subquery con un solo valore”A volte la query interna restituisce un valore solo.
Per esempio, questa query trova i prodotti che costano più della media:
SELECT nome, prezzoFROM prodottiWHERE prezzo > ( SELECT AVG(prezzo) FROM prodotti);La query interna calcola la media dei prezzi. La query esterna mostra solo i prodotti con prezzo superiore a quella media.
Qui non usi IN, perché non stai confrontando con una lista. Stai confrontando con un solo numero.
Quando preferire una CTE
Sezione intitolata “Quando preferire una CTE”Le subquery sono comode, ma possono diventare difficili da leggere quando si annidano troppo.
Se le subquery sono troppo annidate, una CTE con WITH può rendere la query più leggibile. La trovi nella pagina dedicata.
Riepilogo rapido
Sezione intitolata “Riepilogo rapido”- Una subquery è una query dentro un’altra query.
- Serve quando una domanda ha bisogno di un passaggio intermedio.
- Con
INconfronti un valore con una lista. - Con operatori come
>,<o=confronti con un singolo valore. - Se la query diventa troppo annidata, valuta una CTE.