Mai mult
SQL se ALĂTURE și diferite tipuri de se Alătură
Ce este un SQL "PARTICIPĂ" și care sunt de tipuri diferite?
236
6
Ce este un SQL "PARTICIPĂ" și care sunt de tipuri diferite?
Un exemplu din W3schools:
Ce este SQL se ALĂTURE` ?
SQL se ALĂTURE
este o metodă de a prelua date din două sau mai multe tabele de baze de date.Care sunt diferitele `SQL se ALĂTURE ?
Există un total de cinci `se ALĂTURE. Acestea sunt :
ALĂTURAȚI-vă sau INNER JOIN :
În acest fel de o "se ALĂTURE", am obține toate înregistrările care se potrivesc cu starea în ambele tabele și înregistrări în ambele tabele care nu se potrivesc nu sunt raportate.
Cu alte cuvinte,
INNER JOIN
este bazat pe un singur faptul că: DOAR intrările care se potrivesc în AMBELE tabele ar TREBUI să fie listate.Rețineți că "se ALĂTURE", fără nici o altă "se ALĂTURE" cuvinte cheie (cum ar fi "INTERIOR", "OUTER", "STÂNGA", etc) este un INNER JOIN
. Cu alte cuvinte, "se ALĂTURE" este o Sintactică de zahăr pentru
INNER JOIN (a se vedea: https://stackoverflow.com/questions/565620/difference-between-join-and-inner-join).EXTERIOR SE ALĂTURE :
EXTERIOR se ALĂTURE` preia
Fie, potrivit rânduri dintr-un tabel și toate rândurile în alt tabel Sau, toate rândurile din toate tabelele (nu't contează dacă există sau nu un meci).
Există trei tipuri de Exterior se Alăture :
2.1 EXTERIOR STÂNGA se ALĂTURE sau la STÂNGA se ALĂTURE
Acest lucru se alăture returnează toate rândurile de la stânga masă în legătură cu rânduri de potrivire de tabelul din dreapta. Dacă nu există coloane de potrivire în tabelul din dreapta, se întoarce
NULL
valori.2.2 EXTERIOR DREAPTA se ALĂTURE sau CHIAR se ALĂTURE
Acest "se ALĂTURE" returnează toate rândurile din tabelul din dreapta, în colaborare cu rânduri de potrivire de masa din stânga. Dacă nu există coloane de potrivire în stânga masă, se întoarce
NULL
valori.2.3 FULL OUTER JOIN sau COMPLET se ALĂTURE
Acest "se ALĂTURE" combină
LEFT OUTER JOIN " și " DREAPTA EXTERIOR ALĂTURA
. Returnează rânduri, fie de masă atunci când condițiile sunt îndeplinite și se întoarceNULL
valoare atunci când nu există nici un meci.Cu alte cuvinte, `OUTER JOIN este bazat pe faptul că: DOAR intrările care se potrivesc într-UNA DIN tabele (DREAPTA sau STÂNGA) sau AMBELE tabele(FULL) ar TREBUI să fie listate.
JOIN NATURAL :
Ea se bazează pe două condiții :
Acest lucru pare să fie mai mult teoretică în natură și ca urmare (probabil) cele mai multe baze de date don't deranja chiar sprijinirea asta.
CROSS JOIN :
Acesta este produsul Cartezian a două tabele implicate. Rezultatul o
CROSS JOIN
nu va face sens în cele mai multe situații. Mai mult decât atât, ne-am castigat't nevoie de acest lucru la toate (sau are nevoie de cel mai puțin, pentru a fi precis).SELF JOIN :
Aceasta nu este o formă diferită de "se ALĂTURE", mai degrabă este un "ADERE" ("INTERIOR", "OUTER", etc) de o masă în sine.
Se alătură bazat pe Operatorii
În funcție de operatorul folosit pentru o "ADERE" clauza, pot exista două tipuri de JOIN e. Acestea sunt
Con ALĂTURA
Theta JOIN
Equi se ALĂTURE :
Pentru orice "se ALĂTURE" tip ("INTERIOR", "OUTER", etc), dacă vom folosi NUMAI operatorul de egalitate (=), atunci putem spune că a "se ALĂTURE" este un
CON ALĂTURA
.Theta JOIN :
Acest lucru este la fel ca
CON ALĂTURA
dar permite toate celelalte operatorii, cum ar fi >, <, >= etc.Definiție:
Se ALĂTURĂ sunt o modalitate de a interoga datele combinate din mai multe tabele simultan.
Tipuri de ÎMBINĂRI:
Preocuparea pentru RDBMS sunt de 5 tipuri de îmbinări:
Equi-Join: Combină comun înregistrările din două tabele bazate pe egalitatea de condiție. Din punct de vedere tehnic, Alături de făcut prin utilizarea egalitate-operator (=) pentru a compara valori de Cheie Primară dintr-un tabel și Cheia Externă valorile din alt tabel, prin urmare, rezultatul setul include comun(potrivit) înregistrările din ambele tabele. Pentru punerea în aplicare a vedea INTERIOARĂ-se ALĂTURE.
Natural-Join: este o versiune îmbunătățită de Equi-Join, în care SELECTAȚI operațiunea omite coloana duplicat. Pentru punerea în aplicare a vedea INTERIOARĂ-ALĂTURAȚI-vă
Non-Equi-Join: este inversă de Equi-join în cazul în care conditia este alte utilizări decât operatorul egal(=) e.g, !=, <=, >=, >, < sau ÎNTRE etc. Pentru punerea în aplicare a vedea INTERIOARĂ-se ALĂTURE.
Auto-Alăturați-vă:: O personalizate comportamentul alăturați-vă în cazul în care un tabel combinat cu sine; Aceasta este de obicei necesar pentru interogarea autoreferire tabele (sau Unar relație entitate). Pentru punerea în aplicare a vedea INTERIOARĂ-se Alătură.
Produsul cartezian: cruce combină toate înregistrările din ambele tabele, fără nici o condiție. Din punct de vedere tehnic, returnează setul de rezultate de interogare, fără a UNDE-Clauză.
Ca pe SQL îngrijorare și avansare, există 3 tipuri de se alătură și toate RDBMS se alătură poate fi realizat folosind aceste tipuri de îmbinări.
INTERIOR-ALĂTURAȚI-vă: Se îmbină(sau combina) potrivit rânduri din cele două tabele. Potrivirea este făcut pe baza unor coloane de tabele si compararea lor funcționare. Dacă egalitatea bazată pe stare, atunci: EQUI-JOIN efectuate, în caz contrar Non-EQUI-Join.
OUTER-JOIN: Se îmbină(sau combina) potrivit rânduri din cele două tabele și de neegalat rânduri cu valori NULL. Cu toate acestea, pot selecție personalizată de onu, potrivit rânduri e.g, selectarea de neegalat rand din primul tabel sau a doua masa de sub-tipuri: asociere EXTERIOARE STÂNGA și DREAPTA EXTERIOR se ALĂTURE.
2.1. Exterior STÂNGA se ALĂTURE (- o.k.o, a LĂSAT-ALĂTURAȚI-vă): Returnează potrivit rânduri din cele două tabele și de neegalat de la masa din STÂNGA(i.e, în primul tabel) numai.
2.2. Se ALĂTURE DREAPTA Exterior (- o.k.o, NU-ALĂTURAȚI-vă): Returnează potrivit rânduri din cele două tabele și de neegalat de masă din DREAPTA numai.
2.3. FULL OUTER JOIN (- o.k.un OUTER JOIN): Returnează corelate și necorelate din ambele tabele.
![introduceți descrierea imaginii aici][1] Notă: Auto-JOIN poate fi realizat fie prin INTERIOR-ALĂTURAȚI-vă, EXTERIOR-ALĂTURAȚI-vă și CROSS-ALĂTURAȚI-vă în funcție de cerințe, dar masa trebuie să se unească cu sine.
[Pentru mai multe informații:][2]
Exemple:
1.1: INTERIOR-ALĂTURAȚI-vă: Equi-join implementare
1.2: INTERIOR-ALĂTURAȚI-vă: Natural-ALĂTURAȚI-vă de implementare
1.3: INTERIOR-ALĂTURAȚI-vă cu NON-Equi-join implementare
Interesant este ca cele mai multe alte răspunsuri suferă de aceste două probleme:
În primul rând: se Alătură sunt produse carteziene
Acesta este motivul pentru diagrame Venn a le explica atât de inexact, pentru că un ALĂTURAȚI-vă creează o produs cartezian între cele două mese unite. Wikipedia ilustrează frumos: Sintaxa SQL pentru cartezian produse este CRUCEA ALĂTURI. De exemplu:
Care combină toate rândurile dintr-un tabel cu toate rândurile din alte tabel: Sursa:
Rezultatul:
Dacă am scrie o listă separată prin virgule de mese, ne-am'll a obține aceleași:
INNER JOIN (Theta-JOIN)
O
INNER JOIN
este doar un filtratCROSS JOIN
în cazul în care filtrul predicat se numește Theta` în algebra relațională. De exemplu:Rețineți că cuvântul cheie "INTERIOR" este opțională (cu excepția cazului în MS Access). (uita-te la articol pentru rezultatul exemple)
CON ALĂTURA
Un tip special de Theta-JOIN equi se ALĂTURE, pe care le folosim cel mai mult. Predicatul se alătură cheie primară de un tabel cu cheie străină de la o altă masă. Dacă vom folosi Sakila baza de date pentru ilustrare, putem scrie:
Aceasta combină toți actorii cu filmele lor. Sau, de asemenea, pe unele baze de date:
FOLOSIND()
sintaxa permite specificarea unei coloane care trebuie să fie prezente pe fiecare parte a JOIN operation's tabelele și creează o egalitate predicat pe cele două coloane.JOIN NATURAL
Alte răspunsuri au listat acest "JOIN tip" separat, dar asta nu't sens. L's doar o sintaxă zahăr formă de con ALĂTURA, care este un caz special de Theta-JOIN sau INNER JOIN. NATURALE se ALĂTURE pur și simplu colectează toate ** coloane care sunt comune pentru ambele tabele fiind s-au alăturat și se alătură
FOLOSIND()
aceste coloane. Care este rareori util, pentru că accidentale meciuri (ca `LAST_UPDATE coloane în Sakila baza de date). Aici's sintaxa:OUTER JOIN
Acum, pentru EXTERIOR ALĂTURA
este un pic diferit de
INNER JOIN` cum se creează o "UNIUNE" de mai multe produse carteziene. Putem scrie:Nimeni nu vrea să scrie din urmă, așa că am scrie EXTERIOR se ALĂTURE
(care de obicei este mai bine optimizat prin baze de date). Ca "INTERIOR", cuvântul cheie
EXTERIOReste opțională, aici. EXTERIOR se ALĂTURE
vine în trei arome:LEFT [ OUTER ] JOIN
: stânga masă a "se ALĂTURE" expresia este adăugat la uniunea așa cum se arată mai sus.: Ambele tabele a "se ALĂTURE" expresie sunt adăugate a uniunii, așa cum se arată mai sus. Toate acestea pot fi combinate cu cuvinte cheie
FOLOSIND()sau cu
NATURALE` (I'am avut de fapt o lume reală caz de utilizare pentru un NATURAL PLIN ALĂTURI recent)Sintaxe Alternative
Există unele istorice, învechită sintaxe în Oracle și SQL Server, care a sprijinit EXTERIOR se ALĂTURE deja înainte de SQL standard avut o sintaxa pentru acest lucru:
După ce a spus așa, don't utilizați această sintaxă. Am lista doar aici astfel încât să puteți recunoaște de la vechiul blog / cod moștenire.
Partiționat EXTERIOR se ALĂTURE`
Puțini oameni știu acest lucru, dar SQL standard specifică partiționat EXTERIOR se ALĂTURE` (și Oracle implementează-l). Puteți scrie lucruri de genul asta:
Piese de rezultat:
Punctul de aici este că toate rândurile din partiționat parte a adera va ajunge în cele din urma, indiferent dacă "se ALĂTURE" potrivesc cu ceva pe "cealaltă parte a ADERA". Povestea pe scurt: Acest lucru este de a umple rare a datelor în rapoarte. Foarte util!
SEMI ALĂTURAȚI-VĂ
Serios? Nici un alt răspuns primit asta? Bineînțeles că nu, pentru că nu't au un nativ sintaxa SQL, din păcate (ca ANTI ALĂTURI de mai jos). Dar putem folosi
ÎN () " și " EXISTĂ()
, de exemplu, pentru a găsi toți actorii care au jucat în filmele:De UNDE o.actor_id = fa.actor_id
predicat acționează ca o semi alăturați-vă predicat. Dacă tu nu't crezi, verifica planurile de execuție, de exemplu în Oracle. Te'll vedea că baza de date execută o SEMI ALĂTURA operațiunii, nu
EXISTĂ()` predicat.ANTI ALĂTURAȚI-VĂ
Acest lucru este exact opusul de SEMI-JOIN (fie atenți să nu utilizeze
NU
deși, deoarece are un avertisment de important) Aici sunt toți actorii, fără filme:Unii oameni (mai ales MySQL persoane) scrie, de asemenea, ANTI ALĂTURA astfel:
Cred ca istoric, motiv pentru care este performanța.
LATERAL SE ALĂTURE
OMG, asta e prea rece. Am'm doar să-l menționez? Aici's-o rece interogare:
Se va găsi TOP 5 venituri producătoare de filme pe actor. De fiecare dată când ai nevoie de un TOP-N-pe-ceva de interogare, LATERALE se ALĂTURE` va fi prietenul tău. Daca're un SQL Server persoană, atunci știi acest lucru "se ALĂTURE" tip sub numele de "APLICĂ"
OK, poate că's înșelăciune, deoarece un LATERALĂ se ALĂTURE " sau " se APLICĂ` expresie este într-adevăr un "subinterogare corelată" care produce mai multe rânduri. Dar dacă ne-am permite "subinterogari corelate", de asemenea, putem vorbi despre...
MULTISET
Aceasta este doar într-adevăr puse în aplicare de către Oracle și Informix (din cunostintele mele), dar poate fi emulat în PostgreSQL folosind tablouri și/sau XML și SQL Server folosind XML.
MULTISET
produce o subinterogare corelată și cuiburi rezultat set de rânduri în interogare exterior. Interogare de mai jos selectează toți actorii și pentru fiecare actor colectează filmele lor într-o colecție imbricată:După cum ați văzut, există mai multe tipuri de JOIN decât doar "plictisitor" "INTERIOR", EXTERIOR", și " CRUCEA de ALĂTURI, care sunt de obicei menționate. Mai multe detalii în articolul meu. Și te rog, nu mai folosi diagramele Venn pentru a le ilustra.
Am creat o ilustrație care explică mai bine decât cuvintele, în opinia mea:
Am'm de gând să împingă mă enervează: FOLOSIND cuvinte cheie.
Dacă ambele tabele pe ambele părți ale ALĂTURAȚI-vă lor chei externe numit în mod corespunzător (de exemplu, același nume, nu doar "id), atunci acest lucru poate fi folosit:
Mi se pare foarte practic, ușor de citit, și nu sunt utilizate destul de des.