Ako do toho zapadá LEFT JOIN
, RIGHT JOIN
a FULL JOIN
?
Za predpokladu, že spájate stĺpce bez duplikátov, čo je veľmi častý prípad:
Vnútorné spojenie A a B dáva výsledok A pretína B, t. j. vnútornú časť priesečníka Vennov diagram.
Vonkajšie spojenie A a B dáva výsledok A union B, t. j. vonkajšie časti spojenia Vennovho diagramu.
Príklady
Predpokladajme, že máte dve tabuľky, každú s jedným stĺpcom, s nasledujúcimi údajmi:
A B
- -
1 3
2 4
3 5
4 6
Všimnite si, že (1,2) sú jedinečné pre A, (3,4) sú spoločné a (5,6) sú jedinečné pre B.
Vnútorné spojenie
Vnútorné spojenie pomocou niektorého z ekvivalentných dotazov poskytuje priesečník dvoch tabuliek, t. j. dva riadky, ktoré majú spoločné.
select * from a INNER JOIN b on a.a = b.b;
select a.*, b.* from a,b where a.a = b.b;
a | b
--+--
3 | 3
4 | 4
Vonkajšie ľavé spojenie
Ľavé vonkajšie spojenie poskytne všetky riadky v A a všetky spoločné riadky v B.
select * from a LEFT OUTER JOIN b on a.a = b.b;
select a.*, b.* from a,b where a.a = b.b(+);
a | b
--+-----
1 | null
2 | null
3 | 3
4 | 4
Pravé vonkajšie spojenie
Pravé vonkajšie spojenie poskytne všetky riadky v B plus všetky spoločné riadky v A.
select * from a RIGHT OUTER JOIN b on a.a = b.b;
select a.*, b.* from a,b where a.a(+) = b.b;
a | b
-----+----
3 | 3
4 | 4
null | 5
null | 6
Plné vonkajšie spojenie
Úplné vonkajšie spojenie vám poskytne spojenie A a B, t. j. všetky riadky v A a všetky riadky v B. Ak niečo v A nemá zodpovedajúci údaj v B, potom je časť B nulová a naopak.
select * from a FULL OUTER JOIN b on a.a = b.b;
a | b
-----+-----
1 | null
2 | null
3 | 3
4 | 4
null | 6
null | 5
Vnútorné spojenie zobrazí riadky len vtedy, ak na druhej (pravej) strane spojenia existuje zodpovedajúci záznam.
Vonkajšie (ľavé) spojenie zobrazí riadky pre každý záznam na ľavej strane, aj keď na druhej (pravej) strane spojenia nie sú žiadne zodpovedajúce riadky. Ak neexistuje žiadny zodpovedajúci riadok, stĺpce pre druhú (pravú) stranu by zobrazovali NULL.
Vnútorné spojenia vyžadujú, aby v spojenej tabuľke existoval záznam s príbuzným ID.
Vonkajšie spojenia vrátia záznamy pre ľavú stranu, aj keď pre pravú stranu nič neexistuje.
Napríklad máte tabuľku Orders a tabuľku OrderDetails. Sú prepojené údajom "OrderID".
Orders
OrderDetails
Požiadavka
SELECT Orders.OrderID, Orders.CustomerName
FROM Orders
INNER JOIN OrderDetails
ON Orders.OrderID = OrderDetails.OrderID
vráti iba objednávky, ktoré majú niečo aj v tabuľke OrderDetails.
Ak to zmeníte na OUTER LEFT JOIN
SELECT Orders.OrderID, Orders.CustomerName
FROM Orders
LEFT JOIN OrderDetails
ON Orders.OrderID = OrderDetails.OrderID
potom sa vrátia záznamy z tabuľky Orders, aj keď nemajú žiadne záznamy OrderDetails.
Môžete to použiť na vyhľadanie objednávok, ktoré nemajú žiadne záznamy OrderDetails, čo naznačuje možnú osirelú objednávku pridaním klauzuly where, napríklad WHERE OrderDetails.OrderID IS NULL
.