Le subquery con ANY

Le subquery che usano la parola chiave ANY restituiscono TRUE se la comparazione restituisce TRUE per almeno una delle righe restituite dalla subquery.

Sintassi

La sintassi per la comparazione quantitativa ANY o SOME è la seguente:

espressione_scalare operatore_comparazione ANY <subquery_tabella>

Oppure:

espressione_scalare operatore_comparazione SOME <subquery_tabella>
  • espressione_scalare può essere una qualsiasi espressione che genera un singolo valore.
  • operatore_comparazione può essere uno dei seguenti oepratori: =, >, <, >=, <=, <> o !=.

Questi restituiscono TRUE se l'operazione di comparazione restituisce TRUE per almeno una delle righe restituite da subquery_tabella. Restituiscono FALSE se subquery_tabella restituisce zero righe o se l'operazione di comparazione restituisce FALSE per tutte le righe restituite da subquery_tabella.

SOME è sinonimo di ANY, e IN è sinonimo di = ANY

Esempi

CREATE TABLE sq1 (num TINYINT);

CREATE TABLE sq2 (num2 TINYINT);

INSERT INTO sq1 VALUES(100);

INSERT INTO sq2 VALUES(40),(50),(120);

SELECT * FROM sq1 WHERE num > ANY (SELECT * FROM sq2);
+------+
| num  |
+------+
|  100 |
+------+

100 è maggiore di due dei tre valori, perciò l'espressione è true.

SOME è sinonimo di ANY:

SELECT * FROM sq1 WHERE num < SOME (SELECT * FROM sq2);
+------+
| num  |
+------+
|  100 |
+------+

IN è sinonimo di = ANY, perciò non vi sono corrispondenze e non viene restituita alcuna riga:

SELECT * FROM sq1 WHERE num IN (SELECT * FROM sq2);
Empty set (0.00 sec)
INSERT INTO sq2 VALUES(100);
Query OK, 1 row affected (0.05 sec)

SELECT * FROM sq1 WHERE num <> ANY (SELECT * FROM sq2);
+------+
| num  |
+------+
|  100 |
+------+

Leggendo questa query, il risultato può non essere intuitivo. Potrebbe sembrare come "SELECT * FROM sq1 WHERE num does not match any results in sq2". Siccome non corrisponde a 100, potrebbe sembrare che il risultato non sia corretto. Invece la query restituisce un risultato se il valore non corrisponde a una qualsiasi riga di sq2. Siccome 100 non corrisponde a 40, l'espressione restituisce immediatamente true, indipendentemente dal fatto che 100 corrisponde. In questi casi può essere più intuitivo utilizzare SOME:

SELECT * FROM sq1 WHERE num <> SOME (SELECT * FROM sq2);
+------+
| num  |
+------+
|  100 |
+------+

Commenti

Sto caricando i commenti......
Content reproduced on this site is the property of its respective owners, and this content is not reviewed in advance by MariaDB. The views, information and opinions expressed by this content do not necessarily represent those of MariaDB or any other party.