Spojovací tabulky SQLite: Vnitřní, Přirozené, Vlevo, Kříž (Příklady)

Obsah:

Anonim

SQLite podporuje různé typy SQL spojení, jako je INNER JOIN, LEFT OUTER JOIN a CROSS JOIN. Každý typ spojení se používá pro jinou situaci, jak uvidíme v tomto kurzu.

V tomto výukovém programu se naučíte

  • Úvod do klauzule SQLite JOIN
  • VNITŘNÍ SPOJENÍ
  • PŘIPOJTE SE ... K POUŽITÍ
  • PŘÍRODNÍ PŘIPOJENÍ
  • VLEVO VENKOVNÍ PŘIPOJENÍ
  • CROSS JOIN

Úvod do klauzule SQLite JOIN

Když pracujete na databázi s více tabulkami, musíte často získat data z těchto více tabulek.

S klauzulí JOIN můžete propojit dvě nebo více tabulek nebo poddotazů jejich spojením. Rovněž můžete definovat, podle kterého sloupce je třeba propojit tabulky a podle jakých podmínek.

Jakákoli klauzule JOIN musí mít následující syntaxi:

Každá klauzule o spojení obsahuje:

  • Tabulka nebo poddotaz, což je levá tabulka; tabulka nebo poddotaz před klauzulí join (vlevo od ní).
  • Operátor JOIN - zadejte typ spojení (INNER JOIN, LEFT OUTER JOIN nebo CROSS JOIN).
  • JOIN-constraint - poté, co jste určili tabulky nebo poddotazy, ke kterým se chcete připojit, musíte určit omezení spojení, což bude podmínka, na které budou vybrány odpovídající řádky, které odpovídají této podmínce, v závislosti na typu spojení.

Všimněte si, že u všech následujících příkladů musíte spustit soubor sqlite3.exe a otevřít připojení k ukázkové databázi průběžně:

Krok 1) V tomto kroku

  1. Otevřete Tento počítač a přejděte do následujícího adresáře " C: \ sqlite " a
  2. Poté otevřete soubor „ sqlite3.exe “:

Krok 2) Otevřete databázi „ TutorialsSampleDB.db “ pomocí následujícího příkazu:

Nyní jste připraveni spustit jakýkoli typ dotazu v databázi.

SQLite INNER JOIN

INNER JOIN vrací pouze řádky, které odpovídají podmínce spojení a vylučují všechny ostatní řádky, které neodpovídají podmínce spojení.

Příklad

V následujícím příkladu spojíme dvě tabulky „ Studenti “ a „ Oddělení “ s DepartmentId, abychom získali název oddělení pro každého studenta, a to následovně:

VYBRATStudents.StudentName,Departments.DepartmentNameOD studentůVNITŘNÍ PŘIPOJENÍ Departments ON Students.DepartmentId = Departments.DepartmentId;

Vysvětlení kódu:

INNER JOIN funguje následovně:

  • V klauzuli Select můžete vybrat sloupce, které chcete vybrat ze dvou odkazovaných tabulek.
  • Klauzule INNER JOIN je zapsána za první tabulkou, na kterou se odkazuje klauzule "Od".
  • Potom je podmínka spojení zadána pomocí ZAPNUTO.
  • Aliasy lze zadat pro odkazované tabulky.
  • VNITŘNÍ slovo je volitelné, stačí napsat JOIN.

Výstup:

  • INNER JOIN vytváří záznamy z obou - studentů a tabulek katedry, které odpovídají podmínce, která je „ S tudents.DepartmentId = Departments.DepartmentId “. Nepřiřazené řádky budou ignorovány a nebudou zahrnuty do výsledku.
  • Proto bylo z tohoto dotazu s odděleními IT, matematiky a fyziky vráceno pouze 8 studentů z 10 studentů. Zatímco studenti „Jena“ a „George“ nebyli zahrnuti, protože mají nulové ID oddělení, které neodpovídá sloupci departmentId z tabulky oddělení. Následovně:

SQLite JOIN ... USING

INNER JOIN lze zapsat pomocí klauzule "USING", aby se zabránilo nadbytečnosti, takže místo psaní "ON Students.DepartmentId = Departments.DepartmentId" stačí napsat "USING (DepartmentID)".

Možnost „PŘIPOJIT SE… POUŽÍT“ můžete použít, kdykoli mají sloupce, které budete porovnávat v podmínkách spojení, stejný název. V takových případech není nutné je opakovat pomocí podmínky on a stačí uvést názvy sloupců a SQLite to zjistí.

Rozdíl mezi VNITŘNÍM PŘIPOJENÍM A PŘIPOJENÍM ... POUŽITÍ:

