SQLite Forbind: Naturlig venstre ydre, indre, kryds med tabeller
โก Smart opsummering
SQLite JOIN-klausuler kombinerer rรฆkker fra to eller flere tabeller ved hjรฆlp af INNER JOIN, JOIN USING, NATURAL JOIN, LEFT OUTER JOIN og CROSS JOIN, hvilket giver dig mulighed for at matche relaterede poster efter delte kolonner og lรฆse data pรฅ tvรฆrs af en normaliseret database.

SQLite understรธtter forskellige typer SQL Joins, som INNER JOIN, LEFT OUTER JOIN og CROSS JOIN. Hver type JOIN bruges til en anden situation, som vi vil se i denne tutorial.
Introduktion til SQLite JOIN klausul
Nรฅr du arbejder pรฅ en database med flere tabeller, skal du ofte hente data fra disse flere tabeller.
Med JOIN-klausulen kan du sammenkรฆde to eller flere tabeller eller underforespรธrgsler ved at forbinde dem. Du kan ogsรฅ definere med hvilken kolonne du skal linke tabellerne og efter hvilke betingelser.
Enhver JOIN-klausul skal have fรธlgende syntaks:
Hver joinklausul indeholder:
- En tabel eller en underforespรธrgsel, som er den venstre tabel; tabellen eller underforespรธrgslen fรธr join-klausulen (til venstre for den).
- JOIN-operatรธr โ angiv sammenfรธjningstypen (enten INNER JOIN, LEFT OUTER JOIN eller CROSS JOIN).
- JOIN-begrรฆnsning โ efter at du har angivet de tabeller eller underforespรธrgsler, der skal tilsluttes, skal du angive en join-begrรฆnsning, som vil vรฆre en betingelse, hvorpรฅ de matchende rรฆkker, der matcher den betingelse, vil blive valgt afhรฆngigt af join-typen.
Bemรฆrk, at for alt det fรธlgende SQLite JOIN-tabeller eksempler, du skal kรธre sqlite3.exe og รฅbne en forbindelse til eksempeldatabasen som strรธmmende:
Trin 1) I dette trin skal du รฅbne Denne computer og navigere til fรธlgende mappe โC:\sqliteโ og derefter รฅbne โsqlite3.exeโ:
Trin 2) ร bn databasen โTutorialsSampleDB.dbโ med fรธlgende kommando:
Nu er du klar til at kรธre enhver form for forespรธrgsel pรฅ databasen.
SQLite INNER JOIN
INNER JOIN returnerer kun de rรฆkker, der matcher join-betingelsen, og eliminerer alle andre rรฆkker, der ikke matcher join-betingelsen.
Eksempel
I det fรธlgende eksempel vil vi sammenkรฆde de to tabeller "Studerende" og "Afdelinger" med Afdelings-ID for at fรฅ afdelingsnavnet for hver studerende, som fรธlger:
SELECT Students.StudentName, Departments.DepartmentName FROM Students INNER JOIN Departments ON Students.DepartmentId = Departments.DepartmentId;
Forklaring af kode
INNER JOIN fungerer som fรธlgende:
- I Select-udtrykket kan du vรฆlge de kolonner, du vil vรฆlge fra de to refererede tabeller.
- INNER JOIN-klausulen er skrevet efter den fรธrste tabel, der refereres til med "Fra"-klausulen.
- Derefter angives sammenfรธjningsbetingelsen med ON.
- Aliaser kan angives for refererede tabeller.
- Det INDRE ord er valgfrit, du kan bare skrive JOIN.
Produktion
INNER JOIN producerer poster fra bรฅde de studerendes og afdelingens tabeller, der matcher betingelsen "Students.DepartmentId = Departments.DepartmentId". De ikke-matchede rรฆkker ignoreres og inkluderes ikke i resultatet.
Derfor blev kun 8 ud af 10 studerende returneret fra denne forespรธrgsel med IT-, matematik- og fysikafdelinger. Hvorimod eleverne "Jena" og "George" ikke blev inkluderet, fordi de har et null afdelings-ID, som ikke matcher departmentId-kolonnen fra afdelingstabellen. Som fรธlger:
SQLite TILMELD โฆ VED HJรLP
INNER JOIN kan skrives ved at bruge "USING"-klausulen for at undgรฅ redundans, sรฅ i stedet for at skrive "ON Students.DepartmentId = Departments.DepartmentId", kan du bare skrive "USING(DepartmentID)".
Du kan bruge "JOIN .. USING", nรฅr de kolonner, du vil sammenligne i forbindelsestilstanden, har samme navn. I sรฅdanne tilfรฆlde er det ikke nรธdvendigt at gentage dem ved at bruge pรฅ betingelsen og blot angive kolonnenavnene og SQLite vil opdage det.
Forskellen mellem INNER JOIN og JOIN .. BRUG AF:
Med โJOIN โฆ USINGโ skriver du ikke en join-betingelse, du skriver bare den join-kolonne, som er fรฆlles for de to joinede tabeller. I stedet for at skrive tabel1 โINNER JOIN tabel2 ON tabel1.cola = tabel2.colaโ skriver vi det som โtabel1 JOIN tabel2 USING(cola)โ.
Eksempel
I det fรธlgende eksempel vil vi sammenkรฆde de to tabeller "Studerende" og "Afdelinger" med Afdelings-ID for at fรฅ afdelingsnavnet for hver studerende, som fรธlger:
SELECT Students.StudentName, Departments.DepartmentName FROM Students INNER JOIN Departments USING(DepartmentId);
Forklaring
- I modsรฆtning til det foregรฅende eksempel skrev vi ikke โON Students.DepartmentId = Departments.DepartmentIdโ. Vi skrev blot โUSING(DepartmentId)โ.
- SQLite udleder automatisk join-betingelsen og sammenligner afdelings-id'et fra begge tabeller โ studerende og afdelinger.
- Du kan bruge denne syntaks, nรฅr de to kolonner, du sammenligner, har samme navn.
Produktion
Dette vil give dig det samme nรธjagtige resultat som det foregรฅende eksempel:
SQLite NATURLIG JOIN
EN NATURLIG JOIN svarer til en JOIN...USING, forskellen er, at den automatisk tester for lighed mellem vรฆrdierne i hver kolonne, der findes i begge tabeller.
Forskellen mellem INNER JOIN og en NATURAL JOIN:
- I INNER JOIN skal du angive en join-betingelse, som den indre join bruger til at joine de to tabeller. I den naturlige join skriver du derimod ikke en join-betingelse. Du skriver blot navnene pรฅ de to tabeller uden nogen betingelse. Sรฅ vil den naturlige join automatisk teste for lighed mellem vรฆrdierne for hver kolonne, der findes i begge tabeller. Den naturlige join udleder automatisk join-betingelsen.
- I NATURAL JOIN vil alle kolonnerne fra begge tabeller med samme navn blive matchet mod hinanden. For eksempel, hvis vi har to tabeller med to kolonnenavne til fรฆlles (de to kolonner findes med samme navn i de to tabeller), sรฅ vil den naturlige sammenfรธjning forbinde de to tabeller ved at sammenligne vรฆrdierne for begge kolonner og ikke kun fra en kolonne.
Eksempel
SELECT Students.StudentName, Departments.DepartmentName FROM Students Natural JOIN Departments;
Forklaring
- Vi behรธver ikke at skrive en join-betingelse med kolonnenavne (som vi gjorde i INNER JOIN). Vi behรธvede ikke engang at skrive kolonnenavnet รฉn gang (som vi gjorde i JOIN USING).
- Den naturlige join vil scanne begge kolonner fra de to tabeller. Den vil detektere, at betingelsen skal vรฆre sammensat af sammenligning af afdelings-id fra bรฅde de to tabeller Studerende og afdelinger.
Produktion
NATURAL JOIN vil give dig prรฆcis det samme output som det output, vi fik fra INNER JOIN og JOIN USING eksemplerne, fordi alle tre forespรธrgsler i vores eksempel er รฆkvivalente. Men i nogle tilfรฆlde vil outputtet vรฆre anderledes fra Inner Join end i en Natural Join. Hvis der for eksempel er flere tabeller med de samme navne, vil den Natural Join matche alle kolonnerne mod hinanden. Den Inner Join vil dog kun matche kolonnerne i join-betingelsen.
SQLite VENSTRE YDRE JOIN
SQL-standarden definerer tre typer OUTER JOINs: LEFT, RIGHT og FULL, men SQLite understรธtter kun den naturlige LEFT OUTER JOIN.
I LEFT OUTER JOIN vil alle vรฆrdierne i de kolonner, du vรฆlger fra den venstre tabel, blive inkluderet i resultatet af forespรธrgslen, sรฅ uanset om vรฆrdien matcher join-betingelsen eller ej, vil den blive inkluderet i resultatet.
Sรฅ hvis den venstre tabel har 'n' rรฆkker, vil resultaterne af forespรธrgslen have 'n' rรฆkker. Men for vรฆrdierne i kolonnerne, der kommer fra den hรธjre tabel, vil en vรฆrdi, der ikke matcher join-betingelsen, indeholde en "null"-vรฆrdi.
Sรฅ du fรฅr et antal rรฆkker svarende til antallet af rรฆkker i venstre join. Sรฅ du fรฅr de matchende rรฆkker fra begge tabeller (som INNER JOIN-resultaterne), plus de ikke-matchende rรฆkker fra den venstre tabel.
Eksempel
I det fรธlgende eksempel vil vi prรธve "LEFT JOIN" for at forbinde de to tabeller "Studenter" og "Afdelinger":
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 mellem de to tabeller, og sรฅ kommer joinbetingelsen efter ON-sรฆtningen.
- Den fรธrste tabel efter fra-klausulen er den venstre tabel. Hvorimod den anden tabel angivet efter den naturlige LEFT JOIN er den rigtige tabel.
- OUTER-sรฆtningen er valgfri; LEFT natural OUTER JOIN er det samme som LEFT JOIN.
Produktion
Som du kan se, er alle rรฆkkerne fra elevtabellen inkluderet, hvilket er i alt 10 elever. Selv hvis den fjerde og sidste elev, Jena og George, har afdelings-ID'er, der ikke findes i afdelingstabellen, er de ogsรฅ inkluderet.
Og i disse tilfรฆlde vil vรฆrdien af โโdepartmentName for bรฅde Jena og George vรฆre "null", fordi tabellen over departments ikke har et departmentName, der matcher deres departmentId-vรฆrdi.
Lad os give den foregรฅende forespรธrgsel, der brugte venstre join, en dybere forklaring ved hjรฆlp af Venn-diagrammer:
LEFT JOIN giver alle eleverne navne fra elevtabellen, selvom eleven har et afdelings-id, der ikke findes i afdelingstabellen. Sรฅ forespรธrgslen vil ikke kun give dig de matchende rรฆkker som INNER JOIN, men vil ogsรฅ give dig den ekstra del, der indeholder de ikke-matchende rรฆkker fra den venstre tabel, som er elevtabellen.
Bemรฆrk, at ethvert elevnavn, der ikke har nogen matchende afdeling, vil have en "nul"-vรฆrdi for afdelingsnavn, fordi der ikke er nogen matchende vรฆrdi for det, og disse vรฆrdier er vรฆrdierne i de ikke-matchende rรฆkker.
SQLite KRรS DETALJER
En CROSS JOIN giver det kartesiske produkt for de valgte kolonner i de to sammenfรธjede tabeller ved at matche alle vรฆrdierne fra den fรธrste tabel med alle vรฆrdierne fra den anden tabel.
Sรฅ for hver vรฆrdi i den fรธrste tabel vil du fรฅ 'n'-matches fra den anden tabel, hvor n er antallet af anden tabelrรฆkker.
I modsรฆtning til INNER JOIN og LEFT OUTER JOIN behรธver du med CROSS JOIN ikke at angive en join-betingelse, fordi SQLite behรธver det ikke til CROSS JOIN.
SQLite vil resultere i et logisk resultatsรฆt ved at kombinere alle vรฆrdierne fra den fรธrste tabel med alle vรฆrdierne fra den anden tabel.
Hvis du for eksempel valgte en kolonne fra den fรธrste tabel (colA) og en anden kolonne fra den anden tabel (colB). ColA indeholder to vรฆrdier (1,2), og colB indeholder ogsรฅ to vรฆrdier (3,4).
Sรฅ vil resultatet af CROSS JOIN vรฆre fire rรฆkker:
- To rรฆkker ved at kombinere den fรธrste vรฆrdi fra colA, som er 1, med de to vรฆrdier af colB (3,4), som vil vรฆre (1,3), (1,4).
- Ligeledes to rรฆkker ved at kombinere den anden vรฆrdi fra colA, som er 2, med de to vรฆrdier af colB (3,4), som er (2,3), (2,4).
Eksempel
I den fรธlgende forespรธrgsel vil vi prรธve CROSS JOIN mellem tabellerne for studerende og afdelinger:
SELECT Students.StudentName, Departments.DepartmentName FROM Students CROSS JOIN Departments;
Forklaring
- I SQLite vรฆlg fra flere tabeller, vi valgte blot to kolonner "studentnavn" fra elevtabellen og "afdelingsnavn" fra afdelingstabellen.
- For krydsjoiningen angav vi ingen join-betingelse, kun de to tabeller kombineret med CROSS JOIN i midten af โโdem.
Produktion
Som du kan se, er resultatet 40 rรฆkker; 10 vรฆrdier fra elevtabellen matchede mod de 4 afdelinger fra afdelingstabellen. Som fรธlgende:
- Fire vรฆrdier for de fire afdelinger fra afdelingstabellen matchede med den fรธrste elev Michel.
- Fire vรฆrdier for de fire afdelinger fra afdelingstabellen matchede den anden elev John.
- Fire vรฆrdier for de fire afdelinger fra afdelingstabellen matchede den tredje elev Jack ... og sรฅ videre.











