SQLite Spoj: Prirodni lijevi vanjski, unutarnji, križni s tablicama

⚡ Pametni sažetak

SQLite JOIN klauzule kombiniraju retke iz dvije ili više tablica koristeći INNER JOIN, JOIN USING, NATURAL JOIN, LEFT OUTER JOIN i CROSS JOIN, što vam omogućuje uparivanje povezanih zapisa prema zajedničkim stupcima i čitanje podataka u normaliziranoj bazi podataka.

  • 🔗 Pridružite se klauzuli: Klauzula JOIN povezuje dvije ili više tablica ili podupita na zajedničkom stupcu, definiranom uvjetom ON ili USING.
  • 🎯 UNUTARNJI SPOJ: INNER JOIN vraća samo retke u kojima se uvjet spajanja podudara u obje tablice, odbacujući nepodudarne retke.
  • 🧩 KORIŠTENJE i PRIRODNO: JOIN USING imenuje jedan dijeljeni stupac, dok NATURAL JOIN automatski pronalazi spojeve sa svim identično imenovanim stupcima.
  • ↩️ LIJEVI VANJSKI SPOJEV: LIJEVI VANJSKI SPAJ zadržava svaki redak lijeve tablice i popunjava neusklađene stupce desne tablice s NULL vrijednostima.
  • ✖️ UNAKRŠNO SPOJITI: CROSS JOIN vraća Kartezijev produkt, uparujući svaki redak lijeve tablice sa svakim retkom desne tablice.
  • 🤖 AI pomoć: Alati za pretvaranje teksta u SQL pomoću umjetne inteligencije i GitHub Copilot generiraju SQLite JOIN upiti iz upita na običnom engleskom jeziku.

SQLite Pridružite se

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:

SQLite JOIN Sintaksa klauzule

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 idite do sljedećeg direktorija „C:\sqlite“, a zatim otvorite „sqlite3.exe“:

Otvorite sqlite3.exe iz sqlite direktorija

Korak 2) Otvorite bazu podataka „TutorialsSampleDB.db“ sljedećom naredbom:

Otvorite bazu podataka TutorialsSampleDB

Sada ste spremni pokrenuti bilo koju vrstu upita u bazi podataka.

SQLite INNER JOIN

SQLite INNER JOIN Vennov dijagram

INNER JOIN vraća samo retke koji odgovaraju uvjetu spajanja i eliminira sve ostale retke koji ne odgovaraju uvjetu spajanja.

Primjer

U sljedećem primjeru, spojit ćemo dvije tablice „Studenti“ i „Odjeli“ s DepartmentId kako bismo dobili naziv odjela za svakog studenta, na sljedeći način:

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 generira zapise iz tablica studenata i odjela koji odgovaraju uvjetu "Students.DepartmentId = Departments.DepartmentId". Nepodudarni retci bit će zanemareni i neće biti uključeni u rezultat.

SQLite Primjer rezultata INNER JOIN-a

Zato je iz ovog upita vraćeno samo 8 od 10 studenata s odjelima za IT, matematiku i fiziku. Dok studenti „Jena“ i „George“ nisu uključeni jer imaju nulti ID odjela, koji se ne podudara sa stupcem departmentId iz tablice odjela. Kao što slijedi:

SQLite INNER JOIN podudarajućih redaka

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-a i JOIN-a... KORIŠTENJEM:

S "JOIN ... USING" ne pišete uvjet spajanja, već samo pišete stupac spajanja koji je zajednički za dvije spojene tablice. Umjesto da pišete tablica1 "INNER JOIN tablica2 ON tablica1.cola = tablica2.cola", pišemo to kao "tablica1 JOIN tablica2 USING(cola)".

Primjer

U sljedećem primjeru, spojit ćemo dvije tablice „Studenti“ i „Odjeli“ s DepartmentId kako bismo dobili naziv odjela za svakog studenta, na sljedeći način:

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“. Samo smo napisali „USING(DepartmentId)“.
  • 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 Primjer rezultata JOIN USING-a

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-u morate odrediti uvjet spajanja koji unutarnji spoj koristi za spajanje dviju tablica. Dok u prirodnom spajanju ne pišete uvjet spajanja. Samo pišete nazive dviju tablica bez ikakvog uvjeta. Tada će prirodni spoj automatski provjeriti jednakost između vrijednosti za svaki stupac koji postoji u obje tablice. 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 moramo pisati uvjet spajanja s nazivima stupaca (kao što smo to učinili u INNER JOIN-u). Nismo čak ni trebali jednom napisati naziv stupca (kao što smo to učinili u JOIN USING-u).
  • 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

PRIRODNI JOIN će vam dati potpuno isti izlaz kao i izlaz koji smo dobili iz primjera INNER JOIN i JOIN USING, jer su u našem primjeru sva tri upita ekvivalentna. Ali u nekim slučajevima, izlaz će se razlikovati od unutarnjeg spajanja nego od prirodnog spajanja. Na primjer, ako postoji više tablica s istim nazivima, tada će prirodni spoj usporediti sve stupce jedne s drugima. Međutim, unutarnji spoj će usporediti samo stupce u uvjetu spajanja.

