Подзапросы и ALL
Подзапросы с использованием ключевого слова ALL вернут true если сравнение возвращает true для каждой строки, возвращённой подзапросом, или если подзапрос не возвращает ни одной строки.
Синтаксис
scalar_expression comparison_operator ALL <Table subquery>
-
scalar_expressionможет быть любым выражением, оценивающимся в единственное значение -
comparison_operatorможет быть одним из:=,>,<,>=,<=,<>или!=
ALL возвращает:
-
NULLесли оператор сравнения возвращаетNULLпо крайней мере для одной строки, возвращенной подзапросом таблицы, или скалярное выражение возвращаетNULL. -
FALSEесли оператор сравнения возвращаетFALSEпо крайней мере для одной строки, возвращенной подзапросом таблицы. -
TRUEесли оператор сравнения возвращаетTRUEдля всех строк, возвращенных подзапросом таблицы, или если подзапрос таблицы не возвращает ни одной строки.
NOT IN является псевдонимом для <> ALL.
Примеры
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 | +------+
Поскольку 100 > всех 40, 50 и 60, вычисление истинно, и строка возвращается
Добавление второй строки в sq1, где вычисление для этой записи ложно:
INSERT INTO sq1 VALUES(30); SELECT * FROM sq1 WHERE num > ALL (SELECT * FROM sq2); +------+ | num | +------+ | 100 | +------+
Добавление новой строки в sq2, что приводит к ложности всех вычислений:
INSERT INTO sq2 VALUES(120); SELECT * FROM sq1 WHERE num > ALL (SELECT * FROM sq2); Empty set (0.00 sec)
Когда подзапрос не возвращает результатов, вычисление по-прежнему истинно:
SELECT * FROM sq1 WHERE num > ALL (SELECT * FROM sq2 WHERE num2 > 300); +------+ | num | +------+ | 100 | | 30 | +------+
Вычисление по отношению к NULL приведет к результату, неизвестному или не истинному, и, следовательно, не вернет ни одной строки:
INSERT INTO sq2 VALUES (NULL); SELECT * FROM sq1 WHERE num > ALL (SELECT * FROM sq2);
© 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-all/