Подзапросы, выполняющие проверку на существование

Когда подзапрос начинается с оператора EXISTS или NOT EXISTS, этот подзапрос функционирует как "тест на существование". Оператор EXISTS в предложении WHERE выполняет проверку на существование (или несуществование) данных, которые удовлетворяют критериям подщапроса.

Результат обработки подобных подзапросов представляет собой логическое значение TRUE или FALSE. Для оператора EXISTS результат равен TRUE в том и только в том случае, если в возвращаемом подзапросом наборе записей присутствует хотя бы одна строка. Оператор NOT EXISTS в этом случае вернет значение FALSE. Если в результате выполнения подзапроса получена пустая таблица, оператор EXISTS вернет FALSE, а оператор NOT EXISTS – TRUE.

IDevice IconПример
Получить список клиентов, которые заключали договора в 2006 году.

SQL:
SELECT lastname, name
FROM tbl_clients WHERE EXISTS (
SELECT * FROM tbl_contract
WHERE tbl_clients.client_id=tbl_contract.client_id AND YEAR(contract_date)=2006)

В ходе выполнения запроса будет выбрана первая запись в таблице tbl_clients ( код клиента 2).

Проходит ли эта запись тест на существование? Другими словами, есть ли какие-то строки в таблице tbl_contract, в которых client_id равен 2, a номер года в дате, содержащейся в поле contract_date равно 2007? Если есть, то запись помещается в таблицу результатов. Тот же процесс повторяется для каждой записи таблицы tbl_clients.

Чтобы получить список клиентов, которые не заключали договора в 2006 году.

SQL:
SELECT lastname, name
FROM tbl_clients WHERE NOT EXISTS (
SELECT * FROM tbl_contract
WHERE tbl_clients.client_id=tbl_contract.client_id AND year(contract_date)=2006)


Обратите внимание, что синтаксис подзапросов, начинающихся с EXISTS (NOT EXISTS), отличается от синтаксиса других подзапросов в следующих отношениях:
  • оператору EXISTS(NOT EXISTS) не предшествует имя столбца, константа или какое-то другое выражение;
  • список выбора подзапроса, начинающегося с EXISTS (NOT EXISTS), почти всегда состоит из "звездочки" (*). Нет никакого смысла вводить имена столбцов, поскольку вы лишь выполняете тест на существование строк, которые удовлетворяют условиям подзапроса, а они указываются в предложении WHERE.