Spec-Zone.ru › MySQL 9.2

15.2.15.4 Подзапросы с ALL

Синтаксис:

operand comparison_operator ALL (subquery)

Слово ALL, которое должно следовать за оператором сравнения, означает “вернуть TRUE, если сравнение является TRUE для ALL значений в столбце, который возвращает подзапрос.” Например:

SELECT s1 FROM t1 WHERE s1 > ALL (SELECT s1 FROM t2);

Предположим, что в таблице t1 есть строка, содержащая (10). Выражение является TRUE, если таблица t2 содержит (-5,0,+5), потому что 10 больше, чем все три значения в t2. Выражение является FALSE, если таблица t2 содержит (12,6,NULL,-100), потому что существует единственное значение 12 в таблице t2, которое больше, чем 10. Выражение является неизвестным (то есть, NULL), если таблица t2 содержит (0,NULL,1).

Наконец, выражение является TRUE, если таблица t2 пуста. Таким образом, следующее выражение является TRUE, когда таблица t2 пуста:

SELECT * FROM t1 WHERE 1 > ALL (SELECT s1 FROM t2);

Но это выражение является NULL, когда таблица t2 пуста:

SELECT * FROM t1 WHERE 1 > (SELECT s1 FROM t2);

Кроме того, следующее выражение является NULL, когда таблица t2 пуста:

SELECT * FROM t1 WHERE 1 > ALL (SELECT MAX(s1) FROM t2);

В общем, таблицы, содержащие NULL значения и пустые таблицы являются “крайними случаями.” При написании подзапросов всегда учитывайте, учли ли вы эти два варианта.

NOT IN — это псевдоним для <> ALL. Таким образом, эти два утверждения эквивалентны:

SELECT s1 FROM t1 WHERE s1 <> ALL (SELECT s1 FROM t2);
SELECT s1 FROM t1 WHERE s1 NOT IN (SELECT s1 FROM t2);

Как и в случае с IN, ANY и SOME, вы можете использовать TABLE с ALL и NOT IN при условии соблюдения следующих двух условий:

  • Таблица в подзапросе содержит только один столбец

  • Подзапрос не зависит от выражения столбца

Например, предполагая, что таблица t2 состоит из одного столбца, последние два показанных утверждения можно записать с помощью TABLE t2 следующим образом:

SELECT s1 FROM t1 WHERE s1 <> ALL (TABLE t2);
SELECT s1 FROM t1 WHERE s1 NOT IN (TABLE t2);

Такой запрос, как SELECT * FROM t1 WHERE 1 > ALL (SELECT MAX(s1) FROM t2);, не может быть записан с помощью TABLE t2, потому что подзапрос зависит от выражения столбца.

© 2025 Oracle
Licensed under the GPLv2 License.
https://docs.oracle.com/cd/E17952_01/mysql-8.4-en/all-subqueries.html

Spec-Zone.ru

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