SQLite Spoj: prirodni lijevi vanjski, unutarnji, križ s primjerom tablica
SQLite podržava različite vrste SQL Spojevi, kao INNER JOIN, LEFT OUTER JOIN i CROSS JOIN. Svaki tip JOIN-a koristi se za različite situacije kao što ćemo vidjeti u ovom vodiču.
Uvod u SQLite JOIN Klauzula
Kada radite na bazi podataka s više tablica, često trebate dobiti podatke iz tih više tablica.
Pomoću klauzule JOIN možete povezati dvije ili više tablica ili podupita njihovim spajanjem. Također, možete definirati po kojem stupcu trebate povezati tablice i po kojim uvjetima.
Svaka JOIN klauzula mora imati sljedeću sintaksu:

Svaka klauzula spajanja sadrži:
- Tablica ili podupit koji je lijeva tablica; tablicu ili podupit prije klauzule spajanja (lijevo od nje).
- Operator JOIN – navedite vrstu spajanja (ili UNUTARNJE SPAJANJE, LIJEVO VANJSKO SPAJANJE ili KRIŽNO SPAJANJE).
- JOIN-ograničenje – nakon što ste naveli tablice ili podupite za spajanje, trebate navesti ograničenje spajanja, što će biti uvjet prema kojem će odgovarajući retci koji odgovaraju tom uvjetu biti odabrani ovisno o vrsti spajanja.
Imajte na umu da za sve sljedeće SQLite Primjeri JOIN tablica, morate pokrenuti sqlite3.exe i otvoriti vezu s oglednom bazom podataka kako teče:
Korak 1) U ovom koraku
- Otvorite Moje računalo i dođite do sljedećeg direktorija "C:\sqlite"I
- Zatim otvorite "sqlite3.exe"
Korak 2) Otvori bazu podataka “TutorialsSampleDB.db” sljedećom naredbom:
Sada ste spremni pokrenuti bilo koju vrstu upita u bazi podataka.
SQLite INNER JOIN
INNER JOIN vraća samo retke koji odgovaraju uvjetu spajanja i eliminira sve druge retke koji ne odgovaraju uvjetu spajanja.
Primjer
U sljedećem primjeru spojit ćemo dvije tablice "Studenti"A"Odjeli” s DepartmentId da biste dobili naziv odjela za svakog učenika, kako slijedi:
SELECT Students.StudentName, Departments.DepartmentName FROM Students INNER JOIN Departments ON Students.DepartmentId = Departments.DepartmentId;
Objašnjenje koda
INNER JOIN radi na sljedeći način:
- U klauzuli Select možete odabrati bilo koje stupce koje želite odabrati iz dvije referentne tablice.
- Klauzula INNER JOIN napisana je nakon prve tablice na koju upućuje klauzula "Od".
- Tada se uvjet spajanja specificira s ON.
- Aliasi se mogu navesti za referentne tablice.
- Riječ INNER nije obavezna, možete samo napisati JOIN.
Izlaz
- INNER JOIN proizvodi zapise iz tablica studenata i odjela koji odgovaraju uvjetu koji je "Sstudenti.DepartmentId = Departments.DepartmentId “. Nepodudarni redovi bit će zanemareni i neće biti uključeni u rezultat.
- Zbog toga je samo 8 učenika od 10 učenika vraćeno iz ovog upita s odjelima informatike, matematike i fizike. Dok učenici “Jena” i “George” nisu uključeni, jer imaju nulti ID odjela, koji ne odgovara stupcu DepartmentId iz tablice odjela. Kao što slijedi:
SQLite PRIDRUŽITE SE ... KORIŠTENJEM
INNER JOIN može se napisati korištenjem klauzule "USING" kako bi se izbjegla redundantnost, tako da umjesto pisanja "ON Students.DepartmentId = Departments.DepartmentId", možete jednostavno napisati "USING(DepartmentID)".
Možete upotrijebiti "JOIN .. USING" kad god stupci koje ćete usporediti u uvjetu spajanja imaju isti naziv. U takvim slučajevima, nema potrebe ponavljati ih korištenjem uvjeta i samo navesti nazive stupaca i SQLite otkrit će to.
Razlika između INNER JOIN i JOIN .. UPOTREBA:
S “JOIN … USING” ne pišete uvjet spajanja, samo pišete stupac spajanja koji je zajednički između dvije spojene tablice, umjesto pisanja table1 “INNER JOIN table2 ON table1.cola = table2.cola” pišemo to je poput “table1 JOIN table2 USING(cola)”.
Primjer
U sljedećem primjeru spojit ćemo dvije tablice "Studenti"A"Odjeli” s DepartmentId da biste dobili naziv odjela za svakog učenika, kako slijedi:
SELECT Students.StudentName, Departments.DepartmentName FROM Students INNER JOIN Departments USING(DepartmentId);
Objašnjenje
- Za razliku od prethodnog primjera, nismo napisali “ON Students.DepartmentId = Departments.DepartmentId“. Upravo smo napisali "USING (ID odjela)".
- SQLite automatski zaključuje uvjet pridruživanja i uspoređuje ID odjela iz obje tablice – Studenti i Odjeli.
- Ovu sintaksu možete koristiti kad god dva stupca koja uspoređujete imaju isti naziv.
Izlaz
- Ovo će vam dati isti točan rezultat kao prethodni primjer:
SQLite PRIRODNI SPOJ
NATURAL JOIN sličan je JOIN…USING, razlika je u tome što automatski testira jednakost između vrijednosti svakog stupca koji postoji u objema tablicama.
Razlika između INNER JOIN-a i NATURAL JOIN-a:
- U INNER JOIN morate navesti uvjet spajanja koji unutarnji spoj koristi za spajanje dviju tablica. Dok u prirodnom spajanju ne pišete uvjet spajanja. Samo napišite nazive dviju tablica bez ikakvih uvjeta. Zatim će prirodno spajanje automatski testirati jednakost između vrijednosti za svaki stupac koji postoji u objema tablicama. Prirodno spajanje automatski zaključuje uvjet spajanja.
- U NATURAL JOIN-u, svi stupci iz obje tablice s istim imenom bit će međusobno usklađeni. Na primjer, ako imamo dvije tablice s dva zajednička imena stupaca (dva stupca postoje s istim imenom u dvije tablice), tada će prirodni spoj spojiti dvije tablice usporedbom vrijednosti oba stupca, a ne samo iz jednog stupac.
Primjer
SELECT Students.StudentName, Departments.DepartmentName FROM Students Natural JOIN Departments;
Objašnjenje
- Ne trebamo pisati uvjet spajanja s imenima stupaca (kao što smo radili u INNER JOIN). Nismo ni jednom trebali napisati naziv stupca (kao što smo to učinili u JOIN USING).
- Prirodno spajanje će skenirati oba stupca iz dvije tablice. Otkrit će da bi uvjet trebao biti sastavljen od usporedbe DepartmentId-a iz obje tablice Studenti i Odjeli.
Izlaz
- Natural JOIN će vam dati isti točan izlaz kao izlaz koji smo dobili iz primjera INNER JOIN i JOIN USING. Zato što su u našem primjeru sva tri upita ekvivalentna. Ali u nekim će se slučajevima izlaz razlikovati od unutarnjeg spajanja nego kod prirodnog spajanja. Na primjer, ako postoji više tablica s istim imenima, tada će prirodni spoj međusobno odgovarati svim stupcima. Međutim, unutarnje spajanje odgovarat će samo stupcima u uvjetima spajanja (više detalja u sljedećem odjeljku; razlika između unutarnjeg spajanja i prirodnog spajanja).
SQLite LIJEVI VANJSKI SPOJ
SQL standard definira tri tipa OUTER JOIN-ova: LIJEVI, DESNI i PUNI, ali SQLite podržava samo prirodni LIJEVI VANJSKI SPOJ.
U LEFT OUTER JOIN, sve vrijednosti stupaca koje odaberete iz lijeve tablice bit će uključene u rezultat pitanje, pa bez obzira odgovara li vrijednost uvjetu pridruživanja ili ne, bit će uključena u rezultat.
Dakle, ako lijeva tablica ima 'n' redaka, rezultati upita će imati 'n' redaka. Međutim, za vrijednosti stupaca koji dolaze iz desne tablice, ako bilo koja vrijednost ne odgovara uvjetu spajanja, sadržavat će "nultu" vrijednost.
Dakle, dobit ćete broj redaka ekvivalentan broju redaka u lijevom spoju. Tako da ćete dobiti odgovarajuće retke iz obje tablice (poput rezultata INNER JOIN), plus retke koji se ne podudaraju iz lijeve tablice.
Primjer
U sljedećem primjeru pokušat ćemo "LEFT JOIN" spojiti dvije tablice "Studenti" i "Odjeli":
SELECT Students.StudentName, Departments.DepartmentName FROM Students -- this is the left table LEFT JOIN Departments ON Students.DepartmentId = Departments.DepartmentId;
Objašnjenje
- SQLite LEFT JOIN sintaksa je ista kao INNER JOIN; napišete LEFT JOIN između dvije tablice, a zatim uvjet spajanja dolazi nakon klauzule ON.
- Prva tablica nakon klauzule from je lijeva tablica. Dok je druga tablica navedena nakon prirodnog LIJEVOG JOIN-a desna tablica.
- OUTER klauzula nije obavezna; LEFT natural OUTER JOIN je isto što i LEFT JOIN.
Izlaz
- Kao što vidite, uključeni su svi redovi iz tablice učenika, što je ukupno 10 učenika. Čak i ako četvrti i zadnji učenik, Jena i George DepartmentIds ne postoje u tablici Odjeli, oni su također uključeni.
- U tim će slučajevima vrijednost DepartmentName i za Jenu i za Georgea biti "nula" jer tablica odjela nema DepartmentName koji odgovara njihovoj vrijednosti DepartmentId.
Dajmo prethodnom upitu pomoću lijevog spoja dublje objašnjenje pomoću Van dijagrama:
LEFT JOIN će svim učenicima dati imena iz tablice učenika čak i ako student ima ID odjela koji ne postoji u tablici odjela. Dakle, upit vam neće dati samo podudarne retke kao INNER JOIN, već će vam dati dodatni dio koji ima nepodudarne retke iz lijeve tablice, a to je tablica učenika.
Imajte na umu da će svako ime učenika koje nema odgovarajući odjel imati "null" vrijednost za naziv odjela, jer za njega ne postoji odgovarajuća vrijednost, a te vrijednosti su vrijednosti u recima koji se ne podudaraju.
SQLite CROSS PRIDRUŽITE se
CROSS JOIN daje kartezijanski produkt za odabrane stupce dviju spojenih tablica, spajanjem svih vrijednosti iz prve tablice sa svim vrijednostima iz druge tablice.
Dakle, za svaku vrijednost u prvoj tablici, dobit ćete 'n' podudaranja iz druge tablice gdje je n broj redaka druge tablice.
Za razliku od INNER JOIN-a i LEFT OUTER JOIN-a, s CROSS JOIN-om ne morate navesti uvjet spajanja jer SQLite ne treba za CROSS JOIN.
The SQLite rezultirat će logičnim rezultatima postavljenim kombiniranjem svih vrijednosti iz prve tablice sa svim vrijednostima iz druge tablice.
Na primjer, ako ste odabrali stupac iz prve tablice (colA) i drugi stupac iz druge tablice (colB). colA sadrži dvije vrijednosti (1,2), a colB također sadrži dvije vrijednosti (3,4).
Tada će rezultat CROSS JOIN biti četiri retka:
- Dva retka kombiniranjem prve vrijednosti iz colA koja je 1 s dvije vrijednosti colB (3,4) koje će biti (1,3), (1,4).
- Isto tako, dva retka kombiniranjem druge vrijednosti iz colA koja je 2 s dvije vrijednosti colB (3,4) koje su (2,3), (2,4).
Primjer
U sljedećem upitu pokušat ćemo CROSS JOIN između tablica Students i Departments:
SELECT Students.StudentName, Departments.DepartmentName FROM Students CROSS JOIN Departments;
Objašnjenje
- u SQLite odaberite iz više tablica, upravo smo odabrali dva stupca "ime studenta" iz tablice studenata i "naziv odjela" iz tablice odjela.
- Za križno spajanje nismo naveli uvjet spajanja samo dvije tablice u kombinaciji s CROSS JOIN-om u sredini.
Izlaz
Kao što vidite, rezultat je 40 redaka; 10 vrijednosti iz tablice učenika podudara se s 4 odjela iz tablice odjela. Kao što slijedi:
- Četiri vrijednosti za četiri odjela iz tablice odjela podudaraju se s prvim učenikom Michelom.
- Četiri vrijednosti za četiri odjela iz tablice odjela podudaraju se s drugim učenikom Ivanom.
- Četiri vrijednosti za četiri odjela iz tablice odjela podudaraju se s trećim učenikom Jackom… i tako dalje.
Rezime
Korištenje SQLite Upit JOIN, možete povezati jednu ili više tablica ili podupita kako biste odabrali stupce iz obje tablice ili podupita.