Spojovacie tabuľky SQLite: Vnútorné, Prirodzené, Ľavé, Vonkajšie, Kríž (Príklady)

Obsah:

Anonim

SQLite podporuje rôzne typy SQL spojení, ako napríklad INNER JOIN, LEFT OUTER JOIN a CROSS JOIN. Každý typ JOIN sa používa pre inú situáciu, ako uvidíme v tomto návode.

V tomto návode sa naučíte

  • Úvod do klauzuly SQLite JOIN
  • VNÚTORNÉ PRIPOJENIE
  • PRIPOJTE SA ... K POUŽÍVANIU
  • PRÍRODNÉ SPOJENIE
  • ĽAVÝ VONKAJŠÍ PRÍSTUP
  • CROSS JOIN

Úvod do klauzuly SQLite JOIN

Ak pracujete na databáze s viacerými tabuľkami, často musíte získať údaje z týchto viacerých tabuliek.

S klauzulou JOIN môžete spojiť dve alebo viac tabuliek alebo poddotazov ich spojením. Môžete tiež definovať, podľa ktorého stĺpca musíte tabuľky prepojiť a za akých podmienok.

Akákoľvek klauzula JOIN musí mať nasledujúcu syntax:

Každá doložka o spojení obsahuje:

  • Tabuľka alebo poddotaz, ktorým je ľavá tabuľka; tabuľka alebo poddotaz pred klauzulou join (vľavo od nej).
  • Operátor JOIN - zadajte typ spojenia (buď INNER JOIN, LEFT OUTER JOIN alebo CROSS JOIN).
  • JOIN-constraint - po zadaní tabuliek alebo poddotazov na pripojenie je potrebné určiť obmedzenie spojenia, čo bude podmienka, pre ktorú sa v závislosti od typu spojenia vyberú zodpovedajúce riadky, ktoré sa zhodujú s touto podmienkou.

Všimnite si, že pre všetky nasledujúce príklady musíte spustiť sqlite3.exe a otvoriť plynulé pripojenie k ukážkovej databáze:

Krok 1) V tomto kroku

  1. Otvorte Môj počítač a prejdite do nasledujúceho adresára " C: \ sqlite " a
  2. Potom otvorte " sqlite3.exe ":

Krok 2) Otvorte databázu „ TutorialsSampleDB.db “ pomocou nasledujúceho príkazu:

Teraz ste pripravení spustiť akýkoľvek typ dotazu v databáze.

SQLite INNER JOIN

INNER JOIN vráti iba riadky, ktoré sa zhodujú s podmienkou spojenia a vylúčia všetky ostatné riadky, ktoré sa nezhodujú s podmienkou spojenia.

Príklad

V nasledujúcom príklade spojíme dve tabuľky „ Študenti “ a „ Oddelenia “ s DepartmentId, aby sme získali názov oddelenia pre každého študenta, a to nasledovne:

VYBERTEStudents.StudentName,Departments.DepartmentNameOD študentovVNÚTORNÉ PRIPOJENIE Departments ON Students.DepartmentId = Departments.DepartmentId;

Vysvetlenie kódu:

INNER JOIN funguje nasledovne:

  • V klauzule Select môžete vybrať stĺpce, ktoré chcete vybrať, z dvoch odkazovaných tabuliek.
  • Klauzula INNER JOIN sa píše za prvou tabuľkou, na ktorú sa odkazuje klauzulou „Od“.
  • Potom je podmienka spojenia zadaná pomocou ZAPNUTÉ.
  • Pre odkazované tabuľky je možné určiť aliasy.
  • VNÚTORNÉ slovo je voliteľné, stačí napísať JOIN.

