Skip to content

Złączenia SQL wyjaśnione

Porównanie typów złączeń SQL: inner, outer, cross, self, lateral, natural — co każde z nich zwraca, z przykładem w jednej linii.

Złączenia łączą wiersze z dwóch tabel po wspólnym kluczu. Typ złączenia decyduje, które wiersze przetrwają, gdy klucze pasują, nie pasują lub się powtarzają.

Tabela referencyjna · 8 wpisy
8 of 8 rows
Inner i outer
Tylko wiersze, w których warunek ON pasuje w obu tabelach. Wiersze bez pary po którejkolwiek stronie są pomijane.SELECT u.name, o.total FROM users u INNER JOIN orders o ON u.id = o.user_id;
Wszystkie wiersze z lewej tabeli. Kolumny z prawej są NULL tam, gdzie nie ma dopasowania.SELECT u.name, o.total FROM users u LEFT OUTER JOIN orders o ON u.id = o.user_id;
Wszystkie wiersze z prawej tabeli. Kolumny z lewej są NULL tam, gdzie nie ma dopasowania.SELECT u.name, o.total FROM users u RIGHT OUTER JOIN orders o ON u.id = o.user_id;
Wszystkie wiersze z obu tabel. Strony bez pary są wypełniane wartością NULL.SELECT u.name, o.total FROM users u FULL OUTER JOIN orders o ON u.id = o.user_id;
Cross i self
Iloczyn kartezjański. Każdy wiersz lewej tabeli łączy się z każdym wierszem prawej. Bez klauzuli ON.SELECT u.name, o.total FROM users u CROSS JOIN orders o;
Tabela złączona sama ze sobą przez aliasy. Porównuje wiersze w obrębie jednej tabeli.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;
Zaawansowane
Podzapytanie w FROM, wykonywane dla każdego wiersza zewnętrznego. Podzapytanie może odwoływać się do kolumn tabeli zewnętrznej.SELECT u.name, o.total FROM users u, LATERAL (SELECT total FROM orders WHERE user_id = u.id LIMIT 1) o;
Łączy po kolumnach o tej samej nazwie. Bez klauzuli ON. Uważaj na niezamierzone kolizje kluczy.SELECT u.name, o.total FROM users u NATURAL JOIN orders o;