Připojit (SQL)

Stabilní verze byla odhlášena 11. května 2022 . Existují neověřené změny v šablonách nebo .

JOIN  je operátor jazyka SQL , který je implementací operace spojení relační algebry . Zahrnuje klauzuli FROM příkazů SELECT , UPDATE a DELETE .

Operace spojení, stejně jako ostatní binární operace , je navržena k načtení dat ze dvou tabulek a zahrnutí těchto dat do jedné sady výsledků. Charakteristické rysy operace spojení jsou následující:

Určení, které zdrojové řetězce budou zahrnuty do výsledku a v jakých kombinacích, závisí na typu operace spojení a na explicitně specifikované podmínce spojení . Podmínka spojení, tedy podmínka vzájemné shody řádků zdrojových tabulek, je logický výraz ( predikát ).

Pokud je potřeba spojit ne dvě, ale několik tabulek, operace spojení se použije několikrát (postupně).

Operace SQL JOIN je implementací operace spojení relační algebry pouze do určité míry, protože v relačním datovém modelu se spojení provádí na relacích, což jsou množiny , a v SQL na tabulkách, které jsou multimnožinami . Výsledky operací jsou také obecně různé: v relační algebře výsledek spojení dává relaci (množinu) a v SQL tabulku (multiset).

Popis operátora

Z tabulky1 { VNITŘNÍ | { VLEVO | SPRÁVNĚ | FULL } VNĚJŠÍ | CROSS } JOIN Tabulka2 { ON < podmínka > | USING ( název_pole [,... n ]) }

Ve většině DBMS lze při zadávání slov LEFT, RIGHT, FULLslovo OUTERvynechat. Toto slovo INNERlze také ve většině DBMS vynechat.

V obecném případě DBMS kontroluje podmínku ( predikát ) při navazování spojení . Pokud jsou názvy sloupců, kterými jsou tabulky spojeny, stejné, můžete místo toho použít . Podmínka není určena pro. ONUSINGCROSS JOIN

Pro křížové spojení (kartézský produkt) CROSS JOINpoužívají některé implementace SQL operátor čárky ( , ):

Z tabulky 1 , tabulky 2

Typy operátoru JOIN

Pro další vysvětlení budou použity následující tabulky:

Město (města)
ID název
jeden Moskva
2 Petrohrad
3 Kazaň
Osoba (Lidé)
název CityId
Andrew jeden
Leonid 2
Sergeji jeden
Gregory čtyři

VNITŘNÍ PŘIPOJENÍ

Operátor vnitřního spojení INNER JOIN spojuje dvě tabulky. Pořadí tabulek pro operátora není důležité, protože operátor je komutativní .

Záhlaví výsledné tabulky je sjednocením ( zřetězením ) záhlaví spojených tabulek.

Tělo výsledku je logicky vytvořeno následovně. Každý řádek jedné tabulky je porovnán s každým řádkem druhé tabulky, poté je kontrolována podmínka spojení pro výsledný „spojený“ řádek (vypočítá se predikát spojení). Pokud je podmínka pravdivá, do výsledné tabulky se přidá odpovídající "spojený" řádek.

Popsaný algoritmus akcí je přísně logický, to znamená, že pouze vysvětluje výsledek, který by měl být získán při provádění operace, ale nepředepisuje, aby konkrétní DBMS provedlo připojení zadaným způsobem. Existuje několik způsobů, jak implementovat operaci spojení, například spojení vnořených smyček ( angl.  inner loops join ), hash join ( angl.  hash join ), sloučení spojení ( angl.  merge join ). Jediným požadavkem je, aby jakákoli implementace logicky produkovala stejný výsledek jako při aplikaci popsaného algoritmu.

SELECT * FROM Person INNER JOIN City ON Person . CityId = město . ID

Výsledek:

Osoba.Jméno Person.CityId City.Id Jméno města
Andrew jeden jeden Moskva
Leonid 2 2 Petrohrad
Sergeji jeden jeden Moskva

OUTER JOIN

Spojení mezi dvěma tabulkami, které nutně zahrnuje všechny řádky v jedné nebo obou tabulkách.

LEFT OUTER JOIN

Levý operátor vnějšího spojení LEFT OUTER JOIN spojuje dvě tabulky. Pořadí tabulek pro operátora je důležité, protože operátor není komutativní .

Záhlaví výsledné tabulky je sjednocením ( zřetězením ) záhlaví spojených tabulek.

Tělo výsledku je logicky vytvořeno následovně. Nechť levou a pravou tabulku spojíme predikátem (podmínkou) p .

  1. Výsledek obsahuje vnitřní spojení ( INNER JOIN) levé a pravé tabulky predikátem p .
  2. Poté se k výsledku přidají ty řádky levé tabulky, které nebyly zahrnuty do vnitřního spojení v kroku 1. U takových řádků jsou sloupce odpovídající pravé tabulce vyplněny hodnotami NULL.
SELECT * FROM Osoba -- Levý stůl LEFT OUTER JOIN Město -- Pravý stůl ON Osoba . CityId = město . ID

Výsledek:

