Gå med (SQL)

Den stabila versionen checkades ut den 11 maj 2022 . Det finns overifierade ändringar i mallar eller .

JOIN  är en operatör för SQL- språket , som är en implementering av den relationella algebra- join-operationen . Ingår i FROM-satsen i SELECT- , UPDATE- och DELETE- satserna .

Join-operationen, liksom andra binära operationer , är utformad för att hämta data från två tabeller och inkludera dessa data i en resultatuppsättning. De utmärkande egenskaperna för sammanfogningsoperationen är följande:

Bestämningen av vilka källsträngar som kommer att inkluderas i resultatet och i vilka kombinationer beror på typen av joinoperation och på det explicit specificerade joinvillkoret . Sammanfogningsvillkoret, det vill säga villkoret för att matcha rader med källtabeller med varandra, är ett logiskt uttryck ( predikat ).

Om det är nödvändigt att sammanfoga inte två, utan flera tabeller, tillämpas joinoperationen flera gånger (successivt).

SQL JOIN-operationen är en implementering av den relationella algebra-join-operationen endast i viss utsträckning, eftersom i relationsdatamodellen en join utförs på relationer, som är uppsättningar , och i SQL, på tabeller, som är multiset . Resultaten av operationer är också generellt sett olika: i relationalgebra ger resultatet av en join en relation (uppsättning) och i SQL en tabell (multiset).

Beskrivning av operatören

FRÅN Tabell 1 { INRE | { VÄNSTER | HÖGER | FULL } YTTRE | CROSS } JOIN Table2 { ON < condition > | ANVÄNDER ( field_name [,... n ]) }

I de flesta DBMS, när du anger orden LEFT, RIGHT, FULLkan ordet OUTERutelämnas. Ordet INNERkan också utelämnas i de flesta DBMS.

I det allmänna fallet kontrollerar DBMS villkoret ( predikat ) när en anslutning upprättas . Om namnen på kolumnerna som tabellerna sammanfogas med är desamma kan du istället använda . Villkoret är inte specificerat för. ONUSINGCROSS JOIN

För korskoppling (kartesisk produkt) CROSS JOINanvänder vissa SQL-implementationer kommaoperatorn ( , ):

FRÅN Tabell1 , Tabell2

Typer av JOIN-operator

Följande tabeller kommer att användas för ytterligare förklaringar:

Stad (städer)
ID namn
ett Moskva
2 St. Petersburg
3 Kazan
Person (människor)
namn Stads-ID
Andrew ett
Leonid 2
Sergey ett
Gregory fyra

INNER JOIN

Den inre sammanfogningsoperatören INNER JOIN sammanfogar två bord. Ordningen på tabellerna för operatorn är oviktig eftersom operatorn är kommutativ .

Rubriken i resultattabellen är föreningen ( sammanlänkning ) av rubrikerna för de sammanfogade tabellerna.

Resultatets kropp är logiskt utformad enligt följande. Varje rad i en tabell jämförs med varje rad i den andra tabellen, varefter sammanfogningsvillkoret kontrolleras för den resulterande "sammanfogade" raden (sammanfogningspredikatet beräknas). Om villkoret är sant läggs motsvarande "sammanfogade" rad till i resultattabellen.

Den beskrivna algoritmen för åtgärder är strikt logisk, det vill säga den förklarar bara resultatet som ska erhållas när man utför operationen, men föreskriver inte att en viss DBMS utför anslutningen på det angivna sättet. Det finns flera sätt att implementera joinoperationen, till exempel kapslade loopar join ( eng.  inner loops join ), hash join ( eng.  hash join ), merge join ( eng.  merge join ). Det enda kravet är att varje implementering logiskt ska ge samma resultat som när den beskrivna algoritmen tillämpas.

VÄLJ * FRÅN Person INNER JOIN City ON Person . CityId = stad . ID

Resultat:

Person.namn Person.CityId City.Id Stadens namn
Andrew ett ett Moskva
Leonid 2 2 St. Petersburg
Sergey ett ett Moskva

YTTRE JOIN

En koppling mellan två tabeller som nödvändigtvis inkluderar alla rader i antingen en eller båda tabellerna.

VÄNSTER YTTRE JOIN

Den vänstra yttre sammanfogningsoperatören LEFT OUTER JOIN förenar två bord. Tabellordningen för en operator är viktig eftersom operatorn inte är kommutativ .

Rubriken i resultattabellen är föreningen ( sammanlänkning ) av rubrikerna för de sammanfogade tabellerna.

Resultatets kropp är logiskt utformad enligt följande. Låt vänster och höger tabell förenas av predikatet (villkor) p .

  1. Resultatet inkluderar en inre sammanfogning ( INNER JOIN) av de vänstra och högra tabellen med predikatet p .
  2. Sedan läggs till resultatet de rader i den vänstra tabellen som inte ingick i den inre kopplingen i steg 1. För sådana rader fylls kolumnerna som motsvarar den högra tabellen med värden NULL.
VÄLJ * FRÅN Person - Vänster bord VÄNSTER YTTRE JOIN Stad - Höger bord Person . CityId = stad . ID

