close

Deltag (SQL)

Gå til navigation Gå til søg

JOIN  er en operator af SQL -sproget , som er en implementering af den relationelle algebra join-operation . Inkluderet i FROM-sætningen af ​​SELECT- , UPDATE- og DELETE- sætninger .

Sammenkædningsoperationen er ligesom andre binære operationer designet til at hente data fra to tabeller og inkludere disse data i ét resultatsæt. De karakteristiske træk ved join-operationen er som følger:

  • resultattabelskemaet inkluderer kolonner fra begge kildetabeller ( operandtabeller ), dvs. resultatskemaet er en "kæde" af operandskemaer;
  • hver række i resultattabellen er en "sammenkædning" af en række fra en operandtabel med en række i den anden operandtabel.

Bestemmelsen af, hvilke kildestrenge, der skal inkluderes i resultatet og i hvilke kombinationer, afhænger af typen af ​​join-operationen og af den eksplicit specificerede join-betingelse . Sammenkædningsbetingelsen, dvs. betingelsen for at matche rækker af kildetabeller med hinanden, er et logisk udtryk ( prædikat ).

Hvis det er nødvendigt at forbinde ikke to, men flere tabeller, anvendes sammenføjningsoperationen flere gange (efter hinanden).

SQL JOIN-operationen er kun i et vist omfang en implementering af den relationelle algebra-join-operation, da der i relationsdatamodellen udføres en join på relationer, som er sæt , og i SQL på tabeller, som er multisæt . Resultaterne af operationer er også generelt forskellige: i relationel algebra giver resultatet af en join en relation (sæt), og i SQL en tabel (multiset).

Beskrivelse af operatøren

FRA 
  Tabel 1 
  { INDRE  |  { VENSTRE  |  HØJRE  |  FULD }  YDRE  |  CROSS  }  JOIN 
  Tabel2 
    { ON  < condition >  |  USING  ( feltnavn  [,...  n ]) }

I de fleste DBMS, når ordene specificeres LEFT, RIGHTkan FULLordet OUTERudelades. Ordet INNERkan også udelades i de fleste DBMS'er.

I det generelle tilfælde kontrollerer DBMS tilstanden ( prædikat ) betingelsen, når der oprettes en forbindelse . Hvis navnene på de kolonner, som tabellerne er forbundet med, er de samme, kan ONdu i stedet bruge USING. Betingelsen CROSS JOINer ikke specificeret for.

Til krydsforbindelse (kartesisk produkt) CROSS JOINbruger nogle SQL-implementeringer kommaoperatoren ( , ):

FRA 
  Tabel1 , 
  Tabel2

Typer af JOIN-operatør

Følgende tabeller vil blive brugt til yderligere forklaringer:

By (byer)
ID Navn
en Moskva
2 Sankt Petersborg
3 Kazan
Person (mennesker)
Navn By-id
Andrew en
Leonid 2
Sergey en
Gregory fire

INDRE JOIN

Den indre joinoperator INNER JOIN forbinder to borde. Rækkefølgen af ​​tabellerne for operatoren er ligegyldig, fordi operatoren er kommutativ .

Overskriften på resultattabellen er sammenkædningen ( sammenkædning ) af overskrifterne på de sammenføjede tabeller.

Resultatets krop er logisk dannet som følger. Hver række i en tabel sammenlignes med hver række i den anden tabel, hvorefter joinbetingelsen kontrolleres for den resulterende "joined" række (sammenføjningsprædikatet beregnes). Hvis betingelsen er sand, tilføjes den tilsvarende "sammenføjede" række til resultattabellen.

Den beskrevne algoritme for handlinger er strengt logisk, det vil sige, den forklarer kun det resultat, der skal opnås, når du udfører operationen, men foreskriver ikke, at en bestemt DBMS udfører forbindelsen på den angivne måde. Der er flere måder at implementere join-operationen på, f.eks. indlejrede sløjfer join ( eng.  indre loops join ), hash join ( eng.  hash join ), merge join ( eng.  merge join ). Det eneste krav er, at enhver implementering logisk skal give det samme resultat, som ved anvendelse af den beskrevne algoritme.

VÆLG  * 
FRA 
  Person 
  INNER  JOIN 
  By 
    ON  Person . CityId  =  by . ID

Resultat:

Person.navn Person.CityId By.Id Bynavn
Andrew en en Moskva
Leonid 2 2 Sankt Petersborg
Sergey en en Moskva

YDRE JOIN

En joinforbindelse mellem to tabeller, der nødvendigvis inkluderer alle rækker i enten den ene eller begge tabeller.

VENSTRE YDRE JOIN

Den venstre ydre join- LEFT OUTER JOIN operator forbinder to borde. Rækkefølgen af ​​tabeller for en operator er vigtig, fordi operatoren ikke er kommutativ .

Overskriften på resultattabellen er sammenkædningen ( sammenkædning ) af overskrifterne på de sammenføjede tabeller.

Resultatets krop er logisk dannet som følger. Lad venstre og højre tabel forbindes af prædikatet (betingelsen) p .

  1. Resultatet inkluderer en indre joinforbindelse ( INNER JOIN) af venstre og højre tabel med prædikatet p .
  2. Derefter tilføjes de rækker i den venstre tabel, som ikke var inkluderet i den indre joinforbindelse i trin 1. For sådanne rækker er kolonnerne, der svarer til den højre tabel, fyldt med værdier NULL.
