Подзапросы и 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 | +------+
© 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/