SQLite Bli med: Naturlig venstre ytre, indre, kryss med bord Eksempel
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
- Åpne Min datamaskin og naviger til følgende katalog "C:\sqlite"Og
- Åpne 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 følgende eksempel vil vi slå sammen de to tabellene "Studenter"Og"avdelinger” 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 begge – studentene og instituttets tabeller som samsvarer med betingelsen som er “Students.DepartmentId = Departments.DepartmentId «. De umatchede radene vil bli ignorert og ikke inkludert i resultatet.
- Det er derfor bare 8 studenter fra 10 studenter ble returnert fra denne spørringen med IT-, matematikk- og fysikkavdelinger. Mens studentene "Jena" og "George" ikke ble inkludert, fordi de har en null avdelings-ID, som ikke samsvarer med avdelings-ID-kolonnen fra avdelingstabellen. Som følgende:
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 .. BRUKER:
Med “JOIN … USING” skriver du ikke en sammenføyningsbetingelse, du skriver bare sammenføyningskolonnen som er felles mellom de to sammenføyde tabellene, i stedet for å skrive tabell1 “INNER JOIN-tabell2 PÅ tabell1.cola = tabell2.cola” skriver vi det som "tabell1 BLI MED TIL tabell2 BRUKER(cola)".
Eksempel
I følgende eksempel vil vi slå sammen de to tabellene "Studenter"Og"avdelinger” 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 forrige eksempel skrev vi ikke "ON Students.DepartmentId = Departments.DepartmentId«. Vi skrev nettopp "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 å slå sammen de to tabellene. Mens i den naturlige sammenføyningen, skriver du ikke en sammenføyningsbetingelse. Du skriver bare de to tabellenes navn uten noen betingelse. Da vil den naturlige sammenføyningen automatisk teste for likhet mellom verdiene for hver kolonne som finnes i begge tabellene. Naturlig sammenføyning utleder automatisk sammenføyningsbetingelsen.
- 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 sammenføyningsbetingelse med kolonnenavn (som vi gjorde i INNER JOIN). Vi trengte ikke engang å skrive kolonnenavnet en gang (som 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 den samme nøyaktige utgangen som utgangen vi fikk fra INNER JOIN og JOIN USED-eksemplene. For i vårt eksempel er alle tre spørringene likeverdige. Men i noen tilfeller vil utgangen være forskjellig fra indre sammenføyning enn i en naturlig sammenføyning. For eksempel, hvis det er flere tabeller med samme navn, vil den naturlige sammenføyningen matche alle kolonnene mot hverandre. Imidlertid vil den indre sammenføyningen bare samsvare med kolonnene i sammenføyningsbetingelsen (mer detaljer i neste avsnitt; forskjellen mellom den indre sammenføyningen og naturlig sammenføyning).
SQLite VENSTRE YTRE MEDLEM
SQL-standarden definerer tre typer OUTTER JOINs: LEFT, RIGHT og FULL men SQLite støtter kun den naturlige VENSTRE YTRE JOIN.
I LEFT OUTER JOIN vil alle verdiene til kolonnene du velger fra den venstre tabellen inkluderes i resultatet av spørring, så uansett om verdien samsvarer med sammenføyningsbetingelsen eller ikke, vil den inkluderes i resultatet.
Så hvis den venstre tabellen har 'n' rader, vil resultatene av spørringen ha 'n' rader. Men for verdiene til kolonnene som kommer fra den høyre tabellen, hvis en verdi som ikke samsvarer med sammenføyningsbetingelsen, vil den 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 elevtabellen inkludert som er totalt 10 elever. Selv om den fjerde og siste studenten, Jena, og George avdelings-IDer 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 avdelingstabellen ikke har et departmentName som samsvarer med deres departmentId-verdi.
La oss gi den forrige spørringen ved å bruke den venstre sammenføyningen en dypere forklaring ved å bruke Van-diagrammer:
LEFT JOIN vil gi alle studentene navn fra elevtabellen 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 umatchende radene fra den venstre tabellen som er elevtabellen.
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, med CROSS JOIN, trenger du ikke spesifisere en sammenføyningsbetingelse, fordi SQLite trenger det ikke for CROSS JOIN.
De SQLite vil resultere i logiske resultater satt ved å kombinere alle verdiene fra den første tabellen med alle verdiene fra den andre tabellen.
For eksempel, hvis du valgte en kolonne fra den første tabellen (colA) og en annen kolonne fra den andre tabellen (colB). ColA inneholder to verdier (1,2) og colB 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 krysssammenføyningen 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.
Oppsummering
Ved hjelp av SQLite JOIN-spørring, kan du koble en eller flere tabeller eller underspørringer sammen for å velge kolonner fra begge tabellene eller underspørringene.