Homepage -> Guida MySQL

Le subquery


Una subquery non è altro che una SELECT all'interno di un'altra istruzione. Le subquery possono essere nidificate a qualsiasi livello.
A differenza delle SELECT, che restituiscono una tabella formata da righe e colonne, le subquery possono restituire un valore singolo (scalare), una singola riga, una singola colonna, oppure una normale tabella.


La subquery come operando scalare

Il caso più semplice di subquery è quella che restituisce un singolo valore. La si può usare al posto di qualsiasi valore:


SELECT colonna1 FROM nome_tabella1
WHERE colonna1 = (SELECT MAX(colonna2) FROM nome_tabella2);


Questa query estrae i valori di colonna1 nella tabella nome_tabella1 che sono uguali al valore massimo di colonna2 nella tabella nome_tabella2.


Subquery che restituiscono colonne

Quando una subquery restituisce una colonna, può essere usata per fare confronti attraverso gli operatori ANY, SOME, IN e ALL:


SELECT s1 FROM nome_tabella1 WHERE s1 > ANY (SELECT s1 FROM nome_tabella2);


Questa query seleziona da nome_tabella1 i valori di s1 che sono maggiori di almeno 1 dei valori di s1 su nome_tabella2.


Subquery che restituiscono righe

Quando una subquery restituisce una singola riga, può essere usata per fare confronti attraverso i costruttori di righe:


SELECT colonna1,colonna2 FROM nome_tabella1
WHERE (colonna1,colonna2) IN (SELECT colonna1,colonna2 FROM nome_tabella2);


Questa query estrae le righe di nome_tabella1 in cui i valori di colonna1 e colonna2 sono ripetuti in una riga di nome_tabella2. L'espressione "(colonna1,colonna2)" è, appunto, un costruttore di riga.


Subquery correlate

Le subquery correlate sono quelle che contengono un riferimento ad una tabella che fa parte della query esterna:


SELECT * FROM nome_tabella1 WHERE colonna1 = ANY
(SELECT colonna1 FROM nome_tabella2 WHERE nome_tabella2.colonna2 = nome_tabella1.colonna2);


In questa subquery, la clausola WHERE contiene un riferimento alla tabella nome_tabella1, che tuttavia non è nominata nella clausola FROM della subquery stessa: la troviamo infatti nella FROM della query esterna.


Subquery nella FROM

E' possibile utilizzare una subquery anche nella clausola FROM, con questa sintassi:


SELECT ... FROM (subquery) AS nome ...


Notate che è obbligatorio assegnare un nome alla subquery, per poterla referenziare nelle altre parte della query.