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.

  • ๐Ÿ”— Tilmeldingsklausul: JOIN-klausulen forbinder to eller flere tabeller eller underforespรธrgsler i en delt kolonne, defineret med en ON- eller USING-betingelse.
  • ๐ŸŽฏ INDRE TILSLUTNING: INNER JOIN returnerer kun de rรฆkker, hvor join-betingelsen matcher i begge tabeller, og kasserer ikke-matchede rรฆkker.
  • ๐Ÿงฉ BRUG OG NATURLIG: JOIN USING navngiver รฉn delt kolonne, mens NATURAL JOIN automatisk matcher alle identisk navngivne kolonner.
  • โ†ฉ๏ธ VENSTRE YDRE SAMMENFร˜RING: LEFT OUTER JOIN beholder alle rรฆkker i venstre tabel og udfylder ikke-matchede kolonner i hรธjre tabel med NULL-vรฆrdier.
  • โœ–๏ธ KRYDSDELTAGELSE: CROSS JOIN returnerer det kartesiske produkt, der parrer hver rรฆkke i venstre tabel med hver rรฆkke i hรธjre tabel.
  • ๐Ÿค– AI Assistance: AI tekst-til-SQL-vรฆrktรธjer og GitHub Copilot genererer SQLite JOIN-forespรธrgsler fra prompter pรฅ almindeligt engelsk.

SQLite Bliv Medlem

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:

SQLite JOIN klausul 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โ€œ:

ร…bn sqlite3.exe fra sqlite-mappen

Trin 2) ร…bn databasen โ€œTutorialsSampleDB.dbโ€ med fรธlgende kommando:

ร…bn TutorialsSampleDB-databasen

Nu er du klar til at kรธre enhver form for forespรธrgsel pรฅ databasen.

SQLite INNER JOIN

SQLite INNER JOIN Venn-diagram

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.

SQLite Eksempel pรฅ INNER JOIN-resultat

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 INNER JOIN matchede rรฆkker

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 JOIN WITH USING eksempelresultat

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 Eksempel pรฅ NATURLIG JOIN-resultat

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.

SQLite Eksempel pรฅ resultat af LEFT OUTER JOIN

Lad os give den foregรฅende forespรธrgsel, der brugte venstre join, en dybere forklaring ved hjรฆlp af Venn-diagrammer:

SQLite VENSTRE YDRE SAMMENSLUTNING Venn-diagram

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.

SQLite Eksempel pรฅ CROSS JOIN-resultat

Ofte Stillede Spรธrgsmรฅl

SQLite tilfรธjede understรธttelse af RIGHT JOIN og FULL OUTER JOIN i version 3.39.0, udgivet i 2022. Pรฅ รฆldre builds emulerer du en RIGHT JOIN ved at bytte.ping tabellerne i en LEFT JOIN og en FULL OUTER JOIN ved at kombinere to LEFT JOINs med UNION.

En selvtilslutning forbinder en tabel med sig selv ved hjรฆlp af tabelaliasser, sรฅ รฉn kopi fungerer som den venstre tabel og en anden som den hรธjre. Det er nyttigt til at sammenligne rรฆkker i den samme tabel, f.eks. ved at matche medarbejdere med deres ledere.

Ja. Du kรฆder flere JOIN-klausuler sammen i en enkelt SELECT, hver med sin egen ON- eller USING-betingelse, for eksempel FROM A JOIN B ON โ€ฆ JOIN C ON โ€ฆ. SQLite forbinder tabellerne fra venstre mod hรธjre til รฉt kombineret resultatsรฆt.

At skrive JOIN alene er det samme som INNER JOIN i SQLiteBegge beholder kun de rรฆkker, der opfylder betingelsen ON eller USING, sรฅ ikke-matchede rรฆkker fjernes. Nรธgleordet INNER er valgfrit, hvilket gรธr JOIN og INNER JOIN udskiftelige.

Oprettelse af indeks pรฅ de kolonner, der bruges i join-betingelsen, lader SQLite match rรฆkker uden at scanne hele tabeller, hvilket fremskynder joinforbindelser pรฅ store datasรฆt. Indeksering af fremmednรธglekolonner og kรธrsel af ANALYZE for at opdatere statistik forbedrer yderligere joinforespรธrgslers ydeevne.

En INNER JOIN returnerer kun rรฆkker, der matcher i begge tabeller. En LEFT OUTER JOIN returnerer hver rรฆkke fra venstre tabel plus matchende rรฆkker i hรธjre tabel og fylder umatchede hรธjre kolonner med NULL. Sรฅ en LEFT JOIN fjerner aldrig rรฆkker i venstre tabel.

Ja. AI tekst-til-SQL-assistenter omdanner almindelige engelske anmodninger til SQLite INNER-, LEFT-, NATURAL- og CROSS JOIN-sรฆtninger. Angivelse af dine tabelnavne, kolonnenavne og relationer forbedrer nรธjagtigheden, og hver genereret join bรธr gennemgรฅs og testes, fรธr den kรธres pรฅ rigtige data.

GitHub Copilot foreslรฅr SQLite JOIN-forespรธrgsler indlejret i editorer som f.eks. VS Code, fuldfรธrer INNER JOIN, LEFT JOIN og ON eller USING klausuler. Den lรฆser nรฆrliggende skemaer og kommentarer, sรฅ dens forslag genbruger dine rigtige tabel- og kolonnenavne.

Opsummer dette indlรฆg med: