Результаты подзапросов можно использовать в WHERE
и в HAVING
.
Работает это следующим образом:
select
column1,
column2
from
table1
where column1 in (select column3 from table2)
Подзапросы нужны в WHERE
, когда мы хотим создать динамическое условие, то есть, в подзапросе собирается результат, который может меняться, и мы фильтруемся по этому результату.
Важный момент, который мы должны учитывать, чтобы правильно использовать подзапросы в условии WHERE
: в подзапросе SELECT
мы выбираем тот объем информации, который подходит под операторов или условии.
Допустим, мы хотим, чтобы column1
входила в результат подзапроса. Это значит, что результатом подзапроса может быть колонка (набор значений) или одно значение:
select
column1,
column2
from
table1
where column1 in (select column3 from table2)
А если мы, например, хотим, чтобы column1
была больше, чем результат подзапроса, значит, результат подзапроса не должен превышать одно значение:
select
column1,
column2
from
table1
where column1 > (select column3 from table2 limit 1)
Тут LIMIT
предемонстрирован для подчеркивания, что в этом случае нам нужно одно значение, в реальности его не всегда есть смысл писать. На практике одно значение гарантированно можно получать через агрегацию (MAX, MIN, AVG
и т.д.) или через уникальное условие WHERE
.
Если резюмировать, подзапрос должен возвращать одно значение, если мы проводим сравнение, т множество, если мы фильтруем по вхождению.