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 );
Связанные термины
Анекдоты по теме
— Зачем нужен EXPLAIN (BUFFERS)? — Показывает, сколько данных прочитано из кэша и с диска. — Зачем это знать? — Если всё из кэша — ок. Если много с диска — нужно больше shared_buffers или индексы.
Оптимизатор запросов видит запрос с 7 JOIN. Оптимизатор: интересно. Оптимизатор перебирает 5040 возможных порядков соединения. Оптимизатор: выбираю лучший. Разработчик: почему запрос планируется 2 секунды? Оптимизатор: ты написал 7 JOIN.
— Оптимизатор может «заглянуть» внутрь CTE? — В PostgreSQL до 12 — нет. CTE был «забором оптимизации». — С PostgreSQL 12+? — По умолчанию может оптимизировать. Если нужно принудительно материализовать — WITH ... AS MATERIALIZED.