U bilo kojoj stvarnoj relacijskoj bazi podataka, svepodaci su podijeljeni u zasebne tablice. Mnogi od tablica uspostavili su međusobne odnose u krugu. Međutim, uz pomoć Sql upita, sasvim je moguće uspostaviti vezu između podataka koji nisu sadržani u shemi. To se postiže izvršavanjem operacije pridruživanja pridruženom, što vam omogućuje da izgradite odnose između bilo kojeg broja tablica i povezujete čak i naizgled različite podatke.
U ovom ćemo članku govoriti posebno o lijevoj vanjskoj vezi. Prije nego počnemo opisivati ovu vrstu veze, dodamo neke tablice u bazu podataka.
Recimo da naša baza podataka ima informacijeo ljudima i njihovim nekretninama. Sažetak se temelji na tri tablice: narodi (ljudi), nekretnine (nekretnina), Realty_peoples (tablice odnose, ljudi koji od onoga što imovina pripada). Pretpostavimo sljedeće podatke spremljene u tablicama naroda:
narodi | ||||
id | L_NAME | F_name | Middle_name | rođendan |
1 | Ivanova | Daria | B. | 16.07.2000 |
2 | Pugin | Vladislav | Nikolaevich | 29.01.1986 |
3 | Evgenin | Aleksandar | Federovich | 30.04.1964 |
4 | Annina | ljubav | P. | 31.12.1989 |
5 | Gerasimovsky | nadati se | P. | 14.03.1992 |
6 | Gerasimovsky | Oleg | Albertovich | 29.01.1985 |
7 | Sukhanovskaya | porota | A. | 25.09.1976 |
8 | Sukhanovskaya | Julia | Y. | 01.10.2001 |
Nekretnine:
nekretnina | |
id | adresa |
1 | Arkhangelsk, sv. Voronina, 7, ap 6 |
2 | Arkhangelsk, sv. Severodvinskaya, 84, Apt. 9, soba. 5 |
3 | Arkhangelsk regija, Severodvinsk, ul. Lenina, d., 134, apt. 85 |
4 | Regija Arkhangelsk, Novodvinsk, ul. Proletarskaya, 16, Apt. 137 |
5 | Arkhangelsk, pl. Terekhin, d. 89, apt. 13 |
Za odnose, ljudi su nekretnine:
Realty_peoples | ||
id_peoples | id_realty | vrsta |
7 | 3 | Zajedničko zajedničko vlasništvo |
8 | 3 | Zajedničko zajedničko vlasništvo |
3 | 5 | svojstvo |
7 | 1 | svojstvo |
5 | 4 | Dijeljeno vlasništvo |
6 | 4 | Dijeljeno vlasništvo |
Lijeva veza ima sljedeću sintaksu:
Tablica_A LIJEVO PRIDRUŽIVANJE tablica_B [{UKLJUČENO predikat} | {KORIŠTENJE popis_stolbtsov}] |
I izgleda ovako:
I ovaj je izraz preveden kao "Odaberite svebez iznimke redaka iz tablice A, i iz tablice B izlaze samo linije koje odgovaraju predikatu. Ako u tablici B nije bilo para za retke tablice A, tada ispunite rezultirajuće nulte stupce s vrijednostima. "
Najčešće, kada se izvodi lijeva veza, označen je ON, USING se koristi samo kada su nazivi stupaca za koje je planirana veza isti.
Pomoću lijeve veze možemo vidjeti da li svi ljudi na popisu naroda imaju nekretninu. Da biste to učinili, izvršite sljedeći primjer u lijevom dijelu sql:
SELECT Peoples. *, Realty_peoples.id_realty, Realty_peoples.type OD naroda LEFT JOIN Realty_peoples NA Peoples.id = Realty_peoples.id_peoples; |
I imamo sljedeći rezultat:
Query1 | ||||||
id | L_NAME | F_name | Middle_name | rođendan | id_realty | vrsta |
1 | Ivanova | Daria | B. | 16.07.2000 | ||
2 | Pugin | Vladislav | Nikolaevich | 29.01.1986 | ||
3 | Evgenin | Aleksandar | Federovich | 30.04.1964 | 5 | svojstvo |
4 | Annina | ljubav | P. | 31.12.1989 | ||
5 | Gerasimovsky | nadati se | P. | 14.03.1992 | 4 | Dijeljeno vlasništvo |
6 | Gerasimovsky | Oleg | Albertovich | 29.01.1985 | 4 | Dijeljeno vlasništvo |
7 | Sukhanovskaya | porota | A. | 25.09.1976 | 1 | svojstvo |
7 | Sukhanovskaya | porota | A. | 25.09.1976 | 3 | Zajedničko zajedničko vlasništvo |
8 | Sukhanovskaya | Julia | Y. | 01.10.2001 | 3 | Zajedničko zajedničko vlasništvo |
Kao što vidite, Ivanova Darya, Pugin Vladislav i Annina Lyubov nemaju nikakva registrirana prava na nekretnine.
A što bismo dobili pomoću Unutarnjeg pridruživanja? Kao što znate, on isključuje neusklađene linije, tako da bi troje ljudi iz našeg konačnog uzorka jednostavno ispalo:
Query1 | ||||||
id | L_NAME | F_name | Middle_name | rođendan | id_realty | vrsta |
3 | Evgenin | Aleksandar | Federovich | 30.04.1964 | 5 | svojstvo |
5 | Gerasimovsky | nadati se | P. | 14.03.1992 | 4 | Dijeljeno vlasništvo |
6 | Gerasimovsky | Oleg | Albertovich | 29.01.1985 | 4 | Dijeljeno vlasništvo |
7 | Sukhanovskaya | porota | A. | 25.09.1976 | 1 | svojstvo |
7 | Sukhanovskaya | porota | A. | 25.09.1976 | 3 | Zajedničko zajedničko vlasništvo |
8 | Sukhanovskaya | Julia | Y. | 01.10.2001 | 3 | Zajedničko zajedničko vlasništvo |
Čini se da druga opcija također odgovarauvjetima našeg zadatka. Međutim, ako nastavimo dodavati sve više tablica, tri osobe iz rezultata već će nepovratno nestati. Stoga, u praksi, kada se kombiniraju više tablica, lijeve i desne veze mnogo su češće korištene od unutarnjeg pridruživanja.
I dalje ćemo razmotriti primjere s lijeve sql veze. Pridružite se tablici s adresama naših svojstava:
SELECT Peoples. *, Realty_peoples.id_realty, Realty_peoples.type, Realty.address Od naroda LIJEŽITE PRISTUP Realty_peoples ON Peoples.id = Realty_peoples.id_peoples LEFT JOIN Realty ON Realty.id = Realty_peoples.id_realty |
Sada smo dobili ne samo oblik prava, ali i adrese nekretnina:
Query1 | |||||||
id | L_NAME | F_name | Middle_name | rođendan | id_realty | vrsta | adresa |
1 | Ivanova | Daria | B. | 16.07.2000 | |||
2 | Pugin | Vladislav | Nikolaevich | 29.01.1986 | |||
3 | Evgenin | Aleksandar | Federovich | 30.04.1964 | 5 | svojstvo | Arkhangelsk, pl. Terekhin, d. 89, apt. 13 |
4 | Annina | ljubav | P. | 31.12.1989 | |||
5 | Gerasimovsky | nadati se | P. | 14.03.1992 | 4 | Dijeljeno vlasništvo | Regija Arkhangelsk, Novodvinsk, ul. Proletarskaya, 16, Apt. 137 |
6 | Gerasimovsky | Oleg | Albertovich | 29.01.1985 | 4 | Dijeljeno vlasništvo | Regija Arkhangelsk, Novodvinsk, ul. Proletarskaya, 16, Apt. 137 |
7 | Sukhanovskaya | porota | A. | 25.09.1976 | 3 | Zajedničko zajedničko vlasništvo | Arkhangelsk regija, Severodvinsk, ul. Lenina, d., 134, apt. 85 |
7 | Sukhanovskaya | porota | A. | 25.09.1976 | 1 | svojstvo | Arkhangelsk, sv. Voronina, 7, ap 6 |
8 | Sukhanovskaya | Julia | Y. | 01.10.2001 | 3 | Zajedničko zajedničko vlasništvo | Arkhangelsk regija, Severodvinsk, ul. Lenina, d., 134, apt. 85 |
Glavne pogreške dopuštene s lijevim vanjskim spajanjem tablica su dvije:
Razmotrite prvu pogrešku. Prije rješavanja bilo kakvog problema, valja jasno razumjeti što točno želimo dobiti kao rezultat. U gore navedenom primjeru izvadili smo sve ljude, ali su apsolutno izgubili informacije o objektu pod brojem 2, s kojeg vlasnika nije pronađen.
Ako smo premjestili tablice na mjesta upita i započeli s "... Od Realty lijevo pridružite narodima ...", tada ne bismo izgubili niti jednu nekretninu koju ne možete reći o ljudima.
Međutim, nemojte se bojati lijeve veze, idite na puni vanjski, koji će kao rezultat biti uključen i ne podudaraju se s linijom.
Uostalom, volumen uzoraka je često veoma velik i dodatanpodaci stvarno ne trebaju ništa. Glavna stvar - da shvatiti što želite da biste dobili rezultat: od svih ljudi s popisom svojih raspoloživih dobara ili cijeli popis imovine njihovim vlasnicima (ako ih ima).
Druga pogreška je također povezana s gubitkom podataka, a ne uvijek odmah vidljiva.
Vratimo se na upit kada koristimo lijevu vezu podatke o svim ljudima i njihovoj nekretnini. Zapamti sljedeće sa lijevim slojem sql primjer:
OD naroda LEFT JOIN Realty_peoples NA Peoples.id = Realty_peoples.id_peoples; |
Pretpostavimo da želimo precizirati upit, a ne podatke izlaznih podataka, gdje je vrsta zakona "svojstvo". Ako jednostavno dodamo, primjenom lijeve sql pridruživanje, primjer slijedeći uvjet:
...
Gdje tip <> "Nekretnine" |
izgubit ćemo podatke o osobama koje nemaju nekretninu, jer se prazna vrijednost Null ne uspoređuje na sljedeći način:
Query1 | ||||||
id | L_NAME | F_name | Middle_name | rođendan | id_realty | vrsta |
5 | Gerasimovsky | nadati se | P. | 14.03.1992 | 4 | Dijeljeno vlasništvo |
6 | Gerasimovsky | Oleg | Albertovich | 29.01.1985 | 4 | Dijeljeno vlasništvo |
7 | Sukhanovskaya | porota | A. | 25.09.1976 | 3 | Zajedničko zajedničko vlasništvo |
8 | Sukhanovskaya | Julia | Y. | 01.10.2001 | 3 | Zajedničko zajedničko vlasništvo |
Da biste spriječili da se pogreške pojavljuju iz tog razloga, najbolje je odrediti uvjet odabira odmah nakon povezivanja. Predlažemo da uz pomoć lijevog spoja sql razmotrite sljedeći primjer.
SELECT Peoples. *, Realty_peoples.id_realty, Realty_peoples.type Od naroda LEFT JOIN Realty_peoples UKLJUČENO (Peoples.id = Realty_peoples.id_peoples AND tip <> "Property") |
Rezultat je sljedeći:
Query1 | ||||||
id | L_NAME | F_name | Middle_name | rođendan | id_realty | vrsta |
1 | Ivanova | Daria | B. | 16.07.2000 | ||
2 | Pugin | Vladislav | Nikolaevich | 29.01.1986 | ||
3 | Evgenin | Aleksandar | Federovich | 30.04.1964 | ||
4 | Annina | ljubav | P. | 31.12.1989 | ||
5 | Gerasimovsky | nadati se | P. | 14.03.1992 | 4 | Dijeljeno vlasništvo |
6 | Gerasimovsky | Oleg | Albertovich | 29.01.1985 | 4 | Dijeljeno vlasništvo |
7 | Sukhanovskaya | porota | A. | 25.09.1976 | 3 | Zajedničko zajedničko vlasništvo |
8 | Sukhanovskaya | Julia | Y. | 01.10.2001 | 3 | Zajedničko zajedničko vlasništvo |
Dakle, slijedeći jednostavne lijevo pridružiti SQL primjer, dobili smo popis svih ljudi, kreće dalje, jedan od tih nekretnina u kapital / suvlasništva.
Kao zaključak želim ponovnonaglasiti da je nužno preuzeti odgovornost za odabir bilo koje informacije iz baze podataka. Mnoge nijanse su se otvorile pred nama pomoću jednostavnog lijevog spoja sql, čije objašnjenje je jedno - prije nego što započnemo sastaviti čak i elementarni upit, moramo pažljivo razumjeti što točno želimo dobiti kao rezultat. Sretno!
</ p>