Liity (SQL)

Vakaa versio kirjattiin ulos 11.5.2022 . Malleissa tai malleissa on vahvistamattomia muutoksia .

JOIN  on SQL -kielen operaattori, joka on relaatioalgebran liitosoperaation toteutus . Sisältyy SELECT- , UPDATE- ja DELETE - käskyjen FROM-lauseeseen .

Liitosoperaatio, kuten muutkin binäärioperaatiot , on suunniteltu hakemaan tietoja kahdesta taulukosta ja sisällyttämään tiedot yhteen tulosjoukkoon. Liitostoiminnan tunnusmerkit ovat seuraavat:

Sen määrittäminen, mitkä lähdemerkkijonot sisällytetään tulokseen ja missä yhdistelmissä, riippuu liitosoperaation tyypistä ja nimenomaisesti määritetystä liitosehdosta . Liitosehto, eli ehto lähdetaulukoiden rivien yhteensovittamisesta keskenään, on looginen lauseke ( predikaatti ).

Jos ei tarvitse yhdistää kahta, vaan useampaa taulukkoa, yhdistämistoimintoa käytetään useita kertoja (peräkkäin).

SQL JOIN -operaatio on relaatioalgebran liitosoperaation toteutus vain jossain määrin, koska relaatiotietomallissa liitos suoritetaan relaatioille, jotka ovat joukkoja ja SQL:ssä taulukoille, jotka ovat multijoukkoja . Myös operaatioiden tulokset ovat yleisesti ottaen erilaisia: relaatioalgebrassa liitoksen tulos antaa suhteen (set), ja SQL:ssä taulukon (multiset).

Operaattorin kuvaus

taulukosta 1 { SISÄINEN | { VASEN | OIKEA | FULL } OUTTER | CROSS } JOIN Taulukko2 { PÄÄLLÄ < ehto > | KÄYTTÖ ( kentän_nimi [,... n ]) }

Useimmissa DBMS-järjestelmissä sanoja LEFT, RIGHTmääritettäessä FULLsana OUTERvoidaan jättää pois. Sana INNERvoidaan myös jättää pois useimmista DBMS-järjestelmistä.

Yleisessä tapauksessa DBMS tarkistaa ehdon ( predikaatti ) yhteyden muodostaessaan . Jos sarakkeiden nimet, joilla taulukot on yhdistetty, ovat samat, voit käyttää sen sijaan . Ehtoa ei ole määritelty. ONUSINGCROSS JOIN

Ristiliitokseen (Carteesinen tuote) CROSS JOINjotkin SQL-toteutukset käyttävät pilkkuoperaattoria ( , ):

FROM Table1 , Taulukko 2

JOIN-operaattorin tyypit

Seuraavia taulukoita käytetään lisäselvityksessä:

Kaupunki (kaupungit)
ID Nimi
yksi Moskova
2 Pietari
3 Kazan
Henkilö (Ihmiset)
Nimi Kaupunkitunnus
Andrew yksi
Leonid 2
Sergei yksi
Gregory neljä

SISÄLITYS

Sisäliitosoperaattori yhdistää INNER JOIN kaksi taulukkoa. Operaattorin taulukoiden järjestyksellä ei ole merkitystä, koska operaattori on kommutoiva .

Tulostaulukon otsikko on yhdistettyjen taulukoiden otsikoiden liitto ( ketjutus ).

Tuloksen runko muodostetaan loogisesti seuraavasti. Yhden taulukon jokaista riviä verrataan toisen taulukon jokaiseen riviin, minkä jälkeen liitosehto tarkistetaan tuloksena olevan "liitetyn" rivin osalta (liitospredikaatti lasketaan). Jos ehto on tosi, vastaava "liitetty" rivi lisätään tulostaulukkoon.