S „PŘIPOJTE se

… POUŽITÍ "nepíšete podmínku spojení, pouze napíšete sloupec spojení, který je společný mezi dvěma spojenými tabulkami, namísto psaní tabulky1" VNITŘNÍ PŘIPOJENÍ tabulka2 ON tabulka1.cola = tabulka2.cola "píšeme to jako" tabulka1 PŘIPOJIT se tabulka2 POUŽÍVÁNÍ (cola) ".

Příklad

V následujícím příkladu spojíme dvě tabulky „ Studenti “ a „ Oddělení “ s DepartmentId, abychom získali název oddělení pro každého studenta, a to následovně:

VYBRATStudents.StudentName,Departments.DepartmentNameOD studentůINNER JOIN Oddělení POUŽÍVÁNÍ (DepartmentId);

Vysvětlení

  • Na rozdíl od předchozího příkladu jsme nenapsali „ ON Students.DepartmentId = Departments.DepartmentId “. Právě jsme napsali „ USING (DepartmentId) “.
  • SQLite odvozuje podmínku spojení automaticky a porovnává DepartmentId z obou tabulek - Studenti a Oddělení.
  • Tuto syntaxi můžete použít, kdykoli jsou dva porovnávané sloupce se stejným názvem.

Výstup

  • Získáte stejný přesný výsledek jako v předchozím příkladu:

SQLite PŘÍRODNÍ PŘIPOJENÍ

NATURAL JOIN je podobný JOIN… USING, rozdíl je v tom, že automaticky testuje rovnost mezi hodnotami každého sloupce, který existuje v obou tabulkách.

Rozdíl mezi INNER JOIN a NATURAL JOIN:

  • V INNER JOIN musíte specifikovat podmínku spojení, kterou vnitřní spojení používá ke spojení dvou tabulek. Zatímco v přirozeném spojení nepíšete podmínku spojení. Stačí napsat dvě tabulky bez jakýchkoli podmínek. Přirozené spojení pak automaticky otestuje rovnost mezi hodnotami pro každý sloupec v obou tabulkách. Přirozené spojení odvozuje podmínku spojení automaticky.
  • V NATURAL JOIN budou všechny sloupce z obou tabulek se stejným názvem porovnány navzájem. Například pokud máme dvě tabulky se dvěma názvy společných sloupců (dva sloupce se stejným názvem ve dvou tabulkách existují), pak se přirozené spojení připojí ke dvěma tabulkám porovnáním hodnot obou sloupců a ne pouze z jednoho sloupec.

Příklad

VYBRATStudents.StudentName,Departments.DepartmentNameOD studentůOddělení přirozeného spojení;

Vysvětlení

  • Nepotřebujeme psát podmínku spojení s názvy sloupců (jako jsme to udělali v INNER JOIN). Ani jsme nemuseli psát název sloupce jednou (jako jsme to udělali v JOIN USING).
  • Přirozené spojení prohledá oba sloupce ze dvou tabulek. Zjistí, že podmínka by měla být složena z porovnání DepartmentId z obou dvou tabulek Studenti a Oddělení.

Výstup

  • Natural JOIN vám dá stejný přesný výstup jako výstup, který jsme dostali z příkladů INNER JOIN a JOIN USING. Protože v našem příkladu jsou všechny tři dotazy rovnocenné. Ale v některých případech se výstup bude lišit od vnitřního spojení pak od přirozeného spojení. Například pokud existuje více tabulek se stejnými názvy, bude přirozené spojení odpovídat všem sloupcům proti sobě. Vnitřní spojení však bude odpovídat pouze sloupcům v podmínce spojení (další podrobnosti v další části; rozdíl mezi vnitřním spojením a přirozeným spojením).

SQLite LEFT OUTER JOIN

Standard SQL definuje tři typy VNĚJŠÍCH PŘIPOJENÍ: LEFT, RIGHT a FULL, ale SQLite podporuje pouze LEFT OUTER JOIN.

V LEFT OUTER JOIN budou do výsledku dotazu zahrnuty všechny hodnoty sloupců, které vyberete z levé tabulky, takže bez ohledu na to, zda hodnota odpovídá podmínce spojení, či nikoli, bude do výsledku zahrnuta.

Pokud má tedy levá tabulka řádky 'n', budou mít výsledky dotazu řádky 'n'. U hodnot sloupců pocházejících z pravé tabulky však bude hodnota „null“ obsahovat jakoukoli hodnotu, která neodpovídá podmínce spojení.

Získáte tedy počet řádků odpovídající počtu řádků v levém spojení. Takže získáte odpovídající řádky z obou tabulek (například výsledky INNER JOIN) a neshodné řádky z levé tabulky.

