Skip to content

Joins v SQL vysvětleny

Typy JOIN v SQL porovnány: inner, outer, cross, self, lateral, natural — co každý vrací, s jednořádkovým příkladem.

Joins kombinují řádky ze dvou tabulek přes společný klíč. Typ joinu rozhoduje, které řádky přežijí, když se klíče shodují, chybí nebo opakují.

Referenční tabulka · 8 položek
8 of 8 rows
Inner a outer
Pouze řádky, kde podmínka ON odpovídá v obou tabulkách. Nespárované řádky na kterékoliv straně se zahazují.SELECT u.name, o.total FROM users u INNER JOIN orders o ON u.id = o.user_id;
Všechny řádky levé tabulky. Pravé sloupce jsou NULL tam, kde neexistuje shoda.SELECT u.name, o.total FROM users u LEFT OUTER JOIN orders o ON u.id = o.user_id;
Všechny řádky pravé tabulky. Levé sloupce jsou NULL tam, kde neexistuje shoda.SELECT u.name, o.total FROM users u RIGHT OUTER JOIN orders o ON u.id = o.user_id;
Všechny řádky obou tabulek. Nespárované strany se doplní hodnotou NULL.SELECT u.name, o.total FROM users u FULL OUTER JOIN orders o ON u.id = o.user_id;
Cross a self
Kartézský součin. Každý levý řádek se spáruje s každým pravým. Bez klauzule ON.SELECT u.name, o.total FROM users u CROSS JOIN orders o;
Tabulka spojená sama se sebou přes aliasy. Porovnává řádky v rámci jedné tabulky.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;
Pokročilé
Poddotaz ve FROM vyhodnocený pro každý vnější řádek. Poddotaz se může odkazovat na sloupce vnější tabulky.SELECT u.name, o.total FROM users u, LATERAL (SELECT total FROM orders WHERE user_id = u.id LIMIT 1) o;
Spojuje podle sloupců se shodným názvem. Bez klauzule ON. Pozor na nechtěné kolize klíčů.SELECT u.name, o.total FROM users u NATURAL JOIN orders o;