Osoba.Jméno Person.CityId City.Id Jméno města
Andrew jeden jeden Moskva
Leonid 2 2 Petrohrad
Sergeji jeden jeden Moskva
Gregory čtyři NULA NULA
RIGHT OUTER JOIN

Pravý operátor vnějšího spojení RIGHT OUTER JOIN spojuje dvě tabulky. Pořadí tabulek pro operátora je důležité, protože operátor není komutativní .

Záhlaví výsledné tabulky je sjednocením ( zřetězením ) záhlaví spojených tabulek.

Tělo výsledku je logicky vytvořeno následovně. Nechť levou a pravou tabulku spojíme predikátem (podmínkou) p .

  1. Výsledek obsahuje vnitřní spojení ( INNER JOIN) levé a pravé tabulky predikátem p .
  2. Poté se k výsledku přidají ty řádky pravé tabulky, které nebyly zahrnuty do vnitřního spojení v kroku 1. U takových řádků jsou sloupce odpovídající levé tabulce vyplněny hodnotami NULL.
SELECT * FROM Person -- Left table RIGHT OUTER JOIN City -- Right table ON Person . CityId = město . ID

Výsledek:

Osoba.Jméno Person.CityId City.Id Jméno města
Andrew jeden jeden Moskva
Sergeji jeden jeden Moskva
Leonid 2 2 Petrohrad
NULA NULA 3 Kazaň
ÚPLNÉ VNĚJŠÍ PŘIPOJENÍ

Operátor úplného vnějšího spojení FULL OUTER JOIN spojuje dvě tabulky. Pořadí tabulek pro operátora není důležité, protože operátor je komutativní .

Záhlaví výsledné tabulky je sjednocením ( zřetězením ) záhlaví spojených tabulek.

Tělo výsledku je logicky vytvořeno následovně. Nechť první a druhou tabulku spojíme predikátem (podmínkou) p . Slova „první“ a „druhá“ zde neoznačují pořadí, ve kterém je výraz napsán (což není důležité), ale slouží pouze k rozlišení tabulek.

  1. Výsledek obsahuje vnitřní spojení ( INNER JOIN) první a druhé tabulky predikátem p .
  2. Výsledek zahrnuje ty řádky první tabulky, které nebyly zahrnuty do vnitřního spojení v kroku 1. U takových řádků jsou sloupce odpovídající druhé tabulce vyplněny hodnotami NULL.
  3. K výsledku se přidají ty řádky druhé tabulky, které nebyly zahrnuty do vnitřního spojení v kroku 1. U takových řádků jsou sloupce odpovídající první tabulce vyplněny hodnotami NULL.
SELECT * FROM Person FULL OUTER JOIN City ON Person . CityId = město . ID

Výsledek:

Osoba.Jméno Person.CityId City.Id Jméno města
Andrew jeden jeden Moskva
Sergeji jeden jeden Moskva
Leonid 2 2 Petrohrad
NULA NULA 3 Kazaň
Gregory čtyři NULA NULA

CROSS JOIN

Operátor křížového spojení neboli kartézský součin CROSS JOIN spojuje dvě tabulky. Pořadí tabulek pro operátora není důležité, protože operátor je komutativní .

Záhlaví výsledné tabulky je sjednocením ( zřetězením ) záhlaví spojených tabulek.

Tělo výsledku je logicky vytvořeno následovně. Každý řádek jedné tabulky je spojen s každým řádkem druhé tabulky, čímž jsou získány všechny možné kombinace řádků dvou tabulek.

VYBERTE * Z osoby CROSS JOIN City

nebo

VYBRAT * Z Osoba , Město

Výsledek:

Osoba.Jméno Person.CityId City.Id Jméno města
Andrew jeden jeden Moskva
Andrew jeden 2 Petrohrad
Andrew jeden 3 Kazaň
Leonid 2 jeden Moskva
Leonid 2 2 Petrohrad
Leonid 2 3 Kazaň
Sergeji jeden jeden Moskva
Sergeji jeden 2 Petrohrad
Sergeji jeden 3 Kazaň
Gregory čtyři jeden Moskva
Gregory čtyři 2 Petrohrad
Gregory čtyři 3 Kazaň

Pokud do klauzule WHERE přidáte podmínku spojení (predikát p ) , tedy omezení kombinací n-tic, bude výsledek ekvivalentní operaci INNER JOINse stejnou podmínkou:

SELECT * FROM Person , City WHERE Person . CityId = město . ID

Výrazy t1, t2 WHERE pa t1 INNER JOIN t2 ON pjsou tedy syntakticky alternativní formy zápisu stejné operace logického vnitřního spojení na predikátu p . Syntaxe CROSS JOIN + WHEREoperace spojení je považována za zastaralou a zastaralou podle standardu SQL ANSI [1] [2] .

Poznámky

  1. SR0010: Nepoužívejte starší syntaxi . Získáno 9. dubna 2012. Archivováno z originálu 10. června 2012.
  2. ANSI se připojí . Získáno 9. dubna 2012. Archivováno z originálu 15. června 2012.

Odkazy