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 );
Связанные термины
Анекдоты по теме
— Почему не стоит использовать SELECT * в production коде? — Если добавить колонку — приложение сломается на неожиданном поле. — Если удалить — тоже сломается. — Больше данных по сети и из базы. — Covering index не работает. — Явно указывай колонки. Это документация запроса.
— Что такое connection limit в PostgreSQL? — max_connections = 100 по умолчанию. — Что будет при превышении? — FATAL: sorry, too many clients already. — Как увеличить? — max_connections в postgresql.conf. Но каждое соединение — ~5-10MB памяти. — PgBouncer? — Пулер между приложением и PostgreSQL. Тысячи приложений → десятки соединений к базе.
Оптимизатор запросов говорит медленному подзапросу: — Ты почему такой тормоз? Подзапрос (ковыряя IN (SELECT ...)): — Я каждую строчку с каждой сравниваю. Зато честно. Оптимизатор: — Используй EXISTS. Подзапрос, помолчав: — Так я не знаю, существую ли я на самом деле после этого...