Kuvattu toimintoalgoritmi on tiukasti looginen, eli se selittää vain tuloksen, joka tulisi saada toimintoa suoritettaessa, mutta ei edellytä, että tietty DBMS suorittaa yhteyden määritetyllä tavalla. Liitosoperaatiota voidaan toteuttaa useilla tavoilla, esimerkiksi sisäkkäiset silmukat join ( eng.  inner loops join ), hash join ( eng.  hash join ), yhdistäminen ( eng.  merge join ). Ainoa vaatimus on, että minkä tahansa toteutuksen tulee tuottaa loogisesti sama tulos kuin kuvattua algoritmia sovellettaessa.

VALITSE * Henkilöltä SISÄINEN LIITTY Kaupunki ON Henkilö . _ CityId = kaupunki . ID

Tulos:

Henkilö.Nimi Henkilö.Kaupunkitunnus City.Id Kaupungin nimi
Andrew yksi yksi Moskova
Leonid 2 2 Pietari
Sergei yksi yksi Moskova

OUTER JOIN

Kahden taulukon välinen liitos, joka sisältää välttämättä kaikki rivit joko yhdessä tai molemmissa taulukoissa.

LEFT OUTTER JOIN

Vasen ulompi liitosoperaattori LEFT OUTER JOIN yhdistää kaksi pöytää. Taulukoiden järjestys operaattorille on tärkeä, koska operaattori ei ole kommutoiva .

Tulostaulukon otsikko on yhdistettyjen taulukoiden otsikoiden liitto ( ketjutus ).

Tuloksen runko muodostetaan loogisesti seuraavasti. Olkoon vasen ja oikea taulukko yhdistetty predikaatilla (ehto) p .

  1. Tulos sisältää INNER JOINvasemman ja oikean taulukon sisäliitoksen ( ) predikaatilla p .
  2. Sitten tulokseen lisätään ne vasemmanpuoleisen taulukon rivit, jotka eivät sisältyneet sisäliitokseen vaiheessa 1. Tällaisten rivien kohdalla oikeaa taulukkoa vastaavat sarakkeet täytetään arvoilla NULL.
VALITSE * FROM Henkilö -- Vasen pöytä LEFT OUTTER JOIN Kaupunki -- Oikea pöytä ON Henkilö . CityId = kaupunki . ID

Tulos:

Henkilö.Nimi Henkilö.Kaupunkitunnus City.Id Kaupungin nimi
Andrew yksi yksi Moskova
Leonid 2 2 Pietari
Sergei yksi yksi Moskova
Gregory neljä TYHJÄ TYHJÄ
RIGHT OUTTER JOIN

Oikea ulompi liitosoperaattori RIGHT OUTER JOIN yhdistää kaksi pöytää. Taulukoiden järjestys operaattorille on tärkeä, koska operaattori ei ole kommutoiva .

Tulostaulukon otsikko on yhdistettyjen taulukoiden otsikoiden liitto ( ketjutus ).

Tuloksen runko muodostetaan loogisesti seuraavasti. Olkoon vasen ja oikea taulukko yhdistetty predikaatilla (ehto) p .

  1. Tulos sisältää INNER JOINvasemman ja oikean taulukon sisäliitoksen ( ) predikaatilla p .
  2. Sitten tulokseen lisätään ne oikeanpuoleisen taulukon rivit, jotka eivät sisältyneet sisäliitokseen vaiheessa 1. Tällaisten rivien kohdalla vasenta taulukkoa vastaavat sarakkeet täytetään arvoilla NULL.
VALITSE * FROM Henkilö -- Vasen pöytä OIKEA ULKOINEN JOIN Kaupunki -- Oikea pöytä ON Henkilö . CityId = kaupunki . ID

Tulos:

Henkilö.Nimi Henkilö.Kaupunkitunnus City.Id Kaupungin nimi
Andrew yksi yksi Moskova
Sergei yksi yksi Moskova
Leonid 2 2 Pietari
TYHJÄ TYHJÄ 3 Kazan
FULL OUTTER JOIN

Täysi ulompi liitosoperaattori FULL OUTER JOIN yhdistää kaksi pöytää. Operaattorin taulukoiden järjestyksellä ei ole merkitystä, koska operaattori on kommutoiva .

