Alăturați-vă (SQL)

De la Wikipedia, enciclopedia liberă.
Salt la navigare Salt la căutare

JOIN este o clauză a limbajului SQL care este utilizată pentru a combina tuplurile a două sau mai multe relații ale unei baze de date . Standardul ANSI definește câteva specificații pentru limbajul SQL pe tipul de JOIN urmează JOIN fie realizat: INNER , FULL , LEFT și RIGHT , la care mai multe DBMS adaugă CROSS . În unele cazuri este posibil ca un tabel să poată fi combinat cu el însuși, în acest caz vom vorbi de auto-unire .

Exemple de tabele

Toate exemplele care vor fi date mai jos vor folosi următoarele două tabele

Masa angajaților
Nume ID_departament
Rossi 31
albi 33
Mancini 33
Santoro 34
Monti 34
Gras Null
Tabelul departamentelor
ID_departament numele departamentului
31 Vânzări
33 Tehnic
34 Resurse umane
35 Promovare

Dipartimenti.ID_dipartimento este cheia principală care are o cardinalitate 0: n față de câmpul Impiegati.ID_dipartimento

Notă: Departamentul „Promovare” din tabelul „Departamente” nu are corespondență în tabelul „Angajați”. În timp ce angajatul „Grassi” nu a fost repartizat în niciun departament ( Null ).

Alăturare interioară

O îmbinare interioară creează un nou tabel prin combinarea valorilor celor două tabele de pornire (A și B) pe baza unei anumite reguli de comparație. Interogarea compară fiecare rând al tabelului A cu fiecare rând al tabelului B încercând să satisfacă colaționarea definită. Când regula de îmbinare este îndeplinită, valorile tuturor coloanelor din tabelele A și B sunt combinate într-un singur rând în construcția tabelului rezultat. Unirea interioară este cea mai frecvent utilizată formă de unire în aplicații și este modul implicit.

De exemplu, următoarea interogare va alătura celor două tabele Angajați și departamente folosind cheia principală department_ID care este coloana din ambele tabele. Când departamentul_ID se potrivește în ambele tabele (adică regula este îndeplinită), interogarea va combina coloanele Nume , Departament_ID și Departament_Nume într-un singur rând pentru tabelul rezultat.

Exemplu de îmbinare interioară în formă explicită:

 SELECT *
DE LA Angajați 
       INNER JOIN Departamente 
          ON Angajații . ID_dipartimento = Departamente. ID_departament

care este echivalent cu:

 SELECT *  
DE LA Angajați , departamente 
UNDE angajați . ID_dipartimento = Departamente. ID_departament

Rezultatul interogării de alăturare interioară:

Numele angajaților Angajați.ID_departament Departamente.Nume_departament Departamente.ID_departament
Santoro 34 Resurse umane 34
albi 33 Tehnic 33
Monti 34 Resurse umane 34
Mancini 33 Tehnic 33
Rossi 31 Vânzări 31

Rețineți că angajatul „Grassi” și departamentul „Promovare” nu sunt prezenți, deoarece angajatul Grassi are un Null timp ce Promoția nu apare la niciun angajat. Uneori, ca rezultat final, doriți să aveți înregistrări care nu se potrivesc: în acest caz, puteți utiliza interogarea de tip Outer join.

Equi-join

Equi-join , cunoscut și sub numele de equijoin , are un anumit tip de comparator, numit theta join , care folosește ca metodă de verificare, doar egalitatea matematică ca regulă de comparație. Utilizarea altor operatori de comparație (cum ar fi < ) descalifică îmbinarea ca o echi-îmbinare. Interogarea de mai jos utilizează un echi-join:

 SELECT *
DE LA Angajați 
       INNER JOIN Departamente 
          ON Angajații . ID_dipartimento = Departamente. ID_departament

SQL oferă o comandă rapidă pentru definirea echi-join-urilor, prin intermediul cuvântului cheie USING

 SELECT *
DE LA Angajați 
       INNER JOIN Departamente 
          UTILIZARE ( ID_departament )

Cuvântul cheie USING este acceptat de Microsoft SQL Server Management Studio, MySQL, Oracle, PostgreSQL, SQLite și DB2 / 400.

Alăturare naturală

O îmbinare naturală oferă specializări suplimentare echi-join. De obicei, îmbinarea compară coloane din diferite tabele care au același nume. Alăturarea naturală face exact asta.

Următorul exemplu prezintă notația de îmbinare naturală echivalentă cu prima îmbinare interioară definită:

 SELECT *
