Le subquery con ANY

Stai visualizzando una vecchia versione di questo article. Visualizza la versione più recente.

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 |
+------+

Reading this query, the results may be counter-intuitive. It may seem to read as "SELECT * FROM sq1 WHERE num does not match any results in sq2. Since it does match 100, it could seem that the results are incorrect. However, the query returns a result if the match does not match any of sq2. Since 100 already does not match 40, the expression evaluates to true immediately, regardless of the 100's matching. It may be more easily readable to use SOME in a case such as this:

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.