Le subquery con ALL
Le subquery che usano la parola chiave ALL restituiscono TRUE
se la comparazione restituisce TRUE
per tutte le righe restituite dalla subquery, o se la subquery non restituisce alcuna riga.
Sintassi
espressione_scalare operatore_comparazione ALL <subquery_tabella>
espressione_scalare
può essere una qualsiasi espressione che restituisce un solo valoreoperatore_comparazione
può essere uno dei seguenti operatori:=
,>
,<
,>=
,<=
,<>
e!=
ALL
restituisce TRUE
se la subquery_tabella restituisce zero righe o se l'operatore di comparazione restituisce TRUE
per ogni riga restituita da subquery_tabella. ALL
restituisce FALSE
se l'operatore di comparazione restituisce FALSE
per almeno una delle righe restituite da subquery_tabella.
NOT IN
è sinonimo di <> ALL
.
Esempi
CREATE TABLE sq1 (num TINYINT); CREATE TABLE sq2 (num2 TINYINT); INSERT INTO sq1 VALUES(100); INSERT INTO sq2 VALUES(40),(50),(60); SELECT * FROM sq1 WHERE num > ALL (SELECT * FROM sq2); +------+ | num | +------+ | 100 | +------+
Siccome 100
> 40
,50
e 60
, l'operazione risulta true e la riga viene restituita.
Aggiungiamo a sq1 una seconda riga, per la quale il confronto è false:
INSERT INTO sq1 VALUES(30); SELECT * FROM sq1 WHERE num > ALL (SELECT * FROM sq2); +------+ | num | +------+ | 100 | +------+
Aggiungiamo una nuova riga a sq2, facendo diventare false tutti i confronti:
INSERT INTO sq2 VALUES(120); SELECT * FROM sq1 WHERE num > ALL (SELECT * FROM sq2); Empty set (0.00 sec)
Quando la subquery non restituisce alcun risultato, il confronto è true:
SELECT * FROM sq1 WHERE num > ALL (SELECT * FROM sq2 WHERE num2 > 300); +------+ | num | +------+ | 100 | | 30 | +------+
Il confronto con NULL genera un risultato sconosciuto, non true, e pertanto non restituisce righe:
INSERT INTO sq2 VALUES (NULL); SELECT * FROM sq1 WHERE num > ALL (SELECT * FROM sq2);