Deelnemen (SQL)
JOIN is een operator van de SQL - taal , een implementatie van de relationele algebra join - bewerking . Opgenomen in de FROM-clausule van SELECT- , UPDATE- en DELETE- instructies .
De join-bewerking is, net als andere binaire bewerkingen , ontworpen om gegevens uit twee tabellen op te halen en die gegevens in één resultaatset op te nemen. De onderscheidende kenmerken van de samenvoegbewerking zijn als volgt:
- het resultaattabelschema bevat kolommen uit beide brontabellen ( operandtabellen ), d.w.z. het resultaatschema is een "keten" van operandschema's;
- elke rij van de resultatentabel is een "aaneenschakeling" van een rij uit de ene operandtabel met een rij van de tweede operandtabel.
De bepaling welke source strings in het resultaat zullen worden opgenomen en in welke combinaties hangt af van het type join-bewerking en van de expliciet gespecificeerde join-voorwaarde . De join-voorwaarde, d.w.z. de voorwaarde dat rijen brontabellen met elkaar overeenkomen, is een logische uitdrukking ( predikaat ).
Als het nodig is om niet twee, maar meerdere tabellen samen te voegen, wordt de samenvoegbewerking meerdere keren (opeenvolgend) toegepast.
De SQL JOIN-bewerking is slechts tot op zekere hoogte een implementatie van de relationele algebra join-bewerking, aangezien in het relationele gegevensmodel een join wordt uitgevoerd op relaties, die sets zijn , en in SQL op tabellen, die multisets zijn . De resultaten van bewerkingen zijn over het algemeen ook anders: in relationele algebra geeft het resultaat van een join een relatie (set) en in SQL een tabel (multiset).
Beschrijving van de operator
VAN
Tabel1
{ BINNEN | { LINKS | RECHTS | VOL } BUITEN | CROSS } JOIN
Table2
{ ON < conditie > | GEBRUIKEN ( veldnaam [,... n ]) }
In de meeste DBMS kan bij het specificeren van de woorden LEFT, het woord RIGHTworden weggelaten. Het woord kan ook worden weggelaten in de meeste DBMS'en.
FULLOUTERINNER
In het algemeen controleert het DBMS de conditie ( predikaat ) conditie bij het maken van een verbinding . Als de namen van de kolommen waarmee de tabellen zijn verbonden hetzelfde zijn, ONkunt u in plaats daarvan gebruiken USING. De CROSS JOINvoorwaarde is niet gespecificeerd voor.
Voor cross join (Cartesiaans product) CROSS JOIN, gebruiken sommige SQL-implementaties de komma-operator ( , ):
VAN
Tabel1 ,
Tabel2
Typen JOIN-operatoren
De volgende tabellen worden gebruikt voor verdere uitleg:
| ID kaart | Naam |
|---|---|
| een | Moskou |
| 2 | St. Petersburg |
| 3 | Kazan |
| Naam | Stadsidentificatie |
|---|---|
| Andrew | een |
| Leonid | 2 |
| Sergej | een |
| Gregorius | vier |
INNERLIJKE JOIN
De inner join- INNER JOIN operator voegt twee tabellen samen. De volgorde van de tabellen voor de operator is onbelangrijk omdat de operator commutatief is .
De koptekst van de resultatentabel is de unie ( aaneenschakeling ) van de kopteksten van de samengevoegde tabellen.
Het lichaam van het resultaat is logisch gevormd als volgt. Elke rij van een tabel wordt vergeleken met elke rij van de tweede tabel, waarna de join-voorwaarde wordt gecontroleerd voor de resulterende "joined" rij (het join-predicaat wordt berekend). Als de voorwaarde waar is, wordt de overeenkomstige "samengevoegde" rij toegevoegd aan de resultatentabel.
Het beschreven algoritme van acties is strikt logisch, dat wil zeggen, het verklaart alleen het resultaat dat moet worden verkregen bij het uitvoeren van de bewerking, maar schrijft niet voor dat een bepaald DBMS de verbinding op de gespecificeerde manier uitvoert. Er zijn verschillende manieren om de join-bewerking te implementeren, bijvoorbeeld geneste loops join ( eng. inner loops join ), hash join ( eng. hash join ), merge join ( eng. merge join ). De enige vereiste is dat elke implementatie logischerwijs hetzelfde resultaat moet opleveren als bij het toepassen van het beschreven algoritme.
SELECTEER *
VAN
Persoon
BINNEN WORD LID
Stad
AAN Persoon . StadId = stad . ID kaart
Resultaat:
| Persoon.Naam | Persoon.CityId | Stad.Id | Stads naam |
|---|---|---|---|
| Andrew | een | een | Moskou |
| Leonid | 2 | 2 | St. Petersburg |
| Sergej | een | een | Moskou |
OUTER JOIN
Een join tussen twee tabellen die noodzakelijkerwijs alle rijen in een of beide tabellen omvat.
LINKER BUITENSTE JOIN
De linker outer join- LEFT OUTER JOIN operator voegt twee tabellen samen. De volgorde van tabellen voor een operator is belangrijk omdat de operator niet commutatief is .
De koptekst van de resultatentabel is de unie ( aaneenschakeling ) van de kopteksten van de samengevoegde tabellen.
Het lichaam van het resultaat is logisch gevormd als volgt. Laat de linker- en rechtertafel worden verbonden door het predikaat (voorwaarde) p .
- Het resultaat bevat een inner join (
INNER JOIN) van de linker- en rechtertafel door het predikaat p . - Vervolgens worden aan het resultaat de rijen van de linkertabel toegevoegd die niet waren opgenomen in de inner join in stap 1. Voor dergelijke rijen worden de kolommen die overeenkomen met de rechtertabel gevuld met waarden
NULL.
SELECT *
FROM
Persoon -- Linker tafel
LINKER BUITEN JOIN
Stad -- Rechter tafel
ON Persoon . StadId = stad . ID kaart
Resultaat:
| Persoon.Naam | Persoon.CityId | Stad.Id | Stads naam |
|---|---|---|---|
| Andrew | een | een | Moskou |
| Leonid | 2 | 2 | St. Petersburg |
| Sergej | een | een | Moskou |
| Gregorius | vier | NUL | NUL |
RECHTS BUITENSTE JOIN
De rechter outer join- RIGHT OUTER JOIN operator voegt twee tabellen samen. De volgorde van tabellen voor een operator is belangrijk omdat de operator niet commutatief is .
De koptekst van de resultatentabel is de unie ( aaneenschakeling ) van de kopteksten van de samengevoegde tabellen.
Het lichaam van het resultaat is logisch gevormd als volgt. Laat de linker- en rechtertafel worden verbonden door het predikaat (voorwaarde) p .
- Het resultaat bevat een inner join (
INNER JOIN) van de linker- en rechtertafel door het predikaat p . - Vervolgens worden aan het resultaat de rijen van de rechtertabel toegevoegd die niet waren opgenomen in de inner join in stap 1. Voor dergelijke rijen worden de kolommen die overeenkomen met de linkertabel gevuld met waarden
NULL.
SELECT *
FROM
Persoon -- Linker tafel
RECHTS BUITEN JOIN
Stad -- Rechter tafel
ON Persoon . StadId = stad . ID kaart
Resultaat:
| Persoon.Naam | Persoon.CityId | Stad.Id | Stads naam |
|---|---|---|---|
| Andrew | een | een | Moskou |
| Sergej | een | een | Moskou |
| Leonid | 2 | 2 | St. Petersburg |
| NUL | NUL | 3 | Kazan |
VOLLEDIGE OUTER JOIN
De volledige outer join- FULL OUTER JOIN operator voegt twee tabellen samen. De volgorde van de tabellen voor de operator is onbelangrijk omdat de operator commutatief is .
De koptekst van de resultatentabel is de unie ( aaneenschakeling ) van de kopteksten van de samengevoegde tabellen.
Het lichaam van het resultaat is logisch gevormd als volgt. Laat de eerste en tweede tafel worden verbonden door het predikaat (voorwaarde) p . De woorden "eerste" en "tweede" geven hier niet de volgorde aan waarin de uitdrukking is geschreven (wat niet belangrijk is), maar worden alleen gebruikt om onderscheid te maken tussen tabellen.
- Het resultaat bevat een inner join (
INNER JOIN) van de eerste en tweede tafel door het predikaat p . - Het resultaat omvat de rijen van de eerste tabel die niet zijn opgenomen in de inner join in stap 1. Voor dergelijke rijen worden de kolommen die overeenkomen met de tweede tabel gevuld met waarden
NULL. - De rijen van de tweede tabel die niet waren opgenomen in de inner join in stap 1. Voor dergelijke rijen worden de kolommen die overeenkomen met de eerste tabel gevuld met waarden
NULL.
SELECTEER *
VAN
Persoon
VOLLEDIG BUITEN JOIN
Stad
AAN Persoon . StadId = stad . ID kaart
Resultaat:
| Persoon.Naam | Persoon.CityId | Stad.Id | Stads naam |
|---|---|---|---|
| Andrew | een | een | Moskou |
| Sergej | een | een | Moskou |
| Leonid | 2 | 2 | St. Petersburg |
| NUL | NUL | 3 | Kazan |
| Gregorius | vier | NUL | NUL |
CROSS JOIN
De cross join- operator , of cartesiaans product, CROSS JOIN voegt twee tabellen samen. De volgorde van de tabellen voor de operator is onbelangrijk omdat de operator commutatief is .
De koptekst van de resultatentabel is de unie ( aaneenschakeling ) van de kopteksten van de samengevoegde tabellen.
Het lichaam van het resultaat is logisch gevormd als volgt. Elke rij van een tabel is verbonden met elke rij van de tweede tabel, waardoor alle mogelijke combinaties van rijen van twee tabellen worden verkregen.
SELECTEER *
VAN
Persoon
CROSS JOIN
Stad
of
SELECTEER *
VAN
Persoon ,
Stad
Resultaat:
| Persoon.Naam | Persoon.CityId | Stad.Id | Stads naam |
|---|---|---|---|
| Andrew | een | een | Moskou |
| Andrew | een | 2 | St. Petersburg |
| Andrew | een | 3 | Kazan |
| Leonid | 2 | een | Moskou |
| Leonid | 2 | 2 | St. Petersburg |
| Leonid | 2 | 3 | Kazan |
| Sergej | een | een | Moskou |
| Sergej | een | 2 | St. Petersburg |
| Sergej | een | 3 | Kazan |
| Gregorius | vier | een | Moskou |
| Gregorius | vier | 2 | St. Petersburg |
| Gregorius | vier | 3 | Kazan |
Als u een join-voorwaarde (predicaat p ) toevoegt in de WHERE-component , dat wil zeggen beperkingen op combinaties van tuples, dan is het resultaat gelijk aan een bewerking met dezelfde voorwaarde:
INNER JOIN
SELECT *
FROM
Persoon ,
Plaats
WHERE
Persoon . StadId = stad . ID kaart
De uitdrukkingen t1, t2 WHERE pen t1 INNER JOIN t2 ON pzijn dus syntactisch alternatieve vormen van het schrijven van dezelfde logische inner join-bewerking op het predikaat p . Er wordt gezegd dat de syntaxis CROSS JOIN + WHEREvoor de join-bewerking is afgeschaft en gedeprecieerd door de SQL ANSI [1] [2] -standaard .
Opmerkingen
- ↑ SR0010: Gebruik geen verouderde syntaxis . Ontvangen op 9 april 2012. Gearchiveerd van het origineel op 10 juni 2012.
- ↑ ANSI sluit zich aan . Ontvangen op 9 april 2012. Gearchiveerd van het origineel op 15 juni 2012.
Links
- Beschrijving van join-typen in Oracle Gearchiveerd op 3 juni 2017 op de Wayback Machine (Russisch)
- Jeff Atwood, een visuele uitleg van SQL Joins