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.
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:
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":
Trinn 2) Åpne databasen «TutorialsSampleDB.db» med følgende kommando:
Nå er du klar til å kjøre alle typer spørringer på databasen.
SQLite INNER JOIN
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.
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 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 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 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.
La oss gi den forrige spørringen som brukte venstrekoblingen en dypere forklaring ved hjelp av Venn-diagrammer:
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.












