SQLite Sammenføyning: Naturlig venstre ytre, indre, kryss med tabeller

⚡ Smart oppsummering

SQLite JOIN-klausuler kombinerer rader fra to eller flere tabeller ved hjelp av INNER JOIN, JOIN USING, NATURAL JOIN, LEFT OUTER JOIN og CROSS JOIN, slik at du kan matche relaterte poster etter delte kolonner og lese data på tvers av en normalisert database.

  • 🔗 Bli med-klausul: JOIN-klausulen kobler to eller flere tabeller eller delspørringer i en delt kolonne, definert med en ON- eller USING-betingelse.
  • 🎯 INDRE BLITT: INNER JOIN returnerer bare radene der sammenføyningsbetingelsen samsvarer i begge tabellene, og forkaster ikke-samsvarende rader.
  • 🧩 BRUK og NATURLIG: JOIN USING navngir én delt kolonne, mens NATURAL JOIN samsvarer automatisk med alle kolonner med identisk navn.
  • ↩️ VENSTRE YTRE SAMMENFØRING: LEFT OUTER JOIN beholder alle rader i venstre tabell og fyller ikke-samsvarende kolonner i høyre tabell med NULL-verdier.
  • ✖️ KRYSSFORBINDING: CROSS JOIN returnerer det kartesiske produktet, og parer hver rad i venstre tabell med hver rad i høyre tabell.
  • 🤖 AI-hjelp: AI-tekst-til-SQL-verktøy og GitHub Copilot genererer SQLite JOIN-spørringer fra ledetekster på vanlig engelsk.

SQLite Bli med

SQLite støtter ulike typer SQL Blir med, som INNER JOIN, LEFT OUTER JOIN og CROSS JOIN. Hver type JOIN brukes til en annen situasjon som vi vil se i denne opplæringen.

Introduksjon til SQLite BLI MED Klausul

Når du jobber med en database med flere tabeller, må du ofte hente data fra disse flere tabellene.

Med JOIN-klausulen kan du koble to eller flere tabeller eller underspørringer ved å slå dem sammen. Du kan også definere hvilken kolonne du trenger for å koble tabellene og etter hvilke betingelser.

Enhver JOIN-klausul må ha følgende syntaks:

SQLite BLI MED Klausul Syntaks

Hver join-klausul inneholder:

  • En tabell eller en underspørring som er den venstre tabellen; tabellen eller underspørringen før join-klausulen (til venstre for den).
  • JOIN-operatør – spesifiser sammenføyningstypen (enten INNER JOIN, LEFT OUTER JOIN eller CROSS JOIN).
  • JOIN-begrensning – etter at du har spesifisert tabellene eller underspørringene som skal sammenføyes, må du spesifisere en sammenføyningsbegrensning, som vil være en betingelse der de samsvarende radene som samsvarer med den betingelsen vil bli valgt avhengig av sammenføyningstypen.

Merk at for alt det følgende SQLite JOIN-tabelleksempler, du må kjøre sqlite3.exe og åpne en tilkobling til eksempeldatabasen som flyter:

Trinn 1) I dette trinnet åpner du Min datamaskin og navigerer til følgende katalog "C:\sqlite" og åpner deretter "sqlite3.exe":

Åpne sqlite3.exe fra sqlite-katalogen

Trinn 2) Åpne databasen «TutorialsSampleDB.db» med følgende kommando:

Åpne TutorialsSampleDB-databasen

Nå er du klar til å kjøre alle typer spørringer på databasen.

SQLite INNER JOIN

SQLite INNER JOIN Venn-diagram

INNER JOIN returnerer bare radene som samsvarer med sammenføyningsbetingelsen og eliminerer alle andre rader som ikke samsvarer med sammenføyningsbetingelsen.

Eksempel

I det følgende eksemplet vil vi slå sammen de to tabellene «Students» og «Departments» med DepartmentId for å få avdelingsnavnet for hver student, som følger:

SELECT
  Students.StudentName,
  Departments.DepartmentName
FROM Students
INNER JOIN Departments ON Students.DepartmentId = Departments.DepartmentId;

Forklaring av kode

INNER JOIN fungerer som følger:

  • I Select-leddet kan du velge hvilke kolonner du vil velge fra de to refererte tabellene.
  • INNER JOIN-klausulen er skrevet etter den første tabellen referert til med "Fra"-klausulen.
  • Deretter angis sammenføyningsbetingelsen med PÅ.
  • Aliaser kan spesifiseres for refererte tabeller.
  • Det INDRE ordet er valgfritt, du kan bare skrive JOIN.

Produksjon

INNER JOIN produserer postene fra både studentenes og avdelingens tabeller som samsvarer med betingelsen «Students.DepartmentId = Departments.DepartmentId». De ikke-samsvarende radene vil bli ignorert og ikke inkludert i resultatet.

SQLite Eksempel på INNER JOIN-resultat

Derfor ble bare 8 av 10 studenter returnert fra denne spørringen med IT-, matematikk- og fysikkavdelingene. Studentene «Jena» og «George» ble ikke inkludert, fordi de har en null avdelings-ID, som ikke samsvarer med avdelings-ID-kolonnen fra avdelingstabellen. Som følger:

SQLite INNER JOIN samsvarte rader

SQLite BLI MED … BRUKER

INNER JOIN kan skrives ved å bruke "USING"-klausulen for å unngå redundans, så i stedet for å skrive "ON Students.DepartmentId = Departments.DepartmentId", kan du bare skrive "USING(DepartmentID)".

Du kan bruke "BLI MED .. BRUKER" når kolonnene du vil sammenligne i sammenføyningsbetingelsen har samme navn. I slike tilfeller er det ikke nødvendig å gjenta dem ved å bruke på-betingelsen og bare oppgi kolonnenavnene og SQLite vil oppdage det.

Forskjellen mellom INNER JOIN og JOIN .. BRUK:

Med «JOIN … USING» skriver du ikke en join-betingelse, du skriver bare join-kolonnen som er felles for de to joinede tabellene. I stedet for å skrive tabell1 «INNER JOIN tabell2 ON tabell1.cola = tabell2.cola» skriver vi det som «tabell1 JOIN tabell2 USING(cola)».

Eksempel

I det følgende eksemplet vil vi slå sammen de to tabellene «Students» og «Departments» med DepartmentId for å få avdelingsnavnet for hver student, som følger:

SELECT
  Students.StudentName,
  Departments.DepartmentName
FROM Students
INNER JOIN Departments USING(DepartmentId);

Forklaring

  • I motsetning til i forrige eksempel skrev vi ikke «ON Students.DepartmentId = Departments.DepartmentId». Vi skrev bare «USING(DepartmentId)».
  • SQLite slutter automatisk sammenføyningsbetingelsen og sammenligner avdelings-ID fra begge tabellene – studenter og avdelinger.
  • Du kan bruke denne syntaksen når de to kolonnene du sammenligner har samme navn.

Produksjon

Dette vil gi deg det samme nøyaktige resultatet som forrige eksempel:

SQLite BLI MED HVORDAN Eksempelresultat

SQLite NATURLIG BLI MED

EN NATURLIG JOIN er lik en JOIN...USING, forskjellen er at den automatisk tester for likhet mellom verdiene til hver kolonne som finnes i begge tabellene.

Forskjellen mellom INNER JOIN og en NATURAL JOIN:

  • I INNER JOIN må du spesifisere en sammenføyningsbetingelse som den indre sammenføyningen bruker for å koble de to tabellene. I den naturlige sammenføyningen skriver du derimot ikke en sammenføyningsbetingelse. Du skriver bare navnene på de to tabellene uten noen betingelse. Da vil den naturlige sammenføyningen automatisk teste for likhet mellom verdiene for hver kolonne som finnes i begge tabellene. Natural join utleder sammenføyningsbetingelsen automatisk.
  • I NATURLIG JOIN vil alle kolonnene fra begge tabellene med samme navn bli matchet mot hverandre. For eksempel, hvis vi har to tabeller med to kolonnenavn felles (de to kolonnene finnes med samme navn i de to tabellene), vil den naturlige sammenføyningen slå sammen de to tabellene ved å sammenligne verdiene til begge kolonnene og ikke bare fra en søyle.

Eksempel

SELECT
  Students.StudentName,
  Departments.DepartmentName
FROM Students
Natural JOIN Departments;

Forklaring

  • Vi trenger ikke å skrive en join-betingelse med kolonnenavn (slik vi gjorde i INNER JOIN). Vi trengte ikke engang å skrive kolonnenavnet én gang (slik vi gjorde i JOIN USING).
  • Den naturlige sammenføyningen vil skanne begge kolonnene fra de to tabellene. Den vil oppdage at betingelsen bør bestå av å sammenligne avdelings-ID fra begge tabellene Studenter og avdelinger.

