Integrarea la stânga (SQL) - exemplu, descriere detaliată, erori de utilizare
În orice bază de date relațională reală, toate informațiile sunt distribuite pe tabele separate. Multe dintre mese au stabilit relații în circuit unul cu celălalt. Cu toate acestea, cu ajutorul Întrebări SQL
conținut
În acest articol vom vorbi în mod special despre conexiunea externă stângă. Înainte de a începe să descriem acest tip de conexiune, adăugăm câteva tabele la baza de date.
Pregătirea tabelelor necesare
De exemplu, în baza noastră de date există informații despre persoane și proprietatea imobiliară. Rezumat bazat pe cele trei tabele: Popoarelor (oameni), Realty (imobiliare), Realty_peoples (relații de masă, oameni care din ce proprietate aparține). Să presupunem că următoarele date sunt stocate în tabele pentru persoane:
Peoples | ||||
id | L_NAME | F_name | Middle_name | zi de naștere |
1 | Ivanova | Daria | B. | 07/16/2000 |
2 | Pugin | Vladislav | Nikolaevici | 29.01.1986 |
3 | Evgenin | Alexander | Federovich | 04/30/1964 |
4 | Annina | dragoste | P. | 31.12.1989 |
5 | Gerasimovsky | speranță | P. | 14.03.1992 |
6 | Gerasimovsky | Oleg | Albertovich | 01/29/1985 |
7 | Sukhanovskaya | juriu | A. | 09/25/1976 |
8 | Sukhanovskaya | Julia | Y. | 01.10.2001 |
Imobiliare:
proprietate imobilă | |
id | adresa |
1 | Arhangelsk, st. Voronina, 7, ap. 6 |
2 | Arhangelsk, st. Severodvinskaya, 84, Apt. 9, cameră. 5 |
3 | Regiunea Arhangelsk, Severodvinsk, ul. Lenina, d. 134, apt. 85 |
4 | Regiunea Arkhangelsk, Novodvinsk, ul. Proletarskaya, 16, Apt. 137 |
5 | Arhangelsk, pl. Terekhin, d. 89, apt. 13 |
Pentru relatii, oamenii sunt imobiliari:
Realty_peoples | ||
id_peoples | id_realty | tip |
7 | 3 | Proprietate comună comună |
8 | 3 | Proprietate comună comună |
3 | 5 | proprietate |
7 | 1 | proprietate |
5 | 4 | Proprietate comună |
6 | 4 | Proprietate comună |
Intrarea în stânga (sql) - descriere
Conexiunea din stânga are următoarea sintaxă:
Table_A LEFT JOIN table_B [{ON predicat} | {FOLOSIND spisok_cutolbtsov}] |
Și arată astfel:
Și această expresie este tradusă ca "Selectați toate rândurile din tabelul A fără excepție și extrageți numai rânduri care se potrivesc cu predicatul din tabelul B. Dacă în tabelul B nu există perechi pentru rândurile din tabelul A, atunci completați coloanele Null care rezultă cu valori. "
Cel mai adesea, atunci când este efectuată conexiunea la stânga, se specifică ON, USING este utilizată numai atunci când numele coloanelor pentru care este planificată conexiunea sunt aceleași.
Intrarea în stânga - exemple de utilizare
Cu ajutorul legăturii din stânga, putem vedea dacă toți oamenii de pe lista popoarelor au proprietăți imobiliare. Pentru a face acest lucru, executați exemplul următor în partea de stânga join sql:
SELECT popoare. *, Realty_peoples.id_realty, Realty_peoples.type DE PE POPULAȚI LIVE JOIN Realty_peoples ON Peoples.id = Realty_peoples.id_peoples; |
Și obținem următorul rezultat:
Query1 | ||||||
id | L_NAME | F_name | Middle_name | zi de naștere | id_realty | tip |
1 | Ivanova | Daria | B. | 07/16/2000 | ||
2 | Pugin | Vladislav | Nikolaevici | 29.01.1986 | ||
3 | Evgenin | Alexander | Federovich | 04/30/1964 | 5 | proprietate |
4 | Annina | dragoste | P. | 31.12.1989 | ||
5 | Gerasimovsky | speranță | P. | 14.03.1992 | 4 | Proprietate comună |
6 | Gerasimovsky | Oleg | Albertovich | 01/29/1985 | 4 | Proprietate comună |
7 | Sukhanovskaya | juriu | A. | 09/25/1976 | 1 | proprietate |
7 | Sukhanovskaya | juriu | A. | 09/25/1976 | 3 | Proprietate comună comună |
8 | Sukhanovskaya | Julia | Y. | 01.10.2001 | 3 | Proprietate comună comună |
După cum vedem, u Ivanova Darya, Pugin Vladislav și Annina Lyubov nu au drepturi înregistrate asupra imobilelor.
Și ce am putea să folosim pentru un cuplu interior? După cum știți, exclude liniile nepotrivite, astfel încât trei persoane din eșantionul nostru final ar cădea pur și simplu:
Query1 | ||||||
id | L_NAME | F_name | Middle_name | zi de naștere | id_realty | tip |
3 | Evgenin | Alexander | Federovich | 04/30/1964 | 5 | proprietate |
5 | Gerasimovsky | speranță | P. | 14.03.1992 | 4 | Proprietate comună |
6 | Gerasimovsky | Oleg | Albertovich | 01/29/1985 | 4 | Proprietate comună |
7 | Sukhanovskaya | juriu | A. | 09/25/1976 | 1 | proprietate |
7 | Sukhanovskaya | juriu | A. | 09/25/1976 | 3 | Proprietate comună comună |
8 | Sukhanovskaya | Julia | Y. | 01.10.2001 | 3 | Proprietate comună comună |
Se pare că a doua opțiune îndeplinește, de asemenea, condițiile din sarcina noastră. Cu toate acestea, dacă vom continua să adăugăm mai multe mese, trei persoane din rezultat vor dispărea deja iremediabil. Prin urmare, în practică, atunci când se combină mai multe tabele, conexiunile din stânga și din dreapta sunt mult mai des folosite decât intrările interioare.
Continuăm să luăm în considerare exemplele cu sql. Alăturați-vă la masă cu adresele proprietăților noastre:
SELECT popoare. *, Realty_peoples.id_realty, Realty_peoples.type, Realty.address Din popoare LEFT JOIN Realty_peoples PE Peoples.id = Realty_peoples.id_peoples LEFT JOIN Realty pe Realty.id = Realty_peoples.id_realty |
Acum nu numai că avem forma dreptului, ci și adresele imobilelor:
Query1 | |||||||
id | L_NAME | F_name | Middle_name | zi de naștere | id_realty | tip | adresa |
1 | Ivanova | Daria | B. | 07/16/2000 | |||
2 | Pugin | Vladislav | Nikolaevici | 29.01.1986 | |||
3 | Evgenin | Alexander | Federovich | 04/30/1964 | 5 | proprietate | Arhangelsk, pl. Terekhin, d. 89, apt. 13 |
4 | Annina | dragoste | P. | 31.12.1989 | |||
5 | Gerasimovsky | speranță | P. | 14.03.1992 | 4 | Proprietate comună | Regiunea Arkhangelsk, Novodvinsk, ul. Proletarskaya, 16, Apt. 137 |
6 | Gerasimovsky | Oleg | Albertovich | 01/29/1985 | 4 | Proprietate comună | Regiunea Arkhangelsk, Novodvinsk, ul. Proletarskaya, 16, Apt. 137 |
7 | Sukhanovskaya | juriu | A. | 09/25/1976 | 3 | Proprietate comună comună | Regiunea Arhangelsk, Severodvinsk, ul. Lenina, d. 134, apt. 85 |
7 | Sukhanovskaya | juriu | A. | 09/25/1976 | 1 | proprietate | Arhangelsk, st. Voronina, 7, ap. 6 |
8 | Sukhanovskaya | Julia | Y. | 01.10.2001 | 3 | Proprietate comună comună | Regiunea Arhangelsk, Severodvinsk, ul. Lenina, d. 134, apt. 85 |
Intrarea în stânga - erori de utilizare tipice: ordine greșită a tabelelor
Principalele erori admise cu intrarea exterioară stângă a meselor sunt două:
- Ordinea tabelelor din cauza cărora au fost pierdute datele este selectată incorect.
- Erori la utilizarea Unde într-o interogare cu tabele fuzionate.
Luați în considerare prima eroare. Înainte de a rezolva orice problemă, merită să înțelegeți clar ce anume vrem să obținem ca rezultat. În exemplul de mai sus, am scos toți oamenii, dar am pierdut absolut informații despre obiect sub numărul 2, din care proprietarul nu a fost găsit.
Dacă am mutat tabelele în locurile de interogare și am început cu "hellip- From Realty lăsăm să ne alăturăm Peopleshellip", atunci nu am pierde o singură proprietate, pe care nu o poți spune despre oameni.
Cu toate acestea, nu vă temeți de conexiunea din stânga, mergeți la plinul extern, care va include ca rezultat și coincide și nu se potrivesc liniei.
La urma urmei dimensiunea eșantionului adesea foarte mari, iar datele inutile nu contează. Principalul lucru este să înțelegeți ce doriți să primiți: toți cei care au o listă cu bunurile imobile disponibile sau o listă a tuturor bunurilor imobile cu proprietarii lor (dacă există).
Intrarea în stânga - erori de utilizare tipice: corectitudinea interogării la setarea condițiilor în Unde
A doua eroare este, de asemenea, legată de pierderea datelor și nu întotdeauna evidentă.
Să ne întoarcem la interogare, când folosim conexiunea din stânga primită de date tuturor persoanelor și a proprietăților imobiliare existente. Amintiți-vă cu următorul exemplu cu exemplu:
DE PE POPULAȚI LIVE JOIN Realty_peoples ON Peoples.id = Realty_peoples.id_peoples; |
Să presupunem că dorim să perfecționăm interogarea și nu datele de ieșire, unde tipul de lege este "proprietate". Dacă adăugăm pur și simplu, aplicând sql conexiune la stânga, un exemplu următoarea condiție:
...
În cazul în care tipul <> "Proprietatea" |
vom pierde date despre persoane care nu au nici o proprietate imobiliară, deoarece valoarea goală a lui Null nu se compară în felul următor:
Query1 | ||||||
id | L_NAME | F_name | Middle_name | zi de naștere | id_realty | tip |
5 | Gerasimovsky | speranță | P. | 14.03.1992 | 4 | Proprietate comună |
6 | Gerasimovsky | Oleg | Albertovich | 01/29/1985 | 4 | Proprietate comună |
7 | Sukhanovskaya | juriu | A. | 09/25/1976 | 3 | Proprietate comună comună |
8 | Sukhanovskaya | Julia | Y. | 01.10.2001 | 3 | Proprietate comună comună |
Pentru a preveni apariția erorilor din acest motiv, este mai bine să specificați condiția de selecție imediat după conectare. Vă sugerăm să luați în considerare următorul exemplu cu sql alianța stângă.
SELECT popoare. *, Realty_peoples.id_realty, Realty_peoples.type Din popoare LEFT JOIN Realty_peoples ON (Peoples.id = Realty_peoples.id_peoples ȘI tip <> "Proprietate") |
Rezultatul este următorul:
Query1 | ||||||
id | L_NAME | F_name | Middle_name | zi de naștere | id_realty | tip |
1 | Ivanova | Daria | B. | 07/16/2000 | ||
2 | Pugin | Vladislav | Nikolaevici | 29.01.1986 | ||
3 | Evgenin | Alexander | Federovich | 04/30/1964 | ||
4 | Annina | dragoste | P. | 31.12.1989 | ||
5 | Gerasimovsky | speranță | P. | 14.03.1992 | 4 | Proprietate comună |
6 | Gerasimovsky | Oleg | Albertovich | 01/29/1985 | 4 | Proprietate comună |
7 | Sukhanovskaya | juriu | A. | 09/25/1976 | 3 | Proprietate comună comună |
8 | Sukhanovskaya | Julia | Y. | 01.10.2001 | 3 | Proprietate comună comună |
Astfel, executând un exemplu simplu cu sql alături de stânga, avem o listă a tuturor oamenilor, deducând în plus, care dintre ele are proprietăți imobiliare în proprietate partajată / comună.
În concluzie, aș dori să subliniez încă o dată că este necesar să se ia în mod responsabil alegerea oricăror informații din baza de date. Multe nuanțe s-au deschis înaintea noastră prin folosirea unui exemplu simplu, explicația căruia este unul - înainte de a începe să compunem chiar și o interogare elementară, trebuie să înțelegem cu atenție exact ceea ce vrem să obținem ca rezultat. Mult noroc!
- Baza de date este un sistem complex
- Baza de date normalizare
- Cum combinați două tabele în "Word" orizontal sau vertical
- Crearea unei baze de date MySQL face parte din orice site
- Bazele de date sunt relaționale. Conceptul de bază de date relațională
- DB este ... Tipuri și proprietăți ale bazei de date
- SQL unde: metode de aplicare și exemple
- MySQL JOIN: o descriere, un exemplu de utilizare a comenzii și recomandări
- Instrucțiunea SQL INNER JOIN: exemple, sintaxă și caracteristici
- MS Access. Baze de date MS Access. MS Access 2007
- Cum se conectează două tabele în "Word" (2003, 2007, 2010)?
- Crearea pas cu pas a unui tabel SQL
- Șterge instrucțiunea Șterge MySQL
- Ștergerea duplicatelor MySQL
- Ce este o bază de date și unde se poate utiliza?
- Cum se creează o bază de date mysql
- Structura bazei de date
- Model de date relațional, baze de date, modele și scheme de proiectare
- Detalii despre cum să legați tabelele de acces
- Prelucrarea statistică a datelor și a caracteristicilor acestora
- Concepte generale ale DBMS de acces