Alăturați-vă (SQL)
Această intrare sau secțiune despre programare nu citează sursele necesare sau cei prezenți sunt insuficienți . |
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
Nume | ID_departament |
---|---|
Rossi | 31 |
albi | 33 |
Mancini | 33 |
Santoro | 34 |
Monti | 34 |
Gras | Null |
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