Spec-Zone.ru › MariaDB

Подзапросы и ANY

Подзапросы с использованием ключевого слова ANY вернут true , если сравнение вернет true хотя бы для одной строки, возвращаемой подзапросом.

Синтаксис

Требуемый синтаксис для ANY или SOME квантифицированного сравнения:

scalar_expression comparison_operator ANY <Table subquery>

Или:

scalar_expression comparison_operator SOME <Table subquery>
  • scalar_expression может быть любым выражением, результатом которого является одно значение.
  • comparison_operator может быть любым из =, >, <, >=, <=, <> или !=.

ANY возвращает:

  • TRUE , если оператор сравнения вернет TRUE для хотя бы одной строки, возвращаемой подзапросом таблицы.
  • FALSE , если оператор сравнения вернет FALSE для всех строк, возвращаемых подзапросом таблицы, или подзапрос таблицы не возвращает строк.
  • NULL , если оператор сравнения вернет NULL для хотя бы одной строки, возвращаемой подзапросом таблицы, и не вернёт TRUE ни для одной из них, или если скалярное выражение возвращает NULL.

SOME является синонимом ANY, а IN — синонимом = ANY.

Примеры

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 больше двух из трёх значений, и поэтому выражение вычисляется как истинное.

SOME является синонимом ANY:

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

IN является синонимом = ANY, и здесь нет совпадений, поэтому результаты не возвращаются:

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

Читая этот запрос, результаты могут быть не интуитивными. Может показаться, что он читается как "ВЫБЕРИТЕ * ИЗ sq1 ГДЕ num не соответствует никаким результатам в sq2. Поскольку он соответствует 100, может показаться, что результаты неверны. Однако запрос возвращает результат, если соответствие не соответствует ни одному из sq2. Поскольку 100 уже не соответствует 40, выражение вычисляется как истинное немедленно, независимо от совпадения 100. Его можно сделать более читабельным, используя SOME в таком случае:

SELECT * FROM sq1 WHERE num <> SOME (SELECT * FROM sq2);
+------+
| num  |
+------+
|  100 |
+------+
Содержимое, воспроизведенное на этом сайте, является собственностью соответствующих владельцев, и это содержание не проходит предварительную проверку в MariaDB. Мнения, информация и мнения, выраженные в этом содержании, не обязательно отражают точку зрения MariaDB или любой другой стороны.

© 2023 MariaDB
Licensed under the Creative Commons Attribution 3.0 Unported License and the GNU Free Documentation License.
https://mariadb.com/kb/en/subqueries-and-any/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API