INNER/LEFT/RIGHT JOIN
Тема дорожной карты · PostgreSQL
Операции JOIN — основной механизм в PostgreSQL для объединения строк из двух или более таблиц по связанному столбцу; выбор правильного типа соединения является основой корректного проектирования запросов к реляционной базе данных. INNER JOIN возвращает только строки, для которых условие соединения выполняется в обеих таблицах — это наиболее распространённое и, как правило, наиболее индексо-дружественное соединение для оптимизации запросов, — тогда как LEFT JOIN (или LEFT OUTER JOIN) возвращает все строки из левой таблицы и NULL для несовпавших столбцов правой таблицы, что удобно для поиска строк без соответствующей записи. RIGHT JOIN зеркально отражает это поведение с точки зрения правой таблицы, а FULL OUTER JOIN возвращает все строки из обеих таблиц, заполняя NULL для несовпавших сторон — паттерн, полезный для анализа пробелов и сверки данных в реляционной базе данных. Планировщик запросов PostgreSQL выбирает между Nested Loop, Hash Join и Merge Join в зависимости от размеров таблиц и доступных индексов, а EXPLAIN ANALYZE является незаменимым инструментом для проверки оптимальности выбранной стратегии соединения при заданном распределении данных.
Как это работает
INNER/LEFT/RIGHT JOIN соединяет данные между таблицами: INNER, LEFT/RIGHT/FULL OUTER, CROSS, LATERAL (per-row подзапрос), SELF (alias той же таблицы). View — сохранённые запросы (CREATE VIEW v AS SELECT ...); материализованные view (CREATE MATERIALIZED VIEW ...) кешируют результат на диск, требуют REFRESH. Оконные функции (OVER (PARTITION BY ... ORDER BY ...)) считают per-row агрегацию без коллапса строк. CTE (WITH ... AS) именуют подзапросы для читаемости.
Когда применять
View — для энкапсуляции сложных запросов, переиспользуемых вызывающими: версионированная API-поверхность над схемой. Материализованные view — когда подлежащий запрос дорогой, staleness секунд-часов допустим. LATERAL — когда подзапросу нужны колонки внешнего (top-N per group — канонический пример). Оконные функции вместо сложных self-join — для running totals, рангов, перцентилей.
Типичные ошибки
Ловушки INNER/LEFT/RIGHT JOIN: глубоко вложенные view (SELECT из view, join-ящего три view — планировщик видит один большой запрос, может выбрать плохой план); никогда не рефрешат materialized view (stale данные неделями); FULL OUTER JOIN, где надо INNER (NULL-потоп); cartesian-взрыв от пропущенного JOIN-условия (5 таблиц × 5 unrelated строк = миллионы). Всегда EXPLAIN для join перед деплоем.