Příklad

V následujícím příkladu vyzkoušíme spojení „LEFT JOIN“ ke spojení dvou tabulek „Students“ a „Departments“:

VYBRATStudents.StudentName,Departments.DepartmentNameOD studentů - toto je levá tabulkaLEFT JOIN Departments ON Students.DepartmentId = Departments.DepartmentId;

Vysvětlení

  • Syntaxe LEFT JOIN je stejná jako INNER JOIN; zapíšete LEFT JOIN mezi oběma tabulkami a pak podmínka spojení přijde po klauzuli ON.
  • První tabulka po klauzuli from je levá tabulka. Zatímco druhá tabulka zadaná po levém spojení je pravá tabulka.
  • Klauzule OUTER je volitelná; LEFT OUTER JOIN je stejné jako LEFT OUTO JOIN.

Výstup

  • Jak vidíte, jsou zahrnuty všechny řádky z tabulky studentů, což je celkem 10 studentů. I když čtvrtý a poslední student, Jena a George departmentIds neexistují v tabulce Oddělení, jsou také zahrnuti.
  • A v těchto případech bude hodnota departmentName pro Jenu i George „null“, protože tabulka departementů nemá název departmentu, který odpovídá jejich hodnotě departmentId.

Pojďme dát předchozí dotaz pomocí levé spojit hlubší vysvětlení pomocí Van diagramy:

LEFT JOIN dá všem studentům jména z tabulky studentů, i když má student ID oddělení, které v tabulce oddělení neexistuje. Dotaz tedy neposkytne pouze odpovídající řádky jako VNITŘNÍ PŘIPOJENÍ, ale poskytne vám další část, která má nepřekonatelné řádky z levé tabulky, což je tabulka studentů.

Všimněte si, že jakékoli jméno studenta, které nemá odpovídající oddělení, bude mít pro název oddělení hodnotu „null“, protože pro něj neexistuje žádná odpovídající hodnota a tyto hodnoty jsou hodnoty v neshodných řádcích.

SQLite CROSS JOIN

CROSS JOIN dává kartézský součin pro vybrané sloupce dvou spojených tabulek porovnáním všech hodnot z první tabulky se všemi hodnotami z druhé tabulky.

Takže pro každou hodnotu v první tabulce získáte 'n' shody z druhé tabulky, kde n je počet řádků druhé tabulky.

Na rozdíl od INNER JOIN a LEFT OUTER JOIN, u CROSS JOIN nemusíte specifikovat podmínku spojení, protože SQLite ji pro CROSS JOIN nepotřebuje.

Výsledkem SQLite budou logické výsledky nastavené kombinací všech hodnot z první tabulky se všemi hodnotami z druhé tabulky.

Například pokud jste vybrali sloupec z první tabulky (colA) a další sloupec z druhé tabulky (colB). ColA obsahuje dvě hodnoty (1,2) a colB také obsahuje dvě hodnoty (3,4).

Výsledkem CROSS JOIN pak budou čtyři řádky:

  • Dva řádky kombinací první hodnoty z colA, která je 1, se dvěma hodnotami colB (3,4), které budou (1,3), (1,4).
  • Podobně dva řádky kombinací druhé hodnoty z colA, která je 2, se dvěma hodnotami colB (3,4), které jsou (2,3), (2,4).

Příklad

V následujícím dotazu vyzkoušíme CROSS JOIN mezi tabulkami Studenti a Oddělení:

VYBRATStudents.StudentName,Departments.DepartmentNameOD studentůCROSS JOIN Oddělení;

Vysvětlení

  • V klauzuli select jsme právě vybrali dva sloupce „studentname“ z tabulky studentů a „departmentName“ z tabulky oddělení.
  • U křížového spojení jsme nezadali žádnou podmínku spojení pouze u dvou tabulek kombinovaných s CROSS JOIN uprostřed.

Výstup:

Jak vidíte, výsledkem je 40 řádků; 10 hodnot z tabulky studentů se shodovalo se 4 odděleními z tabulky oddělení. Následovně:

  • Čtyři hodnoty pro čtyři oddělení z tabulky oddělení se shodovaly s prvním studentem Michelem.
  • Čtyři hodnoty pro čtyři oddělení z tabulky oddělení se shodovaly s druhým studentem Johnem.
  • Čtyři hodnoty pro čtyři oddělení z tabulky oddělení se shodovaly s třetím studentem Jackem.

    … a tak dále.

souhrn

Pomocí SQLite JOINs můžete propojit jednu nebo více tabulek nebo poddotazů a vybrat sloupce z obou tabulek nebo poddotazů.