EXISTS / NOT EXISTS
Проверяет, возвращает ли подзапрос хотя бы одну строку. Более эффективен чем IN для больших данных.
SELECT ... WHERE EXISTS (SELECT 1 FROM ... WHERE ...); SELECT ... WHERE NOT EXISTS (SELECT 1 FROM ... WHERE ...);
Объяснение
Пример
-- Пользователи, сделавшие хотя бы один заказ SELECT * FROM users u WHERE EXISTS ( SELECT 1 FROM orders o WHERE o.user_id = u.id ); -- Пользователи БЕЗ заказов SELECT * FROM users u WHERE NOT EXISTS ( SELECT 1 FROM orders o WHERE o.user_id = u.id );
Связанные термины
Анекдоты по теме
— Зачем нужен ORDER BY? — Чтобы база данных не выдавала результаты в случайном порядке. Потому что «случайный» в базе данных — это «как бог на душу положит».
— Чем коррелированный подзапрос отличается от обычного? — Обычный выполняется один раз. Коррелированный — для каждой строки внешнего запроса. — Это плохо? — Зависит от размера таблицы. При миллионе строк — миллион подзапросов.
— Что такое TABLESAMPLE? — Выборка случайных строк без полного скана. SELECT * FROM orders TABLESAMPLE BERNOULLI(1); — 1% строк случайно. — Зачем? — Быстрая оценка данных, тестирование на подвыборке. — Чем отличается BERNOULLI от SYSTEM? — BERNOULLI: каждая строка с вероятностью p%. SYSTEM: случайные блоки страниц — быстрее, менее равномерно.