Výkon:

  • INNER JOIN vytvára záznamy od oboch - študentov a tabuliek katedry, ktoré zodpovedajú podmienke, ktorá je „ S tudents.DepartmentId = Departments.DepartmentId “. Nepriradené riadky budú ignorované a nebudú zahrnuté do výsledku.
  • Preto bolo z tohto dotazu vrátených iba 8 študentov z 10 študentov s oddeleniami IT, matematiky a fyziky. Zatiaľ čo študenti „Jena“ a „George“ neboli zahrnutí, pretože majú neplatné ID oddelenia, ktoré sa nezhoduje so stĺpcom departmentId z tabuľky katedier. Ako nasledujúce:

SQLite JOIN ... USING

VNÚTORNÉ PRIPOJENIE je možné zapísať pomocou klauzuly „USING“, aby sa zabránilo nadbytočnosti, takže namiesto písania „ON Students.DepartmentId = Departments.DepartmentId“ stačí napísať „USING (DepartmentID)“.

„SPOJIŤ SA… POUŽÍVAŤ“ môžete použiť vždy, keď sú stĺpce, ktoré budete porovnávať v podmienkach spojenia, rovnaké. V takýchto prípadoch ich nie je potrebné opakovať pomocou podmienky on a stačí uviesť názvy stĺpcov a SQLite to zistí.

Rozdiel medzi VNÚTORNÝM SPOJENÍM A SPOJENÍM ... POUŽÍVANÍM:

Pomocou „PRIPOJTE SA

… POUŽITIE „nepíšete podmienku spojenia, iba napíšete stĺpec spojenia, ktorý je spoločný pre obidve spojené tabuľky, namiesto písania tabuľky1„ VNÚTORNÉ SPOJENIE table2 NA table1.cola = table2.cola „píšeme to ako“ tabuľka1 PRIPOJIŤ sa tabuľka2 POUŽÍVANIE (cola) ".

Príklad

V nasledujúcom príklade spojíme dve tabuľky „ Študenti “ a „ Oddelenia “ s DepartmentId, aby sme získali názov oddelenia pre každého študenta, a to nasledovne:

VYBERTEStudents.StudentName,Departments.DepartmentNameOD študentovINNER JOIN ODDELENIA POUŽÍVANÉ (DepartmentId);

Vysvetlenie

  • Na rozdiel od predchádzajúceho príkladu sme nenapísali „ ON Students.DepartmentId = Departments.DepartmentId “. Práve sme napísali „ USING (DepartmentId) “.
  • SQLite odvodzuje podmienku spojenia automaticky a porovnáva DepartmentId z oboch tabuliek - Študenti a Oddelenia.
  • Túto syntax môžete použiť, kedykoľvek sú dva porovnávané stĺpce s rovnakým názvom.

Výkon

  • Získate tak rovnaký presný výsledok ako v predchádzajúcom príklade:

SQLite PRIRODZENÉ PRIPOJENIE

PRIRODZENÉ PRIPOJENIE je podobné PRIPOJENIU ... S POUŽITÍM, rozdiel je v tom, že automaticky testuje rovnosť medzi hodnotami každého stĺpca, ktorý existuje v oboch tabuľkách.

Rozdiel medzi INNER JOIN a NATURAL JOIN:

  • V INNER JOIN musíte špecifikovať podmienku spojenia, ktorú vnútorné spojenie použije na spojenie týchto dvoch tabuliek. Zatiaľ čo v prirodzenom spojení podmienku spojenia nepíšete. Iba napíšete mená týchto dvoch tabuliek bez akýchkoľvek podmienok. Prirodzené spojenie potom automaticky otestuje rovnosť medzi hodnotami pre každý stĺpec v oboch tabuľkách. Prirodzené spojenie odvodí podmienku spojenia automaticky.
  • V NATURAL JOIN sa všetky stĺpce z oboch tabuliek s rovnakým názvom porovnajú navzájom. Napríklad ak máme spoločné dve tabuľky s dvoma názvami stĺpcov (dva stĺpce majú v dvoch tabuľkách rovnaký názov), potom sa prirodzené spojenie spojí s týmito dvoma tabuľkami porovnaním hodnôt oboch stĺpcov, nielen z jedného stĺpca. stĺpec.

