JOIN este un operator al limbajului SQL , care este o implementare a operației de algebră relațională . Inclus în clauza FROM a instrucțiunilor SELECT , UPDATE și DELETE .
Operația de îmbinare, ca și alte operațiuni binare , este concepută pentru a prelua date din două tabele și pentru a include acele date într-un singur set de rezultate. Caracteristicile distinctive ale operațiunii de îmbinare sunt următoarele:
Determinarea șirurilor sursă vor fi incluse în rezultat și în ce combinații depinde de tipul operației de îmbinare și de condiția de îmbinare specificată în mod explicit . Condiția de îmbinare, adică condiția de potrivire a rândurilor de tabele sursă între ele, este o expresie logică ( predicat ).
Dacă este necesar să se alăture nu două, ci mai multe tabele, operația de îmbinare se aplică de mai multe ori (succesiv).
Operația SQL JOIN este o implementare a operației de algebră relațională de îmbinare doar într-o oarecare măsură, deoarece în modelul de date relaționale o îmbinare se realizează pe relații, care sunt mulțimi , iar în SQL, pe tabele, care sunt multiseturi . Rezultatele operațiilor sunt și ele, în general, diferite: în algebra relațională, rezultatul unei îmbinări dă o relație (mult), iar în SQL, un tabel (multiset).
În majoritatea DBMS, atunci când se specifică cuvintele LEFT, RIGHT, FULLcuvântul OUTERpoate fi omis. Cuvântul INNERpoate fi, de asemenea, omis în majoritatea SGBD-urilor.
În cazul general, SGBD verifică condiția ( predicatul ) când se realizează o conexiune . Dacă numele coloanelor prin care sunt unite tabelele sunt aceleași, atunci puteți utiliza în schimb . Condiția nu este specificată pentru. ONUSINGCROSS JOIN
Pentru îmbinarea încrucișată (produs cartezian) CROSS JOIN, unele implementări SQL folosesc operatorul virgulă ( , ):
DIN Tabelul 1 , Tabelul 2Următoarele tabele vor fi folosite pentru explicații suplimentare:
Oraș (Orașe)ID | Nume |
---|---|
unu | Moscova |
2 | St.Petersburg |
3 | Kazan |
Nume | CityId |
---|---|
Andrew | unu |
Leonid | 2 |
Serghei | unu |
Grigore | patru |
Operatorul de îmbinare interioară INNER JOIN unește două tabele. Ordinea tabelelor pentru operator este neimportantă deoarece operatorul este comutativ .
Antetul tabelului rezultat este uniunea ( concatenarea ) antetelor tabelelor unite.
Corpul rezultatului este format logic după cum urmează. Fiecare rând al unui tabel este comparat cu fiecare rând al celui de-al doilea tabel, după care condiția de îmbinare este verificată pentru rândul „unit” rezultat (se calculează predicatul de îmbinare). Dacă condiția este adevărată, rândul „unit” corespunzător este adăugat la tabelul cu rezultate.
Algoritmul de acțiuni descris este strict logic, adică explică doar rezultatul care ar trebui obținut atunci când se efectuează operația, dar nu prescrie ca un anumit DBMS să realizeze conexiunea în modul specificat. Există mai multe moduri de a implementa operația de îmbinare, de exemplu, îmbinare bucle imbricate ( eng. bucle interioare join ), hash join ( ing. hash join ), merge join ( ing. merge join ). Singura cerință este ca orice implementare să producă în mod logic același rezultat ca atunci când se aplică algoritmul descris.
SELECTAȚI * FROM Persoană INNER JOIN Oraș ON Persoană . CityId = oraș . IDRezultat:
Persoană.Nume | Person.CityId | Oraș.Id | Numele orasului |
---|---|---|---|
Andrew | unu | unu | Moscova |
Leonid | 2 | 2 | St.Petersburg |
Serghei | unu | unu | Moscova |
O îmbinare între două tabele care include în mod necesar toate rândurile din unul sau ambele tabele.
LEFT OUTER JOINOperatorul de îmbinare externă stângă LEFT OUTER JOIN unește două tabele. Ordinea tabelelor pentru un operator este importantă deoarece operatorul nu este comutativ .
Antetul tabelului rezultat este uniunea ( concatenarea ) antetelor tabelelor unite.
Corpul rezultatului este format logic după cum urmează. Fie unite tabelele din stânga și din dreapta prin predicatul (condiția) p .
Rezultat:
Persoană.Nume | Person.CityId | Oraș.Id | Numele orasului |
---|---|---|---|
Andrew | unu | unu | Moscova |
Leonid | 2 | 2 | St.Petersburg |
Serghei | unu | unu | Moscova |
Grigore | patru | NUL | NUL |
Operatorul de îmbinare externă dreapta RIGHT OUTER JOIN unește două tabele. Ordinea tabelelor pentru un operator este importantă deoarece operatorul nu este comutativ .
Antetul tabelului rezultat este uniunea ( concatenarea ) antetelor tabelelor unite.
Corpul rezultatului este format logic după cum urmează. Fie unite tabelele din stânga și din dreapta prin predicatul (condiția) p .
Rezultat:
Persoană.Nume | Person.CityId | Oraș.Id | Numele orasului |
---|---|---|---|
Andrew | unu | unu | Moscova |
Serghei | unu | unu | Moscova |
Leonid | 2 | 2 | St.Petersburg |
NUL | NUL | 3 | Kazan |
Operatorul complet de îmbinare externă FULL OUTER JOIN unește două tabele. Ordinea tabelelor pentru operator este neimportantă deoarece operatorul este comutativ .
Antetul tabelului rezultat este uniunea ( concatenarea ) antetelor tabelelor unite.
Corpul rezultatului este format logic după cum urmează. Fie ca primul și al doilea tabel să fie unite prin predicatul (condiția) p . Cuvintele „primul” și „al doilea” de aici nu indică ordinea în care este scrisă expresia (care nu are importanță), ci sunt folosite doar pentru a face distincția între tabele.
Rezultat:
Persoană.Nume | Person.CityId | Oraș.Id | Numele orasului |
---|---|---|---|
Andrew | unu | unu | Moscova |
Serghei | unu | unu | Moscova |
Leonid | 2 | 2 | St.Petersburg |
NUL | NUL | 3 | Kazan |
Grigore | patru | NUL | NUL |
Operatorul de îmbinare încrucișată sau produsul cartezian CROSS JOIN unește două tabele. Ordinea tabelelor pentru operator este neimportantă deoarece operatorul este comutativ .
Antetul tabelului rezultat este uniunea ( concatenarea ) antetelor tabelelor unite.
Corpul rezultatului este format logic după cum urmează. Fiecare rând al unui tabel este conectat la fiecare rând al celui de-al doilea tabel, dând astfel ca rezultat toate combinațiile posibile de rânduri a două tabele.
SELECTAȚI * FROM Persoană CROSS JOIN Citysau
SELECTAȚI * FROM Persoană , orașRezultat:
Persoană.Nume | Person.CityId | Oraș.Id | Numele orasului |
---|---|---|---|
Andrew | unu | unu | Moscova |
Andrew | unu | 2 | St.Petersburg |
Andrew | unu | 3 | Kazan |
Leonid | 2 | unu | Moscova |
Leonid | 2 | 2 | St.Petersburg |
Leonid | 2 | 3 | Kazan |
Serghei | unu | unu | Moscova |
Serghei | unu | 2 | St.Petersburg |
Serghei | unu | 3 | Kazan |
Grigore | patru | unu | Moscova |
Grigore | patru | 2 | St.Petersburg |
Grigore | patru | 3 | Kazan |
Dacă adăugați o condiție de îmbinare (predicatul p ) în clauza WHERE , adică restricții asupra combinațiilor de tupluri, atunci rezultatul este echivalent cu o operație cu aceeași condiție: INNER JOIN
SELECTAȚI * FROM Persoană , Oraș WHERE Persoană . CityId = oraș . IDAstfel, expresiile t1, t2 WHERE pși t1 INNER JOIN t2 ON psunt forme alternative sintactic de scriere a aceleiași operații de îmbinare interioară logică pe predicatul p . Se spune că sintaxa CROSS JOIN + WHEREpentru operația de îmbinare este depreciată și depreciată de standardul SQL ANSI [1] [2] .
SQL | |
---|---|
Versiuni |
|
Cuvinte cheie | |
Articole similare | |
Părți ale ISO/IEC SQL |
|
Bază de date | |
---|---|
Concepte |
|
Obiecte |
|
Chei | |
SQL |
|
Componente |