VÆLG  * 
FRA 
  Person  - Venstre bord 
  VENSTRE  YDRE  JOIN 
  By    - Højre bord 
     Person . CityId  =  by . ID

Resultat:

Person.navn Person.CityId By.Id Bynavn
Andrew en en Moskva
Leonid 2 2 Sankt Petersborg
Sergey en en Moskva
Gregory fire NUL NUL

HØJRE YDRE JOIN

Den højre ydre join- RIGHT OUTER JOIN operator forbinder to borde. Rækkefølgen af ​​tabeller for en operator er vigtig, fordi operatoren ikke er kommutativ .

Overskriften på resultattabellen er sammenkædningen ( sammenkædning ) af overskrifterne på de sammenføjede tabeller.

Resultatets krop er logisk dannet som følger. Lad venstre og højre tabel forbindes af prædikatet (betingelsen) p .

  1. Resultatet inkluderer en indre joinforbindelse ( INNER JOIN) af venstre og højre tabel med prædikatet p .
  2. Derefter tilføjes de rækker i den højre tabel, som ikke var inkluderet i den indre joinforbindelse i trin 1. For sådanne rækker er kolonnerne, der svarer til den venstre tabel, fyldt med værdier NULL.
VÆLG  * 
FRA 
  Person  - Venstre bord 
  HØJRE  YDRE  JOIN 
  By    - Højre bord 
     Person . CityId  =  by . ID

Resultat:

Person.navn Person.CityId By.Id Bynavn
Andrew en en Moskva
Sergey en en Moskva
Leonid 2 2 Sankt Petersborg
NUL NUL 3 Kazan

FULD YDRE JOIN

Den fulde ydre join- FULL OUTER JOIN operator forbinder to borde. Rækkefølgen af ​​tabellerne for operatoren er ligegyldig, fordi operatoren er kommutativ .

Overskriften på resultattabellen er sammenkædningen ( sammenkædning ) af overskrifterne på de sammenføjede tabeller.

Resultatets krop er logisk dannet som følger. Lad den første og anden tabel forbindes af prædikatet (betingelsen) p . Ordene "første" og "anden" her angiver ikke den rækkefølge, udtrykket er skrevet i (hvilket er ligegyldigt), men bruges kun til at skelne mellem tabeller.

  1. Resultatet inkluderer en indre joinforbindelse ( INNER JOIN) af den første og anden tabel med prædikatet p .
  2. Resultatet inkluderer de rækker i den første tabel, der ikke var inkluderet i den indre joinforbindelse i trin 1. For sådanne rækker er kolonnerne, der svarer til den anden tabel, fyldt med værdier NULL.
  3. Resultatet tilføjes de rækker i den anden tabel, som ikke var inkluderet i den indre sammenkædning i trin 1. For sådanne rækker er kolonnerne, der svarer til den første tabel, fyldt med værdier NULL.
VÆLG  * 
FRA 
  Person 
  FULD  YDRE  JOIN 
  By 
     Person . CityId  =  by . ID

Resultat:

Person.navn Person.CityId By.Id Bynavn
Andrew en en Moskva
Sergey en en Moskva
Leonid 2 2 Sankt Petersborg
NUL NUL 3 Kazan
Gregory fire NUL NUL

CROSS JOIN

Cross join- operatøren eller kartesisk produkt CROSS JOIN forbinder to tabeller. Rækkefølgen af ​​tabellerne for operatoren er ligegyldig, fordi operatoren er kommutativ .

Overskriften på resultattabellen er sammenkædningen ( sammenkædning ) af overskrifterne på de sammenføjede tabeller.

Resultatets krop er logisk dannet som følger. Hver række i en tabel er forbundet med hver række i den anden tabel, hvilket giver som et resultat alle mulige kombinationer af rækker af to tabeller.

VÆLG  * 
FRA 
  Person 
  CROSS  JOIN 
  By

eller

VÆLG  * 
FRA 
  Person , 
  By

Resultat:

Person.navn Person.CityId By.Id Bynavn
Andrew en en Moskva
Andrew en 2 Sankt Petersborg
Andrew en 3 Kazan
Leonid 2 en Moskva
Leonid 2 2 Sankt Petersborg
Leonid 2 3 Kazan
Sergey en en Moskva
Sergey en 2 Sankt Petersborg
Sergey en 3 Kazan
Gregory fire en Moskva
Gregory fire 2 Sankt Petersborg
Gregory fire 3 Kazan

Hvis du tilføjer en join-betingelse (prædikat p ) i WHERE-sætningen , det vil sige begrænsninger for kombinationer af tupler, så svarer resultatet til en operation med samme betingelse: INNER JOIN

VÆLG  * 
FRA 
  Person , 
  By 
HVOR 
  Person . CityId  =  by . ID

Således er udtrykkene t1, t2 WHERE pog t1 INNER JOIN t2 ON psyntaktisk alternative former for at skrive den samme logiske indre joinoperation på prædikatet p . Syntaksen CROSS JOIN + WHEREfor join-operationen siges at være forældet og forældet af SQL ANSI [1] [2] -standarden .

Noter

  1. SR0010: Brug ikke ældre syntaks . Hentet 9. april 2012. Arkiveret fra originalen 10. juni 2012.
  2. ANSI slutter sig til . Hentet 9. april 2012. Arkiveret fra originalen 15. juni 2012.

Links