Квантор EXISTS (существует) - понятие, заимствованное из формальной логики. В языке SQL предикат с квантором существования представляется выражением EXISTS (SELECT * FROM...).
Такое выражение считается истинным только тогда, когда результат вычисления "SELECT * FROM..." является непустым множеством, т.е. когда существует какая-либо запись в таблице, указанной во фразе FROM подзапроса, которая удовлетворяет условию WHERE подзапроса. (Практически этот подзапрос всегда будет коррелированным множеством.)
Рассмотрим примеры. Выдать названия поставщиков, поставляющих продукт с номером 11.
SELECT Название FROM Поставщики WHERE EXISTS (SELECT * FROM Поставки WHERE ПС = Поставщики.ПС AND ПР = 11); |
Результат:
Название |
СЫТНЫЙ |
УРОЖАЙ |
КОРЮШКА |
ЛЕТО |
Система последовательно выбирает строки таблицы Поставщики, выделяет из них значения столбцов Название и ПС, а затем проверяет, является ли истинным условие существования, т.е. су-ществует ли в таблице Поставки хотя бы одна строка со значением ПР=11 и значением ПС, равным значению ПС, выбранному из таблицы Поставщики. Если условие выполняется, то полученное значение столбца Название включается в результат.
Предположим, что первые значения полей Название и ПС равны, соответственно, 'СЫТНЫЙ' и 1. Так как в таблице Поставки есть строка с ПР=11 и ПС=1, то значение 'СЫТНЫЙ' должно быть включено в результат.
Хотя этот первый пример только показывает иной способ формулировки запроса для задачи, решаемой и другими путями (с помощью оператора IN или соединения), EXISTS представляет собой одну из наиболее важных возможностей SQL. Фактически любой запрос, который выражается через IN, может быть альтернативным образом сформулирован также с помощью EXISTS. Однако обратное высказывание несправедливо.
Выдать название и статус поставщиков, не поставляющих продукт с номером 11.
SELECT Название, Статус FROM Поставщики WHERE NOT EXISTS (SELECT * FROM Поставки WHERE ПС = Поставщики.ПС AND ПР = 11); |
Результат:
Название | Статус |
ПОРТОС | кооператив |
ШУШАРЫ | совхоз |
ТУЛЬСКИЙ | универсам |
ОГУРЕЧИК | ферма |