Оператор EXISTS
SELECT …
WHERE [NOT] EXISTS (подзапрос)
Параметры и ключевые слова следующие
WHERE [NOT] EXISTS
Подзапрос проверяется на наличие одной или нескольких строк. Если хотя бы одна строка удовлетворяет запросу, то возвращается булево значение ИСТИНА. При указании дополнительного ключевого слова NOT булево значение ИСТИНА возвращается, если подзапрос не возвращает соответствующих ему строк.
подзапрос
На основе полностью сформированного подзапроса извлекается результирующий набор данных.
Оператор EXISTS проверяет существование одной или нескольких строк в подзапросе родительского запроса.
SELECT *
FROM jobs
WHERE NOT EXISTS
(SELECT *
FROM employee
WHERE jobs.job_id=employye. job_id
);
В этом примере проверяется в подзапросе записей с помощью дополнительного ключевого слова NOT. В следующем примере для извлечения основного результирующего набора данных производится поиск специфических записей в подзапросе.
SELECT
au_lname
FROM authors
WHERE EXISTS
(SELECT *
FROM publishers
WHERE authors.city=publishers.city
);
Этот запрос возвращает фамилии авторов (au_lname), которые живут в том же городе, что и издатели (publishers). Обратите внимание, что можно использовать в подзапросе звездочку, поскольку подзапрос должен вернуть всего лишь одну запись с булевым значением ИСТИНА. В таких случаях столбцы не играют роли. Ключевой момент — это существование строки.
Советы и хитрости программирования
Во многих запросах оператор EXISTS выполняет ту же функцию, что и ANY. Оператор EXISTS обычно является наиболее эффективным при использовании с коррелированными запросами.
Оператор EXISTS семантически эквивалентен оператору ANY.
Подзапрос в операторе EXISTS обычно производит один из двух видов поиска. Первый вариант — это использование группового символа — звездочки (например, SELECT * FROM…), и в этом случае вы не извлекаете какой-то конкретный столбец или значение. Звездочка здесь означает «любой столбец». Второй вариант — выбор в подзапросе только одного конкретного столбца (например, SELECT aujd FROM). Некоторые отдельные платформы позволяют выполнять подзапросы по нескольким столбцам (например, SELECT aujd, aujname FROM…). Однако эта возможность достаточно редкая и ее следует избегать в коде, который нужно переносить на другие платформы.
Различия между платформами
Все платформы поддерживают оператор EXISTS в том виде, который мы описали выше.