EXISTS - возвращает true, если подзапрос возвращает записи
Оператор EXISTS
проверяет, возвращает ли подзапрос какое-либо значение. Как правило, этот
оператор используется для
индикации того, что как минимум одна строка в таблице удовлетворяет некоторому условию. Поскольку возвращения набора
строк не происходит, то подзапросы с подобным оператором выполняются довольно быстро.
Применение оператора имеет следующий формальный синтаксис:
SELECT * FROM `имя_таблицы` WHERE NOT EXISTS (подзапрос);
SELECT * FROM `имя_таблицы` WHERE EXISTS (подзапрос);
Например, найдем все товары из таблицы Products
, на которые есть заказы в таблице Orders:
SELECT * FROM `Products`
WHERE EXISTS
(SELECT * FROM Orders WHERE Orders.ProductId = Products.Id);
Если мы хотим узнать, наоброт, есть ли в таблице строки, которые НЕ удовлетворяют условию, то можно использовать
операторы NOT EXISTS
. Например, найдем все товары из таблицы Products
, на которые не было заказов в таблице Orders:
SELECT * FROM `Products`
WHERE NOT EXISTS
(SELECT * FROM Orders WHERE Products.Id = Orders.ProductId);
Стоит отметить, что для получения подобного результата можно было бы использовать и опеатор IN
:
SELECT * FROM `Products`
WHERE Id NOT IN
(SELECT ProductId FROM Orders);
Но поскольку при применении EXISTS
не происходит выборка строк, то его использование более оптимально и эффективно, чем использование оператора IN
.