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).
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 2Pro další vysvětlení budou použity následující tabulky:
Město (města)ID | název |
---|---|
jeden | Moskva |
2 | Petrohrad |
3 | Kazaň |
název | CityId |
---|---|
Andrew | jeden |
Leonid | 2 |
Sergeji | jeden |
Gregory | čtyři |
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 . IDVýsledek:
Osoba.Jméno | Person.CityId | City.Id | Jméno města |
---|---|---|---|
Andrew | jeden | jeden | Moskva |
Leonid | 2 | 2 | Petrohrad |
Sergeji | jeden | jeden | Moskva |
Spojení mezi dvěma tabulkami, které nutně zahrnuje všechny řádky v jedné nebo obou tabulkách.
LEFT OUTER JOINLevý 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 .
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 |
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 .
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ň |
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.
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 |
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 Citynebo
VYBRAT * Z Osoba , MěstoVý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 . IDVý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] .
SQL | |
---|---|
Verze |
|
Klíčová slova | |
Související články | |
Části ISO/IEC SQL |
|
Databáze | |
---|---|
Koncepty |
|
Objekty |
|
Klíče | |
SQL | |
Komponenty |