Deltag (SQL)
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:
| ID | Navn |
|---|---|
| en | Moskva |
| 2 | Sankt Petersborg |
| 3 | Kazan |
| 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 .
- Resultatet inkluderer en indre joinforbindelse (
INNER JOIN) af venstre og højre tabel med prædikatet p . - 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
PÅ 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 .
- Resultatet inkluderer en indre joinforbindelse (
INNER JOIN) af venstre og højre tabel med prædikatet p . - 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
PÅ 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.
- Resultatet inkluderer en indre joinforbindelse (
INNER JOIN) af den første og anden tabel med prædikatet p . - 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. - 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
PÅ 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
- ↑ SR0010: Brug ikke ældre syntaks . Hentet 9. april 2012. Arkiveret fra originalen 10. juni 2012.
- ↑ ANSI slutter sig til . Hentet 9. april 2012. Arkiveret fra originalen 15. juni 2012.
Links
- Beskrivelse af jointyper i Oracle Arkiveret 3. juni 2017 på Wayback Machine (russisk)
- Jeff Atwood, en visuel forklaring af SQL -forbindelser