SQLite Spojení: Přirozená levá vnější, vnitřní, kříž s tabulkami Příklad
SQLite podporuje různé typy SQL Spojení, jako INNER JOIN, LEFT OUTER JOIN a CROSS JOIN. Každý typ JOIN se používá pro jinou situaci, jak uvidíme v tomto tutoriálu.
Úvod do SQLite Klauzule JOIN
Když pracujete na databázi s více tabulkami, často potřebujete získat data z těchto více tabulek.
Pomocí klauzule JOIN můžete propojit dvě nebo více tabulek nebo poddotazů jejich spojením. Můžete také definovat, podle kterého sloupce potřebujete propojit tabulky a podle jakých podmínek.
Každá klauzule JOIN musí mít následující syntaxi:

Každá spojovací klauzule obsahuje:
- Tabulka nebo poddotaz, což je levá tabulka; tabulku nebo poddotaz před klauzulí spojení (nalevo od ní).
- Operátor JOIN – zadejte typ spojení (buď INNER JOIN, LEFT OUTER JOIN nebo CROSS JOIN).
- Omezení JOIN – poté, co jste zadali tabulky nebo poddotazy, které se mají spojit, musíte zadat omezení spojení, což bude podmínka, na jejímž základě budou vybrány odpovídající řádky odpovídající této podmínce v závislosti na typu spojení.
Všimněte si, že pro všechny následující SQLite Příklady tabulek JOIN, musíte spustit sqlite3.exe a otevřít připojení k ukázkové databázi jako plynulé:
Krok 1) V tomto kroku,
- Otevřete Tento počítač a přejděte do následujícího adresáře “C:\sqlite" a
- Poté otevřete „sqlite3.exe"
Krok 2) Otevřít databázi"NávodySampleDB.db“ pomocí následujícího příkazu:
Nyní jste připraveni spustit jakýkoli typ dotazu na databázi.
SQLite INNER JOIN
INNER JOIN vrátí pouze řádky, které odpovídají podmínce spojení, a odstraní 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, abyste získali název oddělení pro každého studenta, a to následovně:
SELECT Students.StudentName, Departments.DepartmentName FROM Students INNER JOIN Departments ON Students.DepartmentId = Departments.DepartmentId;
Vysvětlení kódu
INNER JOIN funguje následovně:
- V klauzuli Select můžete vybrat libovolné sloupce, které chcete vybrat, ze dvou odkazovaných tabulek.
- Klauzule INNER JOIN se píše za první tabulkou, na kterou se odkazuje klauzulí „From“.
- Potom je podmínka spojení specifikována pomocí ON.
- Pro odkazované tabulky lze zadat aliasy.
- Slovo INNER je nepovinné, stačí napsat JOIN.
Výstup
- INNER JOIN vytváří záznamy jak z tabulek studentů, tak z tabulek katedry, které odpovídají podmínce, která je „Students.DepartmentId = Departments.DepartmentId “. Neshodné řádky budou ignorovány a nebudou zahrnuty do výsledku.
- Proto se z tohoto dotazu s katedrami informatiky, matematiky a fyziky vrátilo 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 v tabulce oddělení. Takto:
SQLite PŘIPOJTE SE … POUŽÍVÁNÍM
INNER JOIN lze napsat pomocí klauzule „USING“, aby se předešlo nadbytečnosti, takže místo psaní „ON Students.DepartmentId = Departments.DepartmentId“ můžete napsat pouze „USING(DepartmentID)“.
„JOIN .. USING“ můžete použít vždy, když budou mít sloupce, které budete porovnávat v podmínce spojení, stejný název. V takových případech není potřeba je opakovat pomocí on podmínky a stačí uvést názvy sloupců a SQLite to zjistí.
Rozdíl mezi INNER JOIN a JOIN .. POUŽITÍ:
S „JOIN … USING“ nezapisujete podmínku spojení, pouze zapíšete sloupec spojení, který je společný pro dvě spojené tabulky, místo zápisu table1 „INNER JOIN table2 ON table1.cola = table2.cola“ zapíšeme jako „tabulka1 PŘIPOJIT SE k tabulce2 POMOCÍ (cola)“.
Příklad
V následujícím příkladu spojíme dvě tabulky „Studenti"A"Oddělení” s DepartmentId, abyste získali název oddělení pro každého studenta, a to následovně:
SELECT Students.StudentName, Departments.DepartmentName FROM Students INNER JOIN Departments USING(DepartmentId);
Vysvětlení
- Na rozdíl od předchozího příkladu jsme nenapsali „ON Students.DepartmentId = Departments.DepartmentId“. Právě jsme napsali"POUŽÍVÁM(ID oddělení)".
- SQLite automaticky odvodí podmínku spojení a porovná DepartmentId z obou tabulek – Students a Departments.
- Tuto syntaxi můžete použít vždy, když mají dva porovnávané sloupce stejný název.
Výstup
- Získáte stejný přesný výsledek jako předchozí příklad:
SQLite PŘIROZENÉ SPOJENÍ
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 zadat 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 názvy dvou tabulek bez jakýchkoli podmínek. Potom bude přirozené spojení automaticky testovat rovnost mezi hodnotami pro každý sloupec, který existuje v obou tabulkách. Přirozené spojení automaticky odvodí podmínku spojení.
- V NATURAL JOIN budou porovnány všechny sloupce z obou tabulek se stejným názvem. Například, pokud máme dvě tabulky se dvěma společnými názvy sloupců (dva sloupce existují se stejným názvem ve dvou tabulkách), přirozené spojení spojí dvě tabulky porovnáním hodnot obou sloupců a nikoli pouze z jednoho. sloupec.
Příklad
SELECT Students.StudentName, Departments.DepartmentName FROM Students Natural JOIN Departments;
Vysvětlení
- Nepotřebujeme psát podmínku spojení s názvy sloupců (jako jsme to udělali v INNER JOIN). Ani jsme jednou nemuseli psát název sloupce (jako 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 ze dvou tabulek Students a Departments.
Výstup
- Natural JOIN vám poskytne stejný přesný výstup jako výstup, který jsme získali z příkladů INNER JOIN a JOIN USING. Protože v našem příkladu jsou všechny tři dotazy ekvivalentní. Ale v některých případech se výstup bude lišit od vnitřního spojení než u přirozeného spojení. Pokud je například více tabulek se stejnými názvy, pak přirozené spojení porovná všechny sloupce 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 LEVÁ VNĚJŠÍ SPOJENÍ
Standard SQL definuje tři typy OUTER JOINů: LEFT, RIGHT a FULL but SQLite podporuje pouze přirozený LEFT OUTER JOIN.
V LEFT OUTER JOIN budou všechny hodnoty sloupců, které vyberete z levé tabulky, zahrnuty do výsledku dotaz, takže bez ohledu na to, zda hodnota odpovídá nebo neodpovídá podmínce spojení, bude zahrnuta do výsledku.
Pokud tedy levá tabulka obsahuje 'n' řádků, výsledky dotazu budou mít 'n' řádků. Pokud však hodnota sloupců pocházející z pravé tabulky neodpovídá podmínce spojení, bude obsahovat hodnotu „null“.
Získáte tak počet řádků ekvivalentní počtu řádků v levém spojení. Takže získáte odpovídající řádky z obou tabulek (jako výsledky INNER JOIN) plus neodpovídající řádky z levé tabulky.
Příklad
V následujícím příkladu vyzkoušíme spojení „LEFT JOIN“ pro spojení dvou tabulek „Students“ a „Departments“:
SELECT Students.StudentName, Departments.DepartmentName FROM Students -- this is the left table LEFT JOIN Departments ON Students.DepartmentId = Departments.DepartmentId;
Vysvětlení
- SQLite Syntaxe LEFT JOIN je stejná jako INNER JOIN; zapíšete LEFT JOIN mezi dvě tabulky a potom podmínka spojení následuje po klauzuli ON.
- První tabulka po klauzuli from je levá tabulka. Zatímco druhá tabulka zadaná po přirozeném LEFT JOIN je pravá tabulka.
- Klauzule OUTER je volitelná; LEFT natural OUTER JOIN je totéž jako LEFT JOIN.
Výstup
- Jak můžete vidět, jsou zahrnuty všechny řádky z tabulky studentů, což je celkem 10 studentů. I když čtvrtý a poslední student, Jena a George DepartmentIds neexistuje v tabulce Departments, jsou zahrnuti také.
- A v těchto případech bude hodnota departmentName pro Jenu i George „null“, protože tabulka departments nemá název departmentName, který by odpovídal jejich hodnotě departmentId.
Ukažme předchozímu dotazu pomocí levého spojení hlubší vysvětlení pomocí Van diagramů:
LEFT JOIN poskytne všem studentům jména z tabulky studentů, i když má student ID oddělení, které v tabulce oddělení neexistuje. Dotaz vám tedy neposkytne pouze odpovídající řádky jako INNER JOIN, ale poskytne vám další část, která má neodpovídající řádky z levé tabulky, což je tabulka studentů.
Všimněte si, že každé jméno studenta, které nemá žádné 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 neodpovídajících řádcích.
SQLite KRÍŽNÍ PŘIPOJENÍ
CROSS JOIN dává kartézský součin pro vybrané sloupce dvou spojených tabulek, a to 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 dostanete 'n' shod z druhé tabulky, kde n je počet druhých řádků tabulky.
Na rozdíl od INNER JOIN a LEFT OUTER JOIN u CROSS JOIN nemusíte specifikovat podmínku spojení, protože SQLite nepotřebuje to pro CROSS JOIN.
Jedno SQLite výsledkem budou logické výsledky nastavené kombinací všech hodnot z první tabulky se všemi hodnotami z druhé tabulky.
Pokud jste například 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).
Pak výsledkem CROSS JOIN budou čtyři řádky:
- Dva řádky kombinací první hodnoty z colA, která je 1, se dvěma hodnotami colB (3,4), což bude (1,3), (1,4).
- Podobně dva řádky kombinací druhé hodnoty z colA, která je 2, se dvěma hodnotami colB (3,4), což jsou (2,3), (2,4).
Příklad
V následujícím dotazu vyzkoušíme CROSS JOIN mezi tabulkami Studenti a Katedry:
SELECT Students.StudentName, Departments.DepartmentName FROM Students CROSS JOIN Departments;
Vysvětlení
- v SQLite výběr z více tabulek, právě jsme vybrali dva sloupce „studentname“ z tabulky studentů a „departmentName“ z tabulky oddělení.
- Pro křížové spojení jsme neurčili žádnou podmínku spojení, pouze dvě tabulky kombinované s CROSS JOIN uprostřed nich.
Výstup
Jak vidíte, výsledkem je 40 řádků; 10 hodnot z tabulky studentů se shodovalo se 4 hodnotami z tabulky oddělení. Takto:
- Čtyři hodnoty pro čtyři oddělení z tabulky oddělení odpovídaly prvnímu studentovi Michelovi.
- Čtyři hodnoty pro čtyři oddělení z tabulky oddělení odpovídaly druhému studentovi Johnovi.
- Čtyři hodnoty pro čtyři oddělení z tabulky oddělení odpovídaly třetímu studentovi Jackovi… a tak dále.
Shrnutí
Použití SQLite JOIN dotaz, můžete propojit jednu nebo více tabulek nebo poddotazů dohromady a vybrat sloupce z obou tabulek nebo poddotazů.