Resultat:

Person.namn Person.CityId City.Id Stadens namn
Andrew ett ett Moskva
Leonid 2 2 St. Petersburg
Sergey ett ett Moskva
Gregory fyra NULL NULL
HÖGER YTTRE JOIN

Den högra yttre sammanfogningsoperatören RIGHT OUTER JOIN förenar två bord. Tabellordningen för en operator är viktig eftersom operatorn inte är kommutativ .

Rubriken i resultattabellen är föreningen ( sammanlänkning ) av rubrikerna för de sammanfogade tabellerna.

Resultatets kropp är logiskt utformad enligt följande. Låt vänster och höger tabell förenas av predikatet (villkor) p .

  1. Resultatet inkluderar en inre sammanfogning ( INNER JOIN) av de vänstra och högra tabellen med predikatet p .
  2. Sedan läggs till resultatet de rader i den högra tabellen som inte ingick i den inre kopplingen i steg 1. För sådana rader fylls kolumnerna som motsvarar den vänstra tabellen med värden NULL.
VÄLJ * FRÅN Person -- Vänster bord HÖGER YTTRE JOIN Stad -- Höger bord Person . CityId = stad . ID

Resultat:

Person.namn Person.CityId City.Id Stadens namn
Andrew ett ett Moskva
Sergey ett ett Moskva
Leonid 2 2 St. Petersburg
NULL NULL 3 Kazan
FULLSTÄNDIG YTTRE JOIN

Den fullständiga yttre sammanfogningsoperatören FULL OUTER JOIN förenar två bord. Ordningen på tabellerna för operatorn är oviktig eftersom operatorn är kommutativ .

Rubriken i resultattabellen är föreningen ( sammanlänkning ) av rubrikerna för de sammanfogade tabellerna.

Resultatets kropp är logiskt utformad enligt följande. Låt den första och andra tabellen sammanfogas av predikatet (villkor) p . Orden "första" och "andra" här anger inte i vilken ordning uttrycket är skrivet (vilket är oviktigt), utan används endast för att skilja mellan tabeller.

  1. Resultatet inkluderar en inre koppling ( INNER JOIN) av den första och andra tabellen med predikatet p .
  2. Resultatet inkluderar de rader i den första tabellen som inte ingick i den inre kopplingen i steg 1. För sådana rader är kolumnerna som motsvarar den andra tabellen fyllda med värden NULL.
  3. Till resultatet läggs de rader i den andra tabellen som inte ingick i den inre kopplingen i steg 1. För sådana rader fylls kolumnerna som motsvarar den första tabellen med värden NULL.
VÄLJ * FRÅN Person FULLSTÄNDIG YTTRE GÅ MED Stad Person . CityId = stad . ID

Resultat:

Person.namn Person.CityId City.Id Stadens namn
Andrew ett ett Moskva
Sergey ett ett Moskva
Leonid 2 2 St. Petersburg
NULL NULL 3 Kazan
Gregory fyra NULL NULL

CROSS JOIN

Korskopplingsoperatören , eller kartesisk produkt, sammanfogar två tabeller. Ordningen på tabellerna för operatorn är oviktig eftersom operatorn är kommutativ . CROSS JOIN

Rubriken i resultattabellen är föreningen ( sammanlänkning ) av rubrikerna för de sammanfogade tabellerna.

Resultatets kropp är logiskt utformad enligt följande. Varje rad i en tabell är kopplad till varje rad i den andra tabellen, vilket ger som ett resultat alla möjliga kombinationer av rader av två tabeller.

VÄLJ * FRÅN Person CROSS JOIN City

eller

VÄLJ * FRÅN Person , Stad

Resultat:

Person.namn Person.CityId City.Id Stadens namn
Andrew ett ett Moskva
Andrew ett 2 St. Petersburg
Andrew ett 3 Kazan
Leonid 2 ett Moskva
Leonid 2 2 St. Petersburg
Leonid 2 3 Kazan
Sergey ett ett Moskva
Sergey ett 2 St. Petersburg
Sergey ett 3 Kazan
Gregory fyra ett Moskva
Gregory fyra 2 St. Petersburg
Gregory fyra 3 Kazan

Om du lägger till ett joinvillkor (predikat p ) i WHERE-satsen , det vill säga restriktioner för kombinationer av tupler, så motsvarar resultatet en operation med samma villkor: INNER JOIN

VÄLJ * FRÅN Person , Stad VAR Person . CityId = stad . ID

Sålunda är uttrycken t1, t2 WHERE poch t1 INNER JOIN t2 ON psyntaktiskt alternativa former för att skriva samma logiska inre joinoperation på predikatet p . Syntaxen CROSS JOIN + WHEREför joinoperationen sägs vara utfasad och utfasad av SQL ANSI [1] [2] -standarden .

Anteckningar

  1. SR0010: Använd inte äldre syntax . Hämtad 9 april 2012. Arkiverad från originalet 10 juni 2012.
  2. ANSI går med . Hämtad 9 april 2012. Arkiverad från originalet 15 juni 2012.

Länkar