13.2.10.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 — нет. См. Раздел 12.4.2, «Функции и операторы сравнения».
NOT IN не является псевдонимом для <>
ANY, а для <> ALL. См. Раздел 13.2.10.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 помогает гарантировать, что все понимают истинное значение запроса.
© 2025 Oracle
Licensed under the GPLv2 License.