Alăturați-vă (SQL)

Versiunea stabilă a fost verificată pe 11 mai 2022 . Există modificări neverificate în șabloane sau .

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).

Descrierea operatorului

DIN Tabelul 1 { INTERIOR | { STÂNGA | DREAPTA | FULL } EXTERIOR | CROSS } JOIN Table2 { ON < condiție > | UTILIZAREA ( nume_câmp [,... n ]) }

Î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 2

Tipuri de operator JOIN

Următoarele tabele vor fi folosite pentru explicații suplimentare:

Oraș (Orașe)
ID Nume
unu Moscova
2 St.Petersburg
3 Kazan
Persoană (oameni)
Nume CityId
Andrew unu
Leonid 2
Serghei unu
Grigore patru

INNER JOIN

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ș . ID

Rezultat:

Persoană.Nume Person.CityId Oraș.Id Numele orasului
Andrew unu unu Moscova
Leonid 2 2 St.Petersburg
Serghei unu unu Moscova

OUTER JOIN

O îmbinare între două tabele care include în mod necesar toate rândurile din unul sau ambele tabele.

LEFT OUTER JOIN

Operatorul 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 .

  1. Rezultatul include o îmbinare interioară ( INNER JOIN) a tabelelor din stânga și din dreapta prin predicatul p .
  2. Apoi, la rezultat se adaugă acele rânduri din tabelul din stânga care nu au fost incluse în îmbinarea interioară la pasul 1. Pentru astfel de rânduri, coloanele corespunzătoare tabelului din dreapta sunt umplute cu valori NULL.
SELECT * FROM Persoană -- Masa din stânga LEFT OUTER JOIN Oraș -- Masa din dreapta ON Persoană . CityId = oraș . ID

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
JOIN EXTERIOR DREAPTA

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 .

  1. Rezultatul include o îmbinare interioară ( INNER JOIN) a tabelelor din stânga și din dreapta prin predicatul p .
  2. Apoi, la rezultat se adaugă acele rânduri din tabelul din dreapta care nu au fost incluse în îmbinarea interioară la pasul 1. Pentru astfel de rânduri, coloanele corespunzătoare tabelului din stânga sunt umplute cu valori NULL.
SELECT * FROM Persoană -- Masa din stânga RIGHT OUTER JOIN Oraș -- Masa din dreapta ON Persoană . CityId = oraș . ID

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
UNIRE EXTERIOR COMPLET

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.

  1. Rezultatul include o îmbinare interioară ( INNER JOIN) a primei și a doua tabele prin predicatul p .
  2. Rezultatul include acele rânduri din primul tabel care nu au fost incluse în îmbinarea interioară la pasul 1. Pentru astfel de rânduri, coloanele corespunzătoare celui de-al doilea tabel sunt umplute cu valori NULL.
  3. La rezultat se adaugă acele rânduri ale celui de-al doilea tabel care nu au fost incluse în îmbinarea interioară la pasul 1. Pentru astfel de rânduri, coloanele corespunzătoare primului tabel sunt umplute cu valori NULL.
SELECTAȚI * FROM Persoană FULL OUTER JOIN Oraș ON Persoană . CityId = oraș . ID

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

CROSS JOIN

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 City

sau

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ș . ID

Astfel, 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] .

Note

  1. SR0010: Nu utilizați sintaxa moștenită . Consultat la 9 aprilie 2012. Arhivat din original pe 10 iunie 2012.
  2. Uniri ANSI . Consultat la 9 aprilie 2012. Arhivat din original pe 15 iunie 2012.

Link -uri