SQL

ALL, ANY, EXISTS

by Andrea Spera

I comandi ALL, ANY e EXISTS in SQL vengono utilizzati per eseguire confronti complessi all'interno delle query. ALL verifica se una condizione è vera per tutti i valori di un sottoinsieme, ANY controlla se una condizione è vera per almeno uno di essi, mentre EXISTS valuta se un sottoinsieme restituisce risultati.
Qui sotto, le tabelle per gli esempi.
Ordini
ID NrOrdine DataOrdine IdVenditore Valore
1 1010 05/10/2018 3 € 150,00
2 1011 05/10/2018 2 € 1.111,00
3 1012 13/10/2018 4 € 1.321,00
4 1013 15/10/2018 3 € 321,00
5 1014 15/10/2018 4 € 900,00
6 1015 11/02/2018 2 € 1.888,00
7 1016 11/10/2018 3 € 120,00
8 1017 11/10/2018 3 € 970,00
Venditori
ID Nome Cognome IdFiliale
1 Paolo Rossi 1
2 Marco Bianchi 2
3 Marta Verdi 1
4 Marco Bello 3
Esempi di utilizzo di ALL e ANY
Codice
SELECT DISTINCT V.Nome, V.Cognome
FROM Venditori AS V
INNER JOIN Ordini AS O
ON V.ID=O.IdVenditore
WHERE O.IdVenditore<>ALL
(
SELECT O2.IdVenditore
FROM Ordini AS O2
WHERE O2.Valore<1000
);
Risultato della query
Nome Cognome
Marco Bianchi
  • La subquery lista gli ID dei venditori relativi agli ordini con valore inferiore a 1.000.
  • La condizione WHERE IdVenditore <> ALL assicura che l'ID non sia presente in tale lista.
  • Il risultato finale è che vengono restituiti solo i venditori dei quali tutti gli ordini siano superiori o uguali a 1.000. In questo caso Marco Bianchi.
Codice
SELECT DISTINCT V.Nome, V.Cognome
FROM Venditori AS V
INNER JOIN Ordini AS O
ON V.ID=O.IdVenditore
WHERE O.IdVenditore=ANY
(
SELECT O2.IdVenditore
FROM Ordini AS O2
WHERE O2.Valore>1000
);
Risultato della query
Nome Cognome
Marco Bianchi
Marco Bello
  • La subquery lista gli ID dei venditori relativi agli ordini con valore superiore di 1.000.
  • La condizione WHERE IdVenditore = ANY controlla che l'ID sia presente almeno una volta in tale lista.
  • Il risultato finale è che vengono restituiti tutti i venditori dei quali almeno un ordine sia superiore di 1.000. In questo caso, oltre a Marco Bianchi, anche Marco Bello.
Esempi di utilizzo di EXISTS
Codice
SELECT V.Nome, V.Cognome
FROM Venditori AS V
WHERE EXISTS
(
SELECT O.ID
FROM Ordini AS O
WHERE V.ID=O.IdVenditore AND O.Valore>1000
);
Risultato della query
Nome Cognome
Marco Bianchi
Marco Bello