Время прочтения: 3 мин.

Наиболее популярными условиями для выборки и анализа данных чаще всего используют «JOIN», «LIKE», «IN», но они имеют слабую оптимизацию и ограничения в виде максимального количества выражений. В свою очередь условие «EXISTS»  хотя и считается менее эффективным, значительно  сокращает избыточность написания запроса и позволяет использовать в запросе Булеву логику. Данная логика часто применяется в программировании. На примере исполнения запросов рассмотрим некоторое применение данной логики. Исследуя запросы с применением «EXISTS» может показаться, что он идентичен распространённому «IN». Не обращая внимание на некоторое сходство, все же они различаются в своем применении. Критерий с использованием «IN» производит перебор значений в масштабе, определенных в его условии, при таком варианте выбираются все строки, отвечающие этому масштабу. Критерий «EXISTS» представляет собой ответ «да» или «нет» на вопрос есть в наличии вообще какие-либо значения, соответствующие указанному в условии. Кроме всего прочего, перед условием «IN» всегда пишется название столбца, по которому необходимо произвести поиск соответствующих значений. И так «EXISTS» — условный оператор, который используется как часть предложения ‘WHERE’ запроса для проверки того, является ли набор результатов, полученный из коррелированного вложенного подзапроса, пустым или нет. Это условие возвращает логическое Булево значение, которое может быть истинным или ложным. Когда условие коррелированного подзапроса возвращает одну или несколько строк, условие удовлетворяется, и оператор «EXISTS» возвращает TRUE, в противном случае он возвращает FALSE. Оператор «EXISTS» применяется со всеми известными конструкциями запросов.

Рассмотрим наиболее применимые варианты.

””” SELECT * FROM [company_emp] as emp
WHERE EXISTS (SELECT *
              FROM [post_addres] as post
              WHERE emp.[surname] = post.[surname]
              AND emp.[one_name] = post.[one_name]) ”””

Результатом не сложного запроса, при исполнении TRUE будут все строки из таблицы [company_emp], которая содержит по крайней мере одну запись в таблице [post_address] с соответствующими данными в полях [surname] и [one_name]. В случает FALSE результат запроса будет пустым.

Рассмотрим вариант с использованием «NOT».
Удостоверяющее условие «EXISTS» также может быть обратным и соединен  с условием «Не».

”””   SELECT * FROM [company_emp] as emp
WHERE NOT EXISTS (SELECT *
              FROM [post_addres] as post
              WHERE emp.[surname] = post.[surname]
              AND emp.[one_name] = post.[one_name])   ”””


В результате запроса, при исполнении мы получим все строки из таблицы [company_emp], в которых нет записей в таблице [post_address] для соответствующих полей [surname] и [one_name].

Вариант с вставлением данных.

”””   INSERT INTO [post_addres]
([post_id], [post_name])
SELECT [provider_id], [provider_name]
FROM [provider] as prv
WHERE EXISTS (SELECT *
              FROM [consumer] as csr
              WHERE prv.[provider_id] = csr.[provider_id])   ”””

В результате запроса будут вставлены данные полей ([provider_id], [provider_name]) из таблицы [provider] в таблицу [post_address], при удостоверяющем условии содержания данных в таблице [consumer] с соответствующими данными поля (prv.[provider_id]) таблицы [provider].

Вариант с обновлением данных.

”””   UPDATE [provider] as prv
SET [provider_name] = (SELECT csr.[name]
                     FROM [consumer] as csr
WHERE EXISTS (SELECT csr.[name]
              FROM [consumer] as csr
              WHERE csr.[consumer_id] = prv.[provider_id])    ”””

В результате запроса будут внесены изменения в данные поля [provider_name] таблицы [provider] из данных таблицы [consumer], при удостоверяющем условии содержания данных в полях ([consumer_id] и [provider_id]).

Вариант удаление данных.

”””   DELETE FROM [post_addres] as post
WHERE EXISTS (SELECT *
              FROM [company_emp] as emp
              WHERE emp.[surname] = post.[surname])   ”””

В результате запроса будут удалены только записи в таблицы [post_addres], при удостоверяющем условии в таблице [company_emp], содержания данных в поле ([surname]).

Вывод

Запрос с условием «EXISTS», выглядит логически простым, используется редко, может быть не всегда понятен в применении. Однако в некоторых случаях, обладает гибкостью и позволяет оптимизировать избыточность написания запроса для быстрого анализа данных. При его частом использовании, ваше понимание его логики расширится значительно.