SQLite-sammenføjningstabeller: Indre, naturlige, venstre ydre, kryds (eksempler)

Indholdsfortegnelse:

Anonim

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 vejledning.

I denne vejledning lærer du-

  • Introduktion til SQLite JOIN-klausul
  • INDRE MEDLEM
  • BLIV MED ... BRUGER
  • NATURLIG SAMLING
  • VENSTRE YDRE MEDLEM
  • CROSS JOIN

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 linke to eller flere tabeller eller underforespørgsler ved at slutte dig til dem. Du kan også definere, hvilken kolonne du skal linke tabellerne, og efter hvilke betingelser.

Enhver JOIN-klausul skal have følgende syntaks:

Hver deltagelsesklausul indeholder:

  • En tabel eller en underforespørgsel, som er den venstre tabel; tabellen eller underforespørgslen før sammenføjningsklausulen (til venstre for den).
  • JOIN-operator - 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 sammenføjes, skal du angive en sammenføjningsbegrænsning, som vil være en betingelse, hvor de matchende rækker, der matcher den betingelse, vælges afhængigt af sammenføjningstypen.

Bemærk, at for alle de følgende eksempler skal du køre sqlite3.exe og åbne en forbindelse til eksempeldatabasen som flydende:

Trin 1) I dette trin,

  1. Åbn Denne computer, og naviger til følgende bibliotek " C: \ sqlite " og
  2. Åbn derefter " sqlite3.exe ":

Trin 2) Åbn databasen " TutorialsSampleDB.db " med følgende kommando:

Nu er du klar til at køre alle typer forespørgsler i databasen.

SQLite INNER JOIN

INNER JOIN returnerer kun de rækker, der matcher tilslutningsbetingelsen og fjerner alle andre rækker, der ikke matcher tilslutningsbetingelsen.

Eksempel

I det følgende eksempel forbinder vi de to tabeller " Studerende " og " Afdelinger " med DepartmentId for at få afdelingens navn for hver studerende som følger:

VÆLGStuderende.Studentnavn,Afdelinger. AfdelingsnavnFRA studerendeINNER JOIN Afdelinger PÅ Students.DepartmentId = Departments.DepartmentId;

Forklaring af kode:

INNER JOIN fungerer som følger:

  • I Select-klausulen 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 henvises til med "Fra" -klausulen.
  • Derefter specificeres tilslutningsbetingelsen med ON.
  • Aliaser kan specificeres for henviste tabeller.
  • INNER-ordet er valgfrit, du kan bare skrive JOIN.

Produktion:

  • INNER JOIN producerer optegnelserne fra begge - eleverne og instituttets tabeller, der matcher den betingelse, der er " S tudents.DepartmentId = Departments.DepartmentId ". De ikke-matchede rækker ignoreres og inkluderes ikke i resultatet.
  • Derfor blev kun 8 studerende fra 10 studerende returneret fra denne forespørgsel med it-, matematik- og fysikafdelinger. Mens de studerende "Jena" og "George" ikke var inkluderet, fordi de har et null-afdelings-id, som ikke svarer til afdelingId-kolonnen fra afdelingstabellen. Som følger:

SQLite JOIN ... BRUGER

INNER JOIN kan skrives ved hjælp af "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 tilstanden join, har samme navn. I sådanne tilfælde er der ingen grund til at gentage dem ved hjælp af den betingelse og bare angive kolonnenavnene, og SQLite vil opdage det.

Forskellen mellem INNER JOIN og JOIN ... BRUGER:

Med "JOIN

... BRUGER "du skriver ikke en sammenføjningsbetingelse, du skriver bare sammenføjningskolonnen, som er fælles mellem de to sammenføjede tabeller, i stedet for at skrive tabel1" INNER JOIN tabel2 PÅ tabel1.cola = tabel2.cola "vi skriver det som" tabel1 JOIN tabel2 BRUGER (cola) ".

Eksempel

I det følgende eksempel forbinder vi de to tabeller " Studerende " og " Afdelinger " med DepartmentId for at få afdelingens navn for hver studerende som følger:

VÆLGStuderende.Studentnavn,Afdelinger. AfdelingsnavnFRA studerendeINNER JOIN Afdelinger, der BRUGER (DepartmentId);

Forklaring

  • I modsætning til det foregående eksempel skrev vi ikke " ON Students.DepartmentId = Departments.DepartmentId ". Vi skrev lige " USING (DepartmentId) ".
  • SQLite udleder automatisk tilslutningsbetingelsen og sammenligner DepartmentId fra begge tabeller - studerende og afdelinger.
  • Du kan bruge denne syntaks, når de to kolonner, du sammenligner, har samme navn.

Produktion

  • Dette giver dig det samme nøjagtige resultat som det foregående eksempel:

SQLite NATURAL JOIN

En NATURLIG JOIN ligner en JOIN ... BRUGER, 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 NATURLIG JOIN:

  • I INNER JOIN skal du angive en sammenføjningsbetingelse, som den indre sammenføjning bruger til at sammenføje de to tabeller. Mens du i den naturlige sammenføjning skriver du ikke en tilslutningsbetingelse. Du skriver bare de to tabeller 'navne uden nogen betingelse. Derefter vil den naturlige sammenføjning automatisk teste for lighed mellem værdierne for hver kolonne, der findes i begge tabeller. Naturlig sammenkædning udleder automatisk tilslutningstilstanden.
  • I NATURAL JOIN matches alle kolonnerne fra begge tabeller med samme navn 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), vil den naturlige sammenføjning slutte sig til de to tabeller ved at sammenligne værdierne for begge kolonner og ikke kun fra en kolonne.

Eksempel

VÆLGStuderende.Studentnavn,Afdelinger. AfdelingsnavnFRA studerendeNatural JOIN afdelinger;