Produksjon

NATURAL JOIN vil gi deg nøyaktig samme utdata som utdataene vi fikk fra INNER JOIN og JOIN USING-eksemplene, fordi i vårt eksempel er alle tre spørringene likeverdige. Men i noen tilfeller vil utdataene være forskjellig fra inner join enn i en naturlig join. Hvis det for eksempel er flere tabeller med samme navn, vil den naturlige joinen matche alle kolonnene mot hverandre. Inner joinen vil imidlertid bare matche kolonnene i join-betingelsen.

SQLite Eksempel på resultat for NATURLIG JOIN

SQLite VENSTRE YTRE MEDLEM

SQL-standarden definerer tre typer OUTER JOINs: LEFT, RIGHT og FULL, men SQLite støtter kun den naturlige VENSTRE YTRE JOIN.

I LEFT OUTER JOIN vil alle verdiene i kolonnene du velger fra den venstre tabellen bli inkludert i resultatet av spørringen, så uansett om verdien samsvarer med sammenføyningsbetingelsen eller ikke, vil den bli inkludert i resultatet.

Så hvis den venstre tabellen har 'n' rader, vil resultatene av spørringen ha 'n' rader. For verdiene i kolonnene som kommer fra den høyre tabellen, vil imidlertid en verdi som ikke samsvarer med sammenføyningsbetingelsen inneholde en "null"-verdi.

Så du vil få et antall rader som tilsvarer antall rader i venstre sammenføyning. Slik at du får de samsvarende radene fra begge tabellene (som INNER JOIN-resultatene), pluss de ikke-matchende radene fra den venstre tabellen.

Eksempel

I følgende eksempel vil vi prøve "LEFT JOIN" for å slå sammen de to tabellene "Students" og "Departments":

SELECT
  Students.StudentName,
  Departments.DepartmentName
FROM Students             -- this is the left table
LEFT JOIN Departments ON Students.DepartmentId = Departments.DepartmentId;

Forklaring

  • SQLite LEFT JOIN syntaks er den samme som INNER JOIN; du skriver LEFT JOIN mellom de to tabellene, og så kommer joinbetingelsen etter ON-leddet.
  • Den første tabellen etter fra-klausulen er den venstre tabellen. Mens den andre tabellen spesifisert etter den naturlige LEFT JOIN er den høyre tabellen.
  • OUTER-leddet er valgfritt; LEFT naturlig YTRE JOIN er det samme som LEFT JOIN.

Produksjon

Som du kan se er alle radene fra studenttabellen inkludert, som er 10 studenter totalt. Selv om den fjerde og siste studenten, Jena og George, har avdelings-ID-er som ikke finnes i avdelingstabellen, er de også inkludert.

Og i disse tilfellene vil departmentName-verdien for både Jena og George være «null» fordi departments-tabellen ikke har et departmentName som samsvarer med departmentId-verdien deres.

SQLite Eksempel på resultat for LEFT OUTER JOIN

La oss gi den forrige spørringen som brukte venstrekoblingen en dypere forklaring ved hjelp av Venn-diagrammer:

SQLite VENSTRE YTRE SAMMENFØRING Venn-diagram

LEFT JOIN vil gi alle studentene navn fra studenttabellen, selv om studenten har en avdelings-ID som ikke finnes i avdelingstabellen. Så spørringen vil ikke bare gi deg de samsvarende radene som INNER JOIN, men vil gi deg den ekstra delen som har de ikke-samsvarende radene fra den venstre tabellen, som er studenttabellen.

Merk at alle studentnavn som ikke har noen samsvarende avdeling vil ha en "null"-verdi for avdelingsnavn, fordi det ikke er noen samsvarende verdi for det, og disse verdiene er verdiene i radene som ikke samsvarer.

SQLite KRYSS BLI MED

En CROSS JOIN gir det kartesiske produktet for de valgte kolonnene i de to sammenføyde tabellene, ved å matche alle verdiene fra den første tabellen med alle verdiene fra den andre tabellen.

Så, for hver verdi i den første tabellen, vil du få 'n'-treff fra den andre tabellen der n er antall andre tabellrader.

I motsetning til INNER JOIN og LEFT OUTER JOIN, trenger du ikke å spesifisere en sammenføyningsbetingelse med CROSS JOIN, fordi SQLite trenger den ikke for CROSS JOIN.

Ocuco SQLite vil resultere i et logisk resultatsett ved å kombinere alle verdiene fra den første tabellen med alle verdiene fra den andre tabellen.

Hvis du for eksempel valgte en kolonne fra den første tabellen (kolonneA) og en annen kolonne fra den andre tabellen (kolonneB). KolonnA inneholder to verdier (1,2) og kolonnB inneholder også to verdier (3,4).

Da vil resultatet av CROSS JOIN være fire rader:

  • To rader ved å kombinere den første verdien fra colA som er 1 med de to verdiene til colB (3,4) som vil være (1,3), (1,4).
  • Likeledes to rader ved å kombinere den andre verdien fra colA som er 2 med de to verdiene til colB (3,4) som er (2,3), (2,4).

Eksempel

I følgende spørring vil vi prøve CROSS JOIN mellom studentene og avdelingstabellene:

SELECT
  Students.StudentName,
  Departments.DepartmentName
FROM Students
CROSS JOIN Departments;

Forklaring

  • på SQLite velg fra flere tabeller, vi valgte bare to kolonner "studentnavn" fra studenttabellen og "avdelingsnavn" fra avdelingstabellen.
  • For krysskoblingen spesifiserte vi ingen sammenføyningsbetingelse, bare de to tabellene kombinert med CROSS JOIN i midten av dem.

Produksjon

Som du kan se, er resultatet 40 rader; 10 verdier fra elevtabellen matchet mot de 4 avdelingene fra avdelingstabellen. Som følgende:

  • Fire verdier for de fire avdelingene fra avdelingstabellen samsvarte med den første studenten Michel.
  • Fire verdier for de fire avdelingene fra avdelingstabellen samsvarte med den andre studenten John.
  • Fire verdier for de fire avdelingene fra avdelingstabellen samsvarte med den tredje studenten Jack ... og så videre.

SQLite Eksempel på CROSS JOIN-resultat

Spørsmål og svar

SQLite la til støtte for RIGHT JOIN og FULL OUTER JOIN i versjon 3.39.0, utgitt i 2022. På eldre versjoner emulerer du en RIGHT JOIN ved å bytte.ping tabellene i en LEFT JOIN, og en FULL OUTER JOIN ved å kombinere to LEFT JOIN-er med UNION.

En selvkobling kobler en tabell til seg selv ved hjelp av tabellaliaser, slik at én kopi fungerer som venstre tabell og en annen som høyre. Det er nyttig for å sammenligne rader i samme tabell, for eksempel for å matche ansatte med lederne deres.

Ja. Du kjeder sammen flere JOIN-klausuler i én SELECT, hver med sin egen ON- eller USING-betingelse, for eksempel FROM A JOIN B ON … JOIN C ON …. SQLite kobler sammen tabellene fra venstre mot høyre til ett kombinert resultatsett.

Å skrive JOIN alene er det samme som INNER JOIN i SQLiteBegge beholder bare radene som oppfyller ON- eller USING-betingelsen, slik at ikke-matchede rader fjernes. INNER-nøkkelordet er valgfritt, noe som gjør JOIN og INNER JOIN utskiftbare.

Å opprette en indeks på kolonnene som brukes i sammenføyningsbetingelsen lar SQLite matche rader uten å skanne hele tabeller, noe som øker hastigheten på sammenføyninger på store datasett. Indeksering av fremmednøkkelkolonner og kjøring av ANALYZE for å oppdatere statistikk forbedrer ytelsen for sammenføyningsspørringer ytterligere.

En INNER JOIN returnerer bare rader som samsvarer i begge tabellene. En LEFT OUTER JOIN returnerer hver rad fra venstre tabell pluss samsvarende rader i høyre tabell, og fyller ikke-samsvarende høyre kolonner med NULL. Så en LEFT JOIN fjerner aldri rader i venstre tabell.

Ja. AI-tekst-til-SQL-assistenter gjør forespørsler på vanlig engelsk om til SQLite INNER-, LEFT-, NATURAL- og CROSS JOIN-setninger. Å oppgi tabellnavn, kolonnenavn og relasjoner forbedrer nøyaktigheten, og hver genererte kobling bør gjennomgås og testes før den kjøres på reelle data.

GitHub Copilot antyder SQLite JOIN-spørringer innebygd i redigeringsprogrammer som VS Code, fullfører INNER JOIN, LEFT JOIN og ON eller USING-klausuler. Den leser nærliggende skjemaer og kommentarer, slik at forslagene bruker de virkelige tabell- og kolonnenavnene dine på nytt.

Oppsummer dette innlegget med: