Оператор EXISTS

Последнее обновление: 29.11.2021

Оператор EXISTS проверяет, возвращает ли подзапрос какое-либо значение. Как правило, этот оператор используется для индикации того, что как минимум одна строка в таблице удовлетворяет некоторому условию. Поскольку возвращения набора строк не происходит, то подзапросы с подобным оператором выполняются довольно быстро.

Применение оператора имеет следующий формальный синтаксис:

EXISTS (подзапрос)

Если подзапрос возвращает хотя бы одну строку, то оператор EXISTS возвращает true или 1. Если результат подзапроса не содержит строк, то оператор EXISTS возвращает false или 0.

Рассмотрим применение оператора EXISTS на примере следующих таблиц:

DROP TABLE IF EXISTS companies;
DROP TABLE IF EXISTS users;
CREATE TABLE companies
(
	id INTEGER PRIMARY KEY AUTOINCREMENT, 
	name TEXT NOT NULL
);
CREATE TABLE users
(
    id INTEGER PRIMARY KEY AUTOINCREMENT,
	name TEXT NOT NULL,
    age INTEGER,
	company_id INTEGER
);
INSERT INTO companies (name) VALUES  ('Microsoft'), ('Google'), ('JetBrains');
INSERT INTO users (name, age, company_id) VALUES 
('Tom', 37, (SELECT id FROM companies WHERE name='Microsoft')),
('Bob', 41, (SELECT id FROM companies WHERE name='JetBrains')),
('Sam', 25, (SELECT id FROM companies WHERE name='Microsoft')),
('Alice', 33, NULL);

Простейший пример - посмотрим, есть ли в таблице companies компании с определенными названиями:

SELECT 
	EXISTS(SELECT id FROM companies WHERE name='Microsoft') AS microsoft,
	EXISTS(SELECT id FROM companies WHERE name='Apple') AS apple;

Здесь мы видим, что компания "Microsoft" есть в таблице companies, соответственно подзапрос возвращает данные, а оператор EXISTS возвращает 1. А вот компании "Apple" нет, поэтому оператор EXISTS возвращает 0:

Оператор EXISTS в SQLite

Как правило, EXISTS используется при составлении условий в запросах. Например, выберем все комании из таблицы companies, у которых есть работники в таблице users:

SELECT * FROM companies
WHERE EXISTS 
(SELECT * FROM users WHERE users.company_id = companies.id);
Оператор EXISTS и подзапросы в SQLite

Стоит отметить, что для получения подобного результата можно было бы использовать и операторIN:

SELECT * FROM companies
WHERE id IN (SELECT company_id FROM users);

Но поскольку при применении EXISTS не происходит выборка строк, то его использование более оптимально и эффективно, чем использование оператора IN, поскольку IN должен пробежать все строки из результата подзапроса, чтобы проверить соответствие значению.

Если мы хотим узнать, наоброт, есть ли в таблице строки, которые НЕ удовлетворяют условию, то можно использовать операторы NOT EXISTS. Например, найдем все комании из таблицы companies, у которых нет работников в таблице users:

SELECT * FROM companies
WHERE NOT EXISTS 
(SELECT * FROM users WHERE users.company_id = companies.id);
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850