Forklaring

  • Vi behøver ikke at skrive en tilslutningsbetingelse med kolonnenavne (som vi gjorde i INNER JOIN). Vi behøvede ikke engang at skrive kolonnenavnet en gang (som vi gjorde i BLIV MED BRUG).
  • Den naturlige sammenføjning scanner begge kolonnerne fra de to tabeller. Det registrerer, at betingelsen skal være sammensat af at sammenligne DepartmentId fra begge de to tabeller Studerende og afdelinger.

Produktion

  • Natural JOIN giver dig den samme nøjagtige output som den output, vi fik fra INNER JOIN og JOIN USING eksemplerne. Fordi i vores eksempel er alle tre forespørgsler ækvivalente. Men i nogle tilfælde vil output være forskelligt fra indre sammenføjning og derefter i en naturlig sammenføjning. For eksempel, hvis der er flere tabeller med de samme navne, vil den naturlige sammenføjning matche alle kolonnerne mod hinanden. Imidlertid vil den indre sammenføjning kun matche kolonnerne i tilstanden for sammenføjning (flere detaljer om det næste afsnit; forskellen mellem den indre sammenføjning og den naturlige sammenføjning).

SQLite VENSTRE OUTER JOIN

SQL-standarden definerer tre typer OUTER JOINs: VENSTRE, HØJRE og FULD, men SQLite understøtter kun VENSTRE OUTER JOIN.

I VENSTRE OUTER JOIN vil alle værdierne for de kolonner, du vælger i den venstre tabel, blive inkluderet i resultatet af forespørgslen, så uanset værdien matcher tilstanden for sammenføjning 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. For værdierne for kolonnerne, der kommer fra den højre tabel, vil en værdi, der ikke matcher sammenføjningsbetingelsen, indeholde en "null" -værdi.

Så du får et antal rækker svarende til antallet af rækker i venstre sammenføjning. Så du får de matchende rækker fra begge tabeller (som INNER JOIN-resultaterne) plus de ikke-matchende rækker fra venstre tabel.

Eksempel

I det følgende eksempel prøver vi "VENSTRE JOIN" for at slutte sig til de to tabeller "Studerende" og "Afdelinger":

VÆLGStuderende.Studentnavn,Afdelinger. AfdelingsnavnFRA studerende - dette er venstre tabelVENSTRE JOIN Afdelinger PÅ Students.DepartmentId = Departments.DepartmentId;

Forklaring

  • LEFT JOIN syntaks er den samme som INNER JOIN; du skriver VENSTRE JOIN mellem de to tabeller, og derefter kommer betingelsesbetingelsen efter ON-klausulen.
  • Den første tabel efter fra-klausulen er den venstre tabel. Mens den anden tabel, der er angivet efter venstre sammenføjning, er den rigtige tabel.
  • OUTER-klausulen er valgfri; VENSTRE OUTER JOIN er den samme som LEFT JOIN.

Produktion

  • Som du kan se er alle rækker fra studerende inkluderet, hvilket er 10 studerende i alt. Selvom den fjerde og den sidste studerende, Jena og George afdelingIds ikke findes i afdelingstabellen, er de også inkluderet.
  • Og i disse tilfælde vil departmentName-værdien for både Jena og George være "null", fordi afdelingstabellen ikke har et departmentName, der matcher deres departmentId-værdi.

Lad os give den forrige forespørgsel ved hjælp af venstre slutning en dybere forklaring ved hjælp af Van-diagrammer:

VENSTRE JOIN giver alle studerendes navne fra studerende, selvom eleven har et institut-id, der ikke findes i afdelingstabellen. Så forespørgslen giver dig ikke kun de matchende rækker som INNER JOIN, men giver dig den ekstra del, der har de ikke-matchende rækker fra den venstre tabel, som er studenttabellen.

Bemærk, at ethvert elevnavn, der ikke har nogen matchende afdeling, har en "null" -værdi for afdelingens navn, fordi der ikke er nogen matchende værdi for det, og disse værdier er værdierne i de ikke-matchende rækker.

SQLite CROSS JOIN

EN CROSS JOIN giver det cartesianske produkt til 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 får du 'n' matches fra den anden tabel, hvor n er antallet af anden tabelrækker.

I modsætning til INNER JOIN og LEFT OUTER JOIN, med CROSS JOIN, behøver du ikke angive en join-betingelse, fordi SQLite ikke har brug for det til CROSS JOIN.

SQLite resulterer i logiske resultater indstillet ved at kombinere alle værdier fra den første tabel med alle værdier fra den anden tabel.

Hvis du f.eks. 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).

Derefter bliver resultatet af CROSS JOIN fire rækker:

  • To rækker ved at kombinere den første værdi fra colA, som er 1, med de to værdier for 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 for colB (3,4), som er (2,3), (2,4).

Eksempel

I den følgende forespørgsel vil vi prøve CROSS JOIN mellem tabellerne Studerende og afdelinger:

VÆLGStuderende.Studentnavn,Afdelinger. AfdelingsnavnFRA studerendeCROSS JOIN Afdelinger;

Forklaring

  • I valgklausulen valgte vi netop to kolonner "studentnavn" fra tabellen studerende og "departmentName" fra afdelingstabellen.
  • For krydsforbindelsen specificerede vi ingen sammenføjningsbetingelser, bare 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 de 4 afdelinger fra afdelingstabellen. Som følger:

  • 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 med den anden studerende John.
  • Fire værdier for de fire afdelinger fra afdelingstabellen matchede med den tredje studerende Jack.

    … og så videre.

Resumé

Ved hjælp af SQLite JOINs kan du linke en eller flere tabeller eller underforespørgsler sammen for at vælge kolonner fra begge tabeller eller underforespørgsler.