Функция exists принимает внутренний запрос в качестве аргумента и возвращает истину, если внутренний запрос возвращает одну или более строк, и возвращает ложь, если запрос вернет ноль строк. Эта функция будет рассмотрена с использованием примеров.
Внутренний запрос в функции exists почти всегда зависит от переменной из внешнего запроса. По этой причине функция exists обычно задает коррелированный подзапрос.
Давайте посмотрим, как Database Engine может обрабатывать запрос в примере 6.66. Во-первых, внешний запрос просматривает первую строку таблицы employee (Smith). Затем выполняется функция exists для определения того, существуют ли строки в таблице workson, для которых номер служащего соответствует текущей строке из внешнего запроса и у которых project_no равняется pi. Поскольку мистер Smith не работает над проектом pi, результатом внутреннего запроса будет пустое множество, и функция exists вернет ложь. Поэтому служащий с фамилией Smith не принадлежит результирующему набору. Используя этот процесс, проверяются все строки таблицы employee, а затем отображается результат.
В примере 6.67 показано использование функции not exists.
Для списка выбора оператора select, который является внешним запросом, включающим функцию exists, не рекомендуется использовать форму select, как было в предыдущем примере. Альтернативной формой является форма select список_столбцов, где список_столбцов - один или более столбцов таблицы. Обе формы эквивалентны, потому что функция exists проверяет только лишь существование (в данном случае отсутствие) строк в результирующем наборе. По этой причине использование select * в данном случае является более защищенным.