Salta ai contenuti

Subquery

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:

  1. trova gli ordini sopra 100 euro
  2. trova i clienti collegati a quegli ordini

In SQL diventa:

SELECT nome
FROM clienti
WHERE id IN (
SELECT cliente_id
FROM ordini
WHERE totale > 100
);

La query interna è questa:

SELECT cliente_id
FROM ordini
WHERE totale > 100

Produce una lista di id cliente. La query esterna usa quella lista per trovare i nomi nella tabella clienti.

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.

Quando la query interna restituisce più valori, spesso usi IN.

SELECT nome
FROM clienti
WHERE id IN (
SELECT cliente_id
FROM ordini
);

Qui stai dicendo:

“Mostrami i clienti il cui id compare nella lista dei cliente_id presenti negli ordini.”

A volte la query interna restituisce un valore solo.

Per esempio, questa query trova i prodotti che costano più della media:

SELECT nome, prezzo
FROM prodotti
WHERE 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.

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.

  • Una subquery è una query dentro un’altra query.
  • Serve quando una domanda ha bisogno di un passaggio intermedio.
  • Con IN confronti un valore con una lista.
  • Con operatori come >, < o = confronti con un singolo valore.
  • Se la query diventa troppo annidata, valuta una CTE.