DE LA angajați NATURAL JOIN Departamente
ID_departament Numele angajaților Departamente.Nume_departament
34 Monti Resurse umane
33 albi Tehnic
34 Santoro Resurse umane
33 Mancini Tehnic
31 Rossi Vânzări

Alăturați-vă încrucișat

O îmbinare încrucișată , o îmbinare cartesiană sau un produs oferă fundamentul (infrastructura IT) prin care funcționează toate tipurile de îmbinări interioare. Rezultatul unei îmbinări încrucișate este produsul cartezian al tuturor rândurilor din tabele care contribuie la interogarea de îmbinare. Este ca și cum ai spune că facem o îmbinare interioară fără a seta colaționarea sau unde colația revine întotdeauna adevărată.

Având în vedere cele două tabele de pornire A și B, îmbinarea transversală se scrie A × B.

Exemplu de îmbinare transversală explicită:

 SELECT *
DE LA ANGAJAȚI CROSS JOIN Departamente

Un alt exemplu implicit de îmbinare încrucișată:

 SELECT *
DIN angajați , departamente ;
Numele angajaților Angajați.ID_departament Departamente.Nume_departament Departamente.ID_departament
Rossi 31 Vânzări 31
albi 33 Vânzări 31
Mancini 33 Vânzări 31
Monti 34 Vânzări 31
Santoro 34 Vânzări 31
Gras Null Vânzări 31
Rossi 31 Tehnic 33
albi 33 Tehnic 33
Mancini 33 Tehnic 33
Monti 34 Tehnic 33
Santoro 34 Tehnic 33
Gras Null Tehnic 33
Rossi 31 Resurse umane 34
albi 33 Resurse umane 34
Mancini 33 Resurse umane 34
Monti 34 Resurse umane 34
Santoro 34 Resurse umane 34
Gras Null Resurse umane 34
Rossi 31 Promovare 35
albi 33 Promovare 35
Mancini 33 Promovare 35
Monti 34 Promovare 35
Santoro 34 Promovare 35
Gras Null Promovare 35

Alăturare exterioară

O îmbinare exterioară nu necesită o potrivire exactă între rândurile a două tabele. Tabelul rezultat dintr-o îmbinare exterioară deține toate acele înregistrări care nu au corespondență între tabele. Îmbinările exterioare sunt împărțite în îmbinări exterioare stânga , îmbinări exterioare drepte și îmbinări externe complete , pe baza cărui tabel intenționăm să păstrăm valori în cazul unei nepotriviri de colaționare de la (stânga, dreapta sau ambele).

(În acest caz, stânga (stânga) și dreapta (dreapta) se referă la cele două fețe ale cuvântului cheie JOIN .)

NOTĂ cu privire la CLASELE UNDE și ON:

Se subliniază faptul că există o ordine de execuție între condițiile specificate în WHERE și cele prezente în ON.

Mai exact, clauzele din ON sunt evaluate ÎNAINTE de executarea unirii, în timp ce clauzele din unde sunt evaluate DUPĂ executarea unirii.

Îmbinarea exterioară stângă

Rezultatul unei interogări de îmbinare exterioară la stânga (sau pur și simplu la stânga ) pentru tabelele A și B conține întotdeauna toate înregistrările tabelului din stânga („stânga”) A, în timp ce acestea sunt extrase din tabelul din dreapta („dreapta”) B numai rândurile care se potrivesc în colaționarea îmbinării. Aceasta înseamnă că, dacă clauza ON găsește 0 (zero) rânduri în B, unirea va afișa un rând rezultat cu valoare NULL în toate coloanele care se potrivesc cu rezultatul pentru coloanele lui B.

Exemplu de îmbinare exterioară stângă:

 SELECT *  
DIN STÂNGA OUTER JOIN angajati Departamente  
          ON Angajații . ID_dipartimento = Departamente. ID_departament
Numele angajaților Angajați.ID_departament Departamente.Nume_departament Departamente.ID_departament
albi 33 Tehnic 33
Rossi 31 Vânzări 31
Santoro 34 Resurse umane 34
Monti 34 Resurse umane 34
Gras Null Null Null
Mancini 33 Tehnic 33

Îmbinarea exterioară dreaptă

O îmbinare exterioară dreaptă (sau îmbinare dreaptă ) urmează pur și simplu operația îmbinării exterioare stânga, dar inversând ordinea tabelelor afectate.

Rezultatul unei interogări de îmbinare exterioară dreaptă pentru tabelele A și B conține întotdeauna toate înregistrările tabelului din dreapta („dreapta”) B, în timp ce numai rândurile care se potrivesc în tabel sunt extrase din tabelul din stânga („stânga”) A colaționarea îmbinării. Aceasta înseamnă că, dacă clauza ON găsește 0 (zero) rânduri în A, îmbinarea va afișa un rând rezultat cu valoare NULL în toate coloanele care se potrivesc cu rezultatul pentru coloanele lui A.

Exemplu de îmbinare exterioară dreaptă:

 SELECT * 
DE LA ANGAJAȚI DREPT EXTERIOR ÎNSCRIEȚI-VĂ la departamente 
          ON Angajații . ID_dipartimento = Departamente. ID_departament
Numele angajaților Angajați.ID_departament Departamente.Nume_departament Departamente.ID_departament
Monti 34 Resurse umane 34
albi 33 Tehnic 33
Santoro 34 Resurse umane 34
Mancini 33 Tehnic 33
Rossi 31 Vânzări 31
Null Null Promovare 35

În practică, interogările de îmbinare exterioară stângă sunt utilizate mai mult decât interogările de îmbinare exterioară dreaptă, dar pot exista cazuri rare în care interogările foarte complexe trebuie să utilizeze în același timp criteriile de îmbinare exterioară stângă și de îmbinare exterioară dreaptă.

Același rezultat al îmbinării exterioare drepte anterioare poate fi repetat folosind tipul de îmbinare exterioară stânga:

 SELECT * 
DIN Departamente STÂNGA EXTERIU ÎNSCRIEȚI Angajați
          ON Angajații . ID_dipartimento = Departamente. ID_departament

Îmbinarea exterioară completă

O îmbinare exterioară completă combină rezultatele celor două tabele A și B luând în considerare toate rândurile tabelelor, chiar și cele care nu corespund între ele.

Rezultatul unei interogări complete de îmbinare exterioară pentru tabelele A și B conține întotdeauna toate înregistrările tabelului din stânga („stânga”) A, extragând din tabelul din dreapta („dreapta”) B numai rândurile care corespund regulii comparației de îmbinare ; în plus, toate înregistrările tabelului din stânga („stânga”) A care nu se potrivesc în tabelul din dreapta („dreapta”) B vor fi extrase setând la NUL valorile tuturor coloanelor din tabelul B și toate înregistrările tabelului din dreapta („dreapta”) B care nu se potrivesc în tabelul din stânga („stânga”) O setare la NUL valorile tuturor coloanelor din tabelul A.

Exemplu de îmbinare exterioară completă:

 SELECT *  
DE LA Angajați 
       FULL OUTER JOIN Departamente 
          ON Angajații . ID_dipartimento = Departamente. ID_departament
Numele angajaților Angajați.ID_departament Departamente.Nume_departament Departamente.ID_departament
Monti 34 Resurse umane 34
albi 33 Tehnic 33
Santoro 34 Resurse umane 34
Gras Null Null Null
Mancini 33 Tehnic 33
Rossi 31 Vânzări 31
Null Null Promovare 35

Unele baze de date (cum ar fi MySQL) nu acceptă direct această funcționalitate, dar poate fi emulată prin combinația de îmbinări exterioare stânga și dreapta prin intermediul cuvântului cheie union .

Crearea unei interogări complete de îmbinare exterioară se va face după cum urmează:

 SELECT *
DE LA Angajați 
       STÂNGA ÎNREGISTRARE Departamente 
          ON Angajații . ID_dipartimento = Departamente. ID_departament
UNIUNE
SELECT *
DIN angajați
       ÎNREGISTRARE DREPTĂ Departamente
          ON Angajații . ID_dipartimento = Departamente. ID_departament
UNDE angajați . Department_ID IS NULL

La fel, fără a utiliza măcar interogarea dreaptă de îmbinare exterioară:

 SELECTAȚI angajații . * , Departamente . *
DE LA Angajați 
       STÂNGA ÎNREGISTRARE Departamente 
          ON Angajații . ID_dipartimento = Departamente. ID_departament
UNIUNE
SELECTAȚI angajații . * , Departamente . *
DIN Departamente
       LEFT JOIN Angajați
          ON Angajații . ID_dipartimento = Departamente. ID_departament
UNDE angajați . Department_ID IS NULL

Auto-alăturați-vă

Auto-unirea este utilizată pentru a uni o masă cu sine.

Elemente conexe

linkuri externe

  • Introducere în JOIN-uri [ link rupt ] în baza de cunoștințe AskMonty
Informatică Portal IT : accesați intrările Wikipedia care se ocupă cu IT