Оператор EXISTS выполняет внешний запрос SQL, если внутренний запрос (подзапрос) не возвращает NULL
. Принцип работа оператора EXISTS
:
Этот процесс повторяется для каждой строки внешнего запроса.
Рассмотрим пример. Предположим, нам нужно вывести всех клиентов, совершивших заказ. В подзапросе мы проверяем наличие совершенного заказа в клиента (по полю customer_id) и если это подтверждается, то в результате выводим идентификатор и имя клиента.
1 2 3 4 5 6 7 |
SELECT customer_id, first_name FROM Customers WHERE EXISTS ( SELECT order_id FROM Orders WHERE Orders.customer_id = Customers.customer_id ); |
Результат:
Оператор NOT EXISTS в SQL
Мы также можем использовать оператор NOT, чтобы инвертировать работу оператора EXISTS
. Команда SQL выполняется, если подзапрос возвращает пустой результат (т.е. NULL-значение). Например, выполним предыдущую SQL-команду, но уже с оператором NOT EXISTS
:
1 2 3 4 5 6 7 |
SELECT customer_id, first_name FROM Customers WHERE NOT EXISTS ( SELECT order_id FROM Orders WHERE Orders.customer_id = Customers.customer_id ); |
Здесь мы выводим всех клиентов, которые НЕ совершили заказ.
Примеры использования оператора EXISTS
DROP таблицу, если EXISTS
Мы можем удалить таблицу (команда DROP
), если такая существует (команда IF EXISTS
). Например:
1 |
DROP TABLE IF EXISTS my_table; |
CREATE таблицу, если NOT EXISTS
Мы можем создать таблицу (команда CREATE
), если такой не существует (команда IF NOT EXISTS
). Например:
1 2 3 4 5 6 7 |
CREATE TABLE IF NOT EXISTS Companies ( id int, name varchar(50), address text, email varchar(50), phone varchar(10) ); |
Еще один пример
Следующая SQL-команда выбирает все заказы из таблицы Orders клиентов старше 23 лет.
1 2 3 4 5 6 7 8 |
SELECT * FROM Orders WHERE EXISTS ( SELECT customer_id FROM Customers WHERE Orders.customer_id = Customers.customer_id AND Customers.age > 23 ); |
Результат: