Skip to content

Exists. Наличие строк в подзапросе

Оператор EXISTS имеет вид EXISTS(подзапрос), и возвращает истинное значение в том случае, если подзапрос в скобках возвращает хотя бы одну строку. Может использоваться с оператором NOT.

Примеры будем разбирать на данных из части про подзапросы.

Пример №1: Получить список книг, которые заказывались хотя бы раз.

Очевидно что ответом будут те книги, ссылки на которые есть в таблице book_orders. Нас устроит любая книга, которая имеет хотя бы один заказ, и поэтому задача легко решается с использованием EXISTS:

sql
select *
from books b
where exists(
    select null
    from book_orders bo where bo.book_id = b.book_id
)
select *
from books b
where exists(
    select null
    from book_orders bo where bo.book_id = b.book_id
)
BOOK_IDBOOK_NAMEAUTHORRELEASE_YEAR
1Властелин колецТолкин1954
2Гордость и предубеждениеДжейн Остин1813
3Тёмные началаФилип Пулман1995

Здесь использовался коррелированный подзапрос, который проверяет наличие данных в таблице с заказами. Подзапрос может быть любым, и он не обязан быть коррелированным. Все, что проверяет EXISTS — это то, вернул ли подзапрос какие-либо данные, или нет.

Следует обратить внимание на то, что мы не указываем наименования колонок в подзапросе, так как сами данные нам не интересны — нас интересует лишь факт наличия данных, которые возвращает подзапрос.

Следующий запрос идентичен предыдущему:

sql
select *
from books b
where exists(
    select bo.book_id, bo.quantity
    from book_orders bo where bo.book_id = b.book_id
)
select *
from books b
where exists(
    select bo.book_id, bo.quantity
    from book_orders bo where bo.book_id = b.book_id
)

Только здесь нет смысла в получении колонок book_id и quantity, так как они никак не будут использованы.

Пример №2: Получить список книг, которые ни разу не покупали.

Решение здесь прямо обратное предыдущему — нас интересуют такие книги, на которы из таблицы с заказами нет ссылок:

sql
select *
from books b
where not exists(
    select null
    from book_orders bo where bo.book_id = b.book_id
)
select *
from books b
where not exists(
    select null
    from book_orders bo where bo.book_id = b.book_id
)
BOOK_IDBOOK_NAMEAUTHORRELEASE_YEAR
4Автостопом по галактикеДуглас Адамс1979