Spec-Zone.ru › MySQL 8.4

15.2.15.3 Подзапросы с ANY, IN или SOME

Синтаксис:

operand comparison_operator ANY (subquery)
operand IN (subquery)
operand comparison_operator SOME (subquery)

Где comparison_operator — один из этих операторов:

=  >  <  >=  <=  <>  !=

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

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

Предположим, что в таблице t1 есть строка, содержащая (10). Выражение равно TRUE, если таблица t2 содержит (21,14,7), потому что существует значение 7 в t2, которое меньше 10. Выражение равно FALSE, если таблица t2 содержит (20,10) или если таблица t2 пуста. Выражение равно неизвестно (то есть NULL), если таблица t2 содержит (NULL,NULL,NULL).

При использовании с подзапросом слово IN является псевдонимом для = ANY. Таким образом, эти два утверждения одинаковы:

SELECT s1 FROM t1 WHERE s1 = ANY (SELECT s1 FROM t2);
SELECT s1 FROM t1 WHERE s1 IN    (SELECT s1 FROM t2);

IN и = ANY не являются синонимами при использовании со списком выражений. IN может принимать список выражений, но = ANY не может. См. Раздел 14.4.2, «Функции и операторы сравнения».

NOT IN не является псевдонимом для <> ANY, а для <> ALL. См. Раздел 15.2.15.4, «Подзапросы с ALL».

Слово SOME является псевдонимом для ANY. Таким образом, эти два утверждения одинаковы:

SELECT s1 FROM t1 WHERE s1 <> ANY  (SELECT s1 FROM t2);
SELECT s1 FROM t1 WHERE s1 <> SOME (SELECT s1 FROM t2);

Использование слова SOME встречается редко, но этот пример показывает, почему оно может быть полезным. Для большинства людей английская фраза «“a не равно любому b” означает «“нет такого b, которое равно a”, но это не то, что подразумевается синтаксисом SQL. Синтаксис означает «“существует какое-то b, для которого a не равно.” Использование <> SOME помогает убедиться, что все понимают истинный смысл запроса.

Вы можете использовать TABLE в скалярном IN, ANY или SOME подзапросе, при условии, что таблица содержит только один столбец. Если t2 содержит только один столбец, показанные ранее в этом разделе утверждения могут быть записаны так, в каждом случае заменяя TABLE t2 на SELECT s1 FROM t2:

SELECT s1 FROM t1 WHERE s1 > ANY (TABLE t2);

SELECT s1 FROM t1 WHERE s1 = ANY (TABLE t2);

SELECT s1 FROM t1 WHERE s1 IN (TABLE t2);

SELECT s1 FROM t1 WHERE s1 <> ANY  (TABLE t2);

SELECT s1 FROM t1 WHERE s1 <> SOME (TABLE t2);

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

Spec-Zone.ru

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