CodeGym /Corsi /SQL SELF /Che cosa sono le query annidate e perché servono?

Che cosa sono le query annidate e perché servono?

SQL SELF
Livello 13 , Lezione 0
Disponibile

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

  1. 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.

  2. 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.

  3. 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.

  1. 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
  1. 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
  1. Subquery in WHERE e HAVING. Le subquery possono essere una condizione che filtra le righe. Spesso si usano per controllare
  2. 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.

Commenti
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION