13.2.10.2 Сравнения с использованием подзапросов
Наиболее распространённое использование подзапроса — в форме:
non_subquery_operand comparison_operator (subquery)
Где comparison_operator — один из этих операторов:
= > < >= <= <> != <=>
Например:
... WHERE 'a' = (SELECT column1 FROM t1)
MySQL также допускает такую конструкцию:
non_subquery_operand LIKE (subquery)
В своё время единственным допустимым местом для подзапроса была правая часть сравнения, и вы можете всё ещё встретить некоторые старые СУБД, которые настаивают на этом.
Вот пример сравнения с подзапросом в общепринятой форме, которое нельзя сделать с помощью соединения. Он находит все строки в таблице t1, для которых значение column1 равно максимальному значению в таблице t2:
SELECT * FROM t1
WHERE column1 = (SELECT MAX(column2) FROM t2);
Вот ещё один пример, который также невозможно сделать с помощью соединения, потому что он включает агрегацию для одной из таблиц. Он находит все строки в таблице t1, содержащие значение, встречающееся дважды в заданном столбце:
SELECT * FROM t1 AS t
WHERE 2 = (SELECT COUNT(*) FROM t1 WHERE t1.id = t.id);
Для сравнения подзапроса со скаляром подзапрос должен возвращать скаляр. Для сравнения подзапроса со строковым конструктором подзапрос должен быть строковым подзапросом, возвращающим строку с тем же количеством значений, что и строковый конструктор. См. Раздел 13.2.10.5, «Строковые подзапросы».
© 2025 Oracle
Licensed under the GPLv2 License.