Подзапросы / CTEСредний
EXISTS / NOT EXISTS
Проверяет, возвращает ли подзапрос хотя бы одну строку. Более эффективен чем IN для больших данных.
Синтаксис
SELECT ... WHERE EXISTS (SELECT 1 FROM ... WHERE ...); SELECT ... WHERE NOT EXISTS (SELECT 1 FROM ... WHERE ...);
Объяснение
EXISTS останавливается на первой найденной строке (short-circuit). IN читает все строки подзапроса.
NOT EXISTS эффективнее NOT IN когда в подзапросе есть NULL: NOT IN с NULL всегда возвращает пустой результат.
Пример
-- Пользователи, сделавшие хотя бы один заказ 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 );
Связанные термины
Анекдоты по теме
— Зачем учить SQL, если есть ChatGPT? — Чтобы проверить, правильный ли запрос написал ChatGPT. — Логично. — И чтобы понять, почему он работает не так, как ты ожидал.
— Почему оптимизатор иногда выбирает плохой план? — Устаревшая статистика. Запусти ANALYZE. — Или: очень нетипичное распределение данных. — Или: коррелированные условия WHERE — оптимизатор считает их независимыми. — Решение? — CREATE STATISTICS ON (a, b) FROM table; — многоколоночная статистика.
Разработчик смотрит на EXPLAIN и видит: cost=0.00..99999.00 rows=1000000 — Это нормально? DBA: (смотрит на часы, потом на разработчика) — Нет.