Viac na
Aký je rozdiel medzi "INNER JOIN" a "OUTER JOIN"?
Ako do toho zapadá LEFT JOIN
, RIGHT JOIN
a FULL JOIN
?
4488
3
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:
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é.
Vonkajšie ľavé spojenie
Ľavé vonkajšie spojenie poskytne všetky riadky v A a všetky spoločné riadky v B.
Pravé vonkajšie spojenie
Pravé vonkajšie spojenie poskytne všetky riadky v B plus všetky spoločné riadky v A.
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.
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
vráti iba objednávky, ktoré majú niečo aj v tabuľke OrderDetails.
Ak to zmeníte na OUTER LEFT JOIN
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
.