Una sottoquery è un'istruzione SELECT annidata all'interno di select, SELECT... IN, INSERISCI... ISTRUZIONE INTO, DELETE o UPDATE o all'interno di un'altra sottoquery.
Sintassi
È possibile usare tre forme di sintassi per creare una sottoquery:
confronto [ANY | ALL | SOME] (istruzione sql)
espressione [NOT] IN (istruzione sql)
[NON] EXISTS (istruzione sql)
Una sottoquery è composta da queste parti:
Parte |
Descrizione |
Confronto |
Un espressione e un operatore di confronto che confronta l'espressione con i risultati della sottoquery. |
espressione |
Espressione per cui viene eseguita la ricerca nel set di risultati della sottoquery. |
istruzionesql |
Un'istruzione SELECT, che segue lo stesso formato e le stesse regole di qualsiasi altra istruzione SELECT. Deve essere racchiuso tra parentesi. |
Note
È possibile usare una sottoquery invece di un'espressione nell'elenco dei campi di un'istruzione SELECT o in una clausola WHERE o HAVING. In una sottoquery si usa un'istruzione SELECT per fornire un set di uno o più valori specifici da valutare nell'espressione della clausola WHERE o HAVING.
Usare il predicato ANY o SOME, sinonimo, per recuperare record nella query principale che soddisfano il confronto con tutti i record recuperati nella sottoquery. L'esempio seguente restituisce tutti i prodotti il cui prezzo unitario è maggiore di quello di qualsiasi prodotto venduto con uno sconto del 25% o più:
SELECT * FROM Products WHERE UnitPrice > ANY (SELECT UnitPrice FROM OrderDetails WHERE Discount >= .25);
Usare il predicato ALL per recuperare solo i record della query principale che soddisfano il confronto con tutti i record recuperati nella sottoquery. Se nell'esempio precedente è stato eseguita la modifica di QUALSIASI in TUTTI, la query restituirà solo i prodotti il cui prezzo unitario è maggiore di quello di tutti i prodotti venduti con uno sconto del 25% o più. Questo è molto più restrittivo.
Usare il predicato IN per recuperare solo i record nella query principale per cui alcuni record nella sottoquery contengono un valore uguale. L'esempio seguente restituisce tutti i prodotti con uno sconto del 25% o più:
SELECT * FROM Products WHERE ProductID IN (SELECT ProductID FROM OrderDetails WHERE Discount >= .25);
Al contrario, è possibile usare NOT IN per recuperare solo i record nella query principale per cui nessun record nella sottoquery contiene un valore uguale.
Usare il predicato EXISTS (con la parola riservata NOT facoltativa) nei confronti vero/falso per determinare se la sottoquery restituisce record.
È anche possibile usare gli alias dei nomi di tabella in una sottoquery per fare riferimento alle tabelle elencate in una clausola FROM all'esterno della sottoquery. L'esempio seguente restituisce i nomi dei dipendenti i cui stipendi sono uguali o maggiori dello stipendio medio di tutti i dipendenti con la stessa posizione lavorativa. Alla tabella Dipendenti viene assegnato l'alias "T1":
SELECT LastName, FirstName, Title, Salary FROM Employees AS T1 WHERE Salary >= (SELECT Avg(Salary) FROM Employees WHERE T1.Title = Employees.Title) Order by Title;
Nell'esempio precedente la parola riservata AS è facoltativa.
Alcune sottoquery sono consentite nelle query a campi incrociati, in particolare come predicati (quelle della clausola WHERE). Le sottoquery come output (quelle nell'elenco SELECT) non sono consentite nelle query a campi incrociati.