Сравнение типов SQL-соединений: inner, outer, cross, self, lateral, natural — что возвращает каждое, с примером в одну строку.
Соединения объединяют строки двух таблиц по общему ключу. Тип соединения определяет, какие строки выживают, когда ключи совпадают, отсутствуют или повторяются.
Справочная таблица · 8 записи
Соединения SQLExplained
8 of 8 rows
Inner и outer
Только строки, где условие ON выполняется в обеих таблицах. Строки без пары с любой из сторон отбрасываются.
SELECT u.name, o.total FROM users u INNER JOIN orders o ON u.id = o.user_id;
Все строки левой таблицы. Правые столбцы равны NULL там, где пары нет.
SELECT u.name, o.total FROM users u LEFT OUTER JOIN orders o ON u.id = o.user_id;
Все строки правой таблицы. Левые столбцы равны NULL там, где пары нет.
SELECT u.name, o.total FROM users u RIGHT OUTER JOIN orders o ON u.id = o.user_id;
Все строки обеих таблиц. Стороны без пары заполняются значениями NULL.
SELECT u.name, o.total FROM users u FULL OUTER JOIN orders o ON u.id = o.user_id;
Cross и self
Декартово произведение. Каждая строка слева сочетается с каждой строкой справа. Без условия ON.
SELECT u.name, o.total FROM users u CROSS JOIN orders o;
Таблица, соединённая сама с собой через псевдонимы. Сравнивает строки внутри одной таблицы.
SELECT a.id AS o1, b.id AS o2 FROM orders a JOIN orders b ON a.user_id = b.user_id WHERE a.id < b.id;
Расширенные
Подзапрос в FROM, вычисляемый для каждой внешней строки. Подзапрос может ссылаться на столбцы внешней таблицы.
SELECT u.name, o.total FROM users u, LATERAL (SELECT total FROM orders WHERE user_id = u.id LIMIT 1) o;
Соединяет по столбцам с одинаковыми именами. Без условия ON. Остерегайтесь случайных коллизий ключей.
SELECT u.name, o.total FROM users u NATURAL JOIN orders o;