Príklad

VYBERTEStudents.StudentName,Departments.DepartmentNameOD študentovOddelenia Natural JOIN;

Vysvetlenie

  • Podmienku spojenia nemusíme písať s názvami stĺpcov (ako sme to robili v INNER JOIN). Nepotrebovali sme ani raz napísať názov stĺpca (ako sme to napísali v SPOJENÍ S POUŽITÍM).
  • Prirodzené spojenie prehľadá oba stĺpce z dvoch tabuliek. Zistí, že podmienka by mala pozostávať z porovnania hodnoty DepartmentId z oboch tabuliek Studenti a Departments.

Výkon

  • Prírodné PRIPOJENIE vám dá rovnaký presný výstup ako výstup, ktorý sme dostali z príkladov VNÚTORNÉHO PRIPOJENIA a SPOJENIA S POUŽITÍM. Pretože v našom príklade sú všetky tri dotazy rovnocenné. Ale v niektorých prípadoch sa výstup bude líšiť od vnútorného spojenia potom od prirodzeného spojenia. Napríklad ak existuje viac tabuliek s rovnakými názvami, potom sa prirodzené spojenie porovná so všetkými stĺpcami navzájom. Vnútorné spojenie sa však bude zhodovať iba so stĺpcami v stave spojenia (ďalšie podrobnosti v ďalšej časti; rozdiel medzi vnútorným spojením a prirodzeným spojením).

SQLite LEFT OUTER JOIN

Štandard SQL definuje tri typy VONKAJŠÍCH SPOJENÍ: LEVÝ, PRAVÝ a CELÝ, ale SQLite podporuje iba LEVÝ SPOJ.

V LEFT OUTER JOIN budú do výsledku dotazu zahrnuté všetky hodnoty stĺpcov, ktoré vyberiete z ľavej tabuľky, takže bez ohľadu na to, či sa hodnota zhoduje s podmienkou spojenia alebo nie, bude zahrnutá do výsledku.

Ak má teda ľavá tabuľka riadky „n“, výsledky dotazu budú mať riadky „n“. Pokiaľ však pre hodnoty stĺpcov pochádzajúcich z pravej tabuľky existuje akákoľvek hodnota, ktorá sa nezhoduje s podmienkou spojenia, bude obsahovať hodnotu „null“.

Získate teda počet riadkov ekvivalentný počtu riadkov v ľavom spojení. Takže získate zodpovedajúce riadky z oboch tabuliek (napríklad výsledky INNER JOIN) a nezhodné riadky z ľavej tabuľky.

Príklad

V nasledujúcom príklade skúsime funkciu „LEFT JOIN“ spojiť s dvoma tabuľkami „Students“ a „Departments“:

VYBERTEStudents.StudentName,Departments.DepartmentNameOD študentov - toto je ľavá tabuľkaLEFT JOIN Oddelenia sú zapnuté Students.DepartmentId = Departments.DepartmentId;

Vysvetlenie

  • Syntax LEFT JOIN je rovnaká ako INNER JOIN; medzi dve tabuľky napíšete LEFT JOIN a potom za klauzulou ON príde podmienka join.
  • Prvá tabuľka po klauzule od je ľavá tabuľka. Zatiaľ čo druhá tabuľka uvedená po ľavom spojení je pravá tabuľka.
  • Klauzula OUTER je voliteľná; LEFT OUTER JOIN je to isté ako LEFT JOIN.

Výkon

  • Ako vidíte, sú zahrnuté všetky riadky z tabuľky študentov, čo je celkom 10 študentov. Aj keď štvrtý a posledný študent, Jena a George departmentIds v tabuľke oddelení neexistujú, sú tiež zahrnuté.
  • A v týchto prípadoch bude hodnota departmentName pre Jenu aj Georgea „null“, pretože tabuľka departementov nemá departmentName, ktoré sa zhodujú s ich hodnotou departmentId.