SQLite Primjer rezultata PRIRODNOG SPOJIVA

SQLite LIJEVI VANJSKI SPOJ

SQL standard definira tri vrste OUTER JOIN-ova: LEFT, RIGHT i FULL, ali SQLite podržava samo prirodni LIJEVI VANJSKI SPOJ.

U LEFT OUTER JOIN-u, sve vrijednosti stupaca koje odaberete iz lijeve tablice bit će uključene u rezultat upita, pa će bez obzira na to odgovara li vrijednost uvjetu spajanja ili ne, biti uključena u rezultat.

Dakle, ako lijeva tablica ima 'n' redaka, rezultati upita imat će 'n' redaka. Međutim, za vrijednosti stupaca koji dolaze iz desne tablice, ako bilo koja vrijednost ne odgovara uvjetu spajanja, sadržavat će vrijednost "null".

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 retci iz tablice studenti, što je ukupno 10 studenata. Čak i ako četvrti i posljednji student, Jena i George, imaju ID-ove odjela koji ne postoje u tablici Odjeli, oni su također uključeni.

U tim slučajevima, vrijednost departmentName i za Jenu i za Georgea bit će "null" jer tablica departments nema departmentName koji odgovara njihovoj vrijednosti departmentId.

SQLite Primjer rezultata LIJEVOG VANJSKOG SPOJA

Dajmo prethodnom upitu korištenjem lijevog spoja detaljnije objašnjenje koristeći Vennove dijagrame:

SQLite LIJEVI VANJSKI SPOJEV Vennov dijagram

LEFT JOIN će dati sva imena studenata iz tablice studenata čak i ako student ima ID odjela koji ne postoji u tablici odjela. Dakle, upit neće dati samo odgovarajuće retke kao INNER JOIN, već će vam dati dodatni dio koji ima nepodudarne retke iz lijeve tablice, a to je tablica studenata.

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, kod CROSS JOIN-a ne morate specificirati uvjet spajanja, jer SQLite ne treba ga za CROSS JOIN.

The SQLite rezultirat će logičnim skupom rezultata 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 unakrsno spajanje nismo naveli nikakav uvjet spajanja, samo dvije tablice kombinirane s CROSS JOIN-om u sredini između njih.

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 podudarale su se s drugim studentom Johnom.
  • Četiri vrijednosti za četiri odjela iz tablice odjela podudarale su se s trećim studentom Jackom… i tako dalje.

SQLite Rezultat primjera CROSS JOIN-a

Pitanja i odgovori

SQLite dodana je podrška za RIGHT JOIN i FULL OUTER JOIN u verziji 3.39.0, objavljenoj 2022. godine. Na starijim verzijama emulirate RIGHT JOIN zamjenom.ping tablice u LEFT JOIN-u i FULL OUTER JOIN-u kombiniranjem dva LEFT JOIN-a s UNION-om.

Samostalno spajanje spaja tablicu sa samom sobom pomoću aliasa tablice, tako da jedna kopija djeluje kao lijeva tablica, a druga kao desna. Korisno je za usporedbu redaka unutar iste tablice, kao što je usklađivanje zaposlenika s njihovim menadžerima.

Da. Povežete nekoliko JOIN klauzula u jednom SELECT-u, svaku sa svojim vlastitim ON ili USING uvjetom, na primjer FROM A JOIN B ON … JOIN C ON …. SQLite spaja tablice s lijeva na desno u jedan kombinirani skup rezultata.

Pisanje samog JOIN-a isto je kao i INNER JOIN u SQLiteOba zadržavaju samo retke koji zadovoljavaju uvjet ON ili USING, pa se neusklađeni retci odbacuju. Ključna riječ INNER je opcionalna, što JOIN i INNER JOIN čini zamjenjivima.

Stvaranje indeksa na stupcima korištenim u uvjetu spajanja omogućuje SQLite usklađivanje redaka bez skeniranja cijelih tablica, što ubrzava spajanja na velikim skupovima podataka. Indeksiranje stupaca stranog ključa i pokretanje naredbe ANALYZE za osvježavanje statistike dodatno poboljšava performanse upita za spajanje.

INNER JOIN vraća samo retke koji se podudaraju u obje tablice. LEFT OUTER JOIN vraća svaki redak iz lijeve tablice plus odgovarajuće retke desne tablice, popunjavajući nepodudarne desne stupce s NULL. Dakle, LEFT JOIN nikada ne izostavlja retke lijeve tablice.

Da. AI tekstualni SQL asistenti pretvaraju zahtjeve na običnom engleskom jeziku u SQLite Naredbe INNER, LEFT, NATURAL i CROSS JOIN. Navođenje naziva tablica, naziva stupaca i odnosa poboljšava točnost, a svaki generirani spoj treba pregledati i testirati prije pokretanja na stvarnim podacima.

GitHub kopilot sugerira SQLite JOIN upiti ugrađeni u editore poput VS Code, dovršavajući klauzule INNER JOIN, LEFT JOIN i ON ili USING. Čita obližnje sheme i komentare, pa njegovi prijedlozi ponovno koriste vaša stvarna imena tablica i stupaca.

Sažmite ovu objavu uz: