Ora sei pronto per il prossimo step — lavorare con le query annidate in SQL. Oggi vediamo che cosa sono, perché servono, quali tipi di query annidate esistono e perché sono utili nella vita reale.
Le query annidate (o subquery) sono quelle query SQL che vengono usate dentro altre query SQL. Tipo una matrioska o una cipolla: c’è una query esterna e dentro c’è un’altra query, più piccola. La subquery viene eseguita per prima e il suo risultato viene usato dalla query esterna (a volte chiamata "principale").
Vediamo con un esempio:
Esempio 1: Come funziona
Abbiamo una tabella students con questi dati:
| id | nome | età | gruppo_id |
|---|---|---|---|
| 1 | Alisa | 20 | 1 |
| 2 | Bob | 22 | 2 |
| 3 | Klark | 21 | 1 |
| 4 | Dina | 23 | 3 |
| 5 | Emilia | 22 | 2 |
E anche una tabella groups, dove c’è info sui nomi dei gruppi:
| id | nome_gruppo |
|---|---|
| 1 | Classe matematica |
| 2 | Classe fisica |
| 3 | Classe letteraria |
Se vogliamo sapere i nomi dei gruppi dove studiano gli studenti, possiamo usare una query annidata:
SELECT nome_gruppo
FROM groups
WHERE id IN (
SELECT gruppo_id
FROM students
WHERE età > 21
);
Cosa succede qui?
La query annidata:
SELECT gruppo_id
FROM students
WHERE età > 21
Questa query prende gruppo_id di tutti gli studenti con più di 21 anni. Risultato: una lista di id dei gruppi, tipo [2, 3].
La query principale:
SELECT nome_gruppo
FROM groups
WHERE id IN ([risultati della subquery])
Questa query usa i risultati della subquery e restituisce i nomi dei gruppi con id uguale a 2 o 3.
Risultato:
Classe fisica
Classe letteraria
Ancora non è chiaro? Ci sta. Ma tranquillo, ora spieghiamo tutto.
Partiamo da un’idea semplice — il risultato di una query SELECT è una specie di tabella virtuale. Davvero, ha colonne e righe. Non è una tabella vera?
E se il risultato di una query è una tabella, puoi usarla dove usi le tabelle vere: nell’operatore JOIN, per esempio, o in costrutti più complessi.
Non ha un nome, ed è un problema. Ma anche le colonne-espressioni non hanno nomi, e risolviamo dando loro un alias — un soprannome. Si può fare lo stesso anche con le tabelle virtuali.
Ne parliamo meglio nelle prossime lezioni — niente spoiler :P
Perché sono utili le query annidate
Rendono più semplici i problemi complessi. A volte una tabella non ha tutte le info che vuoi. Le subquery ti permettono di dividere la query in due step: prima trovi un risultato intermedio, poi lo usi per ottenere i dati finali.
Lavorare con risultati intermedi. Le query annidate sono utili quando devi fare calcoli extra prima di lavorare sui dati. Tipo trovare il valore minimo o calcolare una somma.
Migliorano la leggibilità del codice. Le query annidate rendono il codice più ordinato, soprattutto se lavori con tabelle grandi e logica complessa.
Tipi principali di query annidate
Le query annidate si possono usare in varie parti di una query SQL. A seconda di dove le scrivi, si dividono in diversi tipi.
- Subquery in
SELECT. La subquery sta nella lista delle colonne e serve per calcolare valori. È comodo, per esempio, per aggiungere una nuova colonna ai risultati.
Esempio — aggiungiamo una colonna con l’età massima tra gli studenti:
SELECT nome, età,
(SELECT MAX(età) FROM students) AS età_massima
FROM students;
Risultato:
| nome | età | età_massima |
|---|---|---|
| Alisa | 20 | 23 |
| Bob | 22 | 23 |
| Klark | 21 | 23 |
| Dina | 23 | 23 |
| Emilia | 22 | 23 |
- Subquery in
FROM. La subquery viene usata come tabella temporanea. È utile se prima devi aggregare o trasformare i dati.
Esempio — calcolare l’età media degli studenti in ogni gruppo:
SELECT tmp.gruppo_id, tmp.età_media
FROM (
SELECT gruppo_id, AVG(età) AS età_media
FROM students
GROUP BY gruppo_id
) AS tmp -- Diamo l’alias tmp alla tabella temporanea
WHERE tmp.età_media > 21;
Risultato:
| gruppo_id | età_media |
|---|---|
| 2 | 22.0 |
| 3 | 23.0 |
- Subquery in
WHEREeHAVING. Le subquery possono essere una condizione che filtra le righe. Spesso si usano per controllare - l’esistenza di record o per confrontare valori.
Esempio — studenti che sono più grandi dell’età media:
SELECT nome, età
FROM students
WHERE età > (
SELECT AVG(età)
FROM students
);
Risultato:
| nome | età |
|---|---|
| Bob | 22 |
| Dina | 23 |
| Emilia | 22 |
Vantaggi delle query annidate
Più flessibilità: le query annidate ti permettono di lavorare con strutture dati più complesse.
Dividere i problemi in step: puoi dividere la logica in subquery, così il codice è più leggibile.
Accesso ai dati intermedi: puoi lavorare sui dati "al volo", senza dover creare tabelle temporanee nel database.
GO TO FULL VERSION