Dajme predchádzajúci dotaz pomocou ľavej strany a pripojme hlbšie vysvetlenie pomocou Vanových diagramov:

LEFT JOIN poskytne všetkým študentom mená z tabuľky študentov, aj keď má študent ID oddelenia, ktoré v tabuľke oddelení neexistuje. Dotaz teda nebude obsahovať iba zodpovedajúce riadky ako VNÚTORNÉ PRIPOJENIE, ale poskytne vám ďalšiu časť, ktorá má neprekonateľné riadky z ľavej tabuľky, čo je tabuľka študentov.

Upozorňujeme, že akékoľvek meno študenta, ktoré nemá zodpovedajúce oddelenie, bude mať pre názov oddelenia hodnotu „null“, pretože preň neexistuje zodpovedajúca hodnota a tieto hodnoty sú hodnotami v nezhodných riadkoch.

SQLite CROSS JOIN

CROSS JOIN dáva karteziánsky súčin pre vybrané stĺpce dvoch spojených tabuliek porovnaním všetkých hodnôt z prvej tabuľky so všetkými hodnotami z druhej tabuľky.

Takže pre každú hodnotu v prvej tabuľke získate 'n' zhody z druhej tabuľky, kde n je počet riadkov druhej tabuľky.

Na rozdiel od INNER JOIN a LEFT OUTER JOIN nemusíte pri CROSS JOIN špecifikovať podmienku spojenia, pretože SQLite ju pre CROSS JOIN nepotrebuje.

Výsledkom SQLite bude logické výsledky nastavené kombináciou všetkých hodnôt z prvej tabuľky so všetkými hodnotami z druhej tabuľky.

Napríklad ak ste vybrali stĺpec z prvej tabuľky (colA) a ďalší stĺpec z druhej tabuľky (colB). ColA obsahuje dve hodnoty (1,2) a colB tiež obsahuje dve hodnoty (3,4).

Výsledkom CROSS JOIN potom budú štyri riadky:

  • Dva riadky kombináciou prvej hodnoty z colA, ktorá je 1, s dvoma hodnotami colB (3,4), ktoré budú (1,3), (1,4).
  • Rovnako tak dva riadky kombináciou druhej hodnoty z colA, ktorá je 2, s dvoma hodnotami colB (3,4), ktoré sú (2,3), (2,4).

Príklad

V nasledujúcom dotaze vyskúšame CROSS JOIN medzi tabuľkami Študenti a Katedry:

VYBERTEStudents.StudentName,Departments.DepartmentNameOD študentovÚtvary CROSS JOIN;

Vysvetlenie

  • V klauzule select sme práve vybrali dva stĺpce „studentname“ z tabuľky študentov a „departmentName“ z tabuľky katedier.
  • Pre krížové spojenie sme nezadali nijakú podmienku spojenia, iba dve tabuľky kombinované s CROSS JOIN v ich strede.

Výkon:

Ako vidíte, výsledkom je 40 riadkov; 10 hodnôt z tabuľky študentov sa zhodovalo s 4 oddeleniami z tabuľky oddelení. Ako nasledujúce:

  • Štyri hodnoty pre štyri oddelenia z tabuľky oddelení sa zhodovali s prvým študentom Michelom.
  • Štyri hodnoty pre štyri oddelenia z tabuľky oddelení sa zhodovali s druhým študentom Johnom.
  • Štyri hodnoty pre štyri oddelenia z tabuľky oddelení sa zhodovali s tretím študentom Jackom.

    … a tak ďalej.

Zhrnutie

Pomocou príkazov SQLite JOINs môžete prepojiť jednu alebo viac tabuliek alebo poddotazov a vybrať tak stĺpce z oboch tabuliek alebo poddotazov.