EXISTS (существует) - оператор, генерирующий значения «истина» или «ложь». Его мoжно применять отдельно в предикате или комбинировать с другими выражениями с помощью операторов AND, OR, NOT.Этот оператор оценивает подзапрос как истинный, если подзапрос генерирует выходные данные, а в противном случае как ложный, иными словами оператор EXISTS возвращает значение «истина», если подзапрос возвращает хотя бы одну строку. В отличие от прочих операторов и предикатов, он не может принимать значения unknown (неизвестный). Например, нужно извлечь данные из таблицы Клиент в том случае, если один (или более) клиент из нее работает с банком МММ:
SELECT * FROM КЛИЕНТ
WHERE EXISTS
(SELECT * FROM КЛИЕНТ WHERE IDN_банка = 311)
Выходные данные:
IDN | IDN_ГОРОДА | ИМЯ | РЕКВИЗИТЫ | IDN_БАНКА |
Петров | -------------- | |||
Кузнецов | -------------- | |||
Иванов | -------------- | |||
Золин | -------------- | |||
Киров | -------------- | |||
Павлов | -------------- | |||
Петренко | -------------- |
Внутренний запрос выбрал все данные обо всех клиентах, работающих с МММ.
Т.к. такие клиенты существуют, оператор EXISTS отметил, что подзапрос генерирует выходные данные, и принимает значение «истина». В данном случае тот же результат можно было получить проще, однако, бывают случаи, когда без EXISTS не обойтись.
Вывести название группы, если в ней есть товар, цена которого > 20.
SELECT ГРУППЫ.НАЗВАНИЕ
FROM ГРУППЫ
WHERE EXISTS
(SELECT ЦЕНА FROM ПЕРЕМЕЩЕНИЕ
WHERE ЦЕНА> 20
AND ГРУППЫ.IDN = ПЕРЕМЕЩЕНИЕ.IDN_ ГРУППЫ)
Oператор EXISTS отметил,что подзапрос генерирует выходные данные, и принимает значение «истина» для групп газ. вода и сигареты.
Выходные данные:
НАЗВАНИЕ |
Газ. вода |
Сигареты |
Приведем еще один вариант для примера из предыдущего раздела:
Получить все банки, которые не используются клиентами:
SELECT * FROM Банки
WHERE NOT EXISTS
(SELECT * FROM Клиент WHERE Клиент.Idn_банка = Банки.Idn)