Tulostaulukon otsikko on yhdistettyjen taulukoiden otsikoiden liitto ( ketjutus ).

Tuloksen runko muodostetaan loogisesti seuraavasti. Yhdistetään ensimmäinen ja toinen taulukko predikaatilla (ehto) p . Sanat "ensimmäinen" ja "toinen" eivät osoita lausekkeen kirjoitusjärjestystä (mikä ei ole tärkeää), vaan niitä käytetään vain erottamaan taulukot toisistaan.

  1. Tulos sisältää INNER JOINensimmäisen ja toisen taulukon sisäliitoksen ( ) predikaatilla p .
  2. Tulos sisältää ne ensimmäisen taulukon rivit, jotka eivät sisältyneet sisäiseen liittämiseen vaiheessa 1. Tällaisilla riveillä toista taulukkoa vastaavat sarakkeet täytetään arvoilla NULL.
  3. Tulokseen lisätään ne toisen taulukon rivit, jotka eivät sisältyneet sisäliitokseen vaiheessa 1. Näillä riveillä ensimmäistä taulukkoa vastaavat sarakkeet täytetään arvoilla NULL.
VALITSE * FROM Henkilö TÄYSI ULKOINEN LIITTY Kaupunki ON Henkilö . CityId = kaupunki . ID

Tulos:

Henkilö.Nimi Henkilö.Kaupunkitunnus City.Id Kaupungin nimi
Andrew yksi yksi Moskova
Sergei yksi yksi Moskova
Leonid 2 2 Pietari
TYHJÄ TYHJÄ 3 Kazan
Gregory neljä TYHJÄ TYHJÄ

CROSS JOIN

Ristiliitosoperaattori tai karteesinen tuote yhdistää kaksi taulukkoa. Operaattorin taulukoiden järjestyksellä ei ole merkitystä, koska operaattori on kommutoiva . CROSS JOIN

Tulostaulukon otsikko on yhdistettyjen taulukoiden otsikoiden liitto ( ketjutus ).

Tuloksen runko muodostetaan loogisesti seuraavasti. Jokainen yhden taulukon rivi on yhdistetty toisen taulukon jokaiseen riviin, jolloin tuloksena saadaan kaikki mahdolliset kahden taulukon rivien yhdistelmät.

VALITSE * FROM henkilöstä RISTÄ LIITTY Kaupunki

tai

SELECT * FROM henkilö , kaupunki

Tulos:

Henkilö.Nimi Henkilö.Kaupunkitunnus City.Id Kaupungin nimi
Andrew yksi yksi Moskova
Andrew yksi 2 Pietari
Andrew yksi 3 Kazan
Leonid 2 yksi Moskova
Leonid 2 2 Pietari
Leonid 2 3 Kazan
Sergei yksi yksi Moskova
Sergei yksi 2 Pietari
Sergei yksi 3 Kazan
Gregory neljä yksi Moskova
Gregory neljä 2 Pietari
Gregory neljä 3 Kazan

Jos lisäät liitosehdon (predikaatti p ) WHERE-lauseeseen , eli rajoitukset monikkoyhdistelmille, tulos vastaa operaatiota , jolla on sama ehto: INNER JOIN

SELECT * FROM henkilö , kaupunki WHERE Henkilö . CityId = kaupunki . ID

Näin ollen lausekkeet t1, t2 WHERE pja t1 INNER JOIN t2 ON povat syntaktisesti vaihtoehtoisia muotoja kirjoittaa sama looginen sisäliitosoperaatio predikaatille p . Liitostoiminnon syntaksin CROSS JOIN + WHEREsanotaan olevan vanhentunut ja vanhentunut SQL ANSI [1] [2] -standardin mukaan .

Muistiinpanot

  1. SR0010: Älä käytä vanhaa syntaksia . Haettu 9. huhtikuuta 2012. Arkistoitu alkuperäisestä 10. kesäkuuta 2012.
  2. ANSI liittyy . Haettu 9. huhtikuuta 2012. Arkistoitu alkuperäisestä 15. kesäkuuta 2012.

Linkit