Subquery
Una domanda dentro un’altra domanda
Sezione intitolata “Una domanda dentro un’altra domanda”Una subquery è una query scritta dentro un’altra query.
Ti serve quando la risposta finale dipende da un passaggio intermedio. Prima trovi qualcosa. Poi usi quel risultato per fare la domanda 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, spesso usi 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 senti che la query sta diventando una matrioska, spesso una CTE con WITH è più chiara. Le vediamo 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.