SQLite Spojení: Přirozené levé vnější, vnitřní, křížové s tabulkami

⚡ Chytré shrnutí

SQLite Klauzule JOIN kombinují řádky ze dvou nebo více tabulek pomocí metod INNER JOIN, JOIN USING, NATURAL JOIN, LEFT OUTER JOIN a CROSS JOIN, což umožňuje porovnávat související záznamy podle sdílených sloupců a číst data napříč normalizovanou databází.

  • 🔗 Klauzule o spojení: Klauzule JOIN propojuje dvě nebo více tabulek nebo poddotazů ve sdíleném sloupci definovaném podmínkou ON nebo USING.
  • 🎯 VNITŘNÍ SPOJENÍ: Funkce INNER JOIN vrací pouze řádky, kde se shoduje podmínka spojení v obou tabulkách, a zahodí neshodující se řádky.
  • 🧩 POUŽITÍ A PŘÍRODNÍ: JOIN USING pojmenovává jeden sdílený sloupec, zatímco NATURAL JOIN automaticky porovnává všechny sloupce se stejným názvem.
  • ↩️ LEVÝ VNĚJŠÍ SPOJENÍ: LEFT OUTER JOIN zachovává každý řádek levé tabulky a neshodující se sloupce pravé tabulky vyplňuje hodnotami NULL.
  • ✖️ KŘÍŽOVÉ SPOJENÍ: Funkce CROSS JOIN vrací kartézský součin, přičemž každý řádek levé tabulky spáruje s každým řádkem pravé tabulky.
  • 🤖 Asistence AI: Nástroje pro převod textu do SQL s využitím umělé inteligence a GitHub Copilot generují SQLite Dotazy JOIN z výzev v jednoduché angličtině.

SQLite Připojte

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:

SQLite Syntaxe klauzule JOIN

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 složku Tento počítač, přejděte do adresáře „C:\sqlite“ a poté otevřete soubor „sqlite3.exe“:

Otevřete soubor sqlite3.exe z adresáře sqlite

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

Otevření databáze TutorialsSampleDB

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

SQLite INNER JOIN

SQLite VNITŘNÍ SPOJOVÁNÍ Vennův diagram

Funkce INNER JOIN vrací pouze řádky, které splňují podmínku spojení, a eliminuje všechny ostatní řádky, které podmínce spojení neodpovídají.

Příklad

V následujícím příkladu spojíme dvě tabulky „Studenti“ a „Katedry“ pomocí DepartmentId, abychom získali název katedry pro každého studenta takto:

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 vygeneruje záznamy z tabulek studentů i oddělení, které splňují podmínku „Students.DepartmentId = Departments.DepartmentId“. Neodpovídající řádky budou ignorovány a nebudou zahrnuty do výsledku.

SQLite Výsledek příkladu INNER JOIN

Proto se z tohoto dotazu našlo pouze 8 studentů z 10 s katedrami IT, matematiky a fyziky. Studenti „Jena“ a „George“ nebyli zahrnuti, protože mají null departmentId, což se neshoduje se sloupcem departmentId z tabulky departments. Následuje:

SQLite INNER JOIN shodné řádky

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“ nezapíšete podmínku spojení, pouze zapíšete sloupec spojení, který je společný pro dvě spojená pole. Místo zápisu table1 „INNER JOIN table2 ON table1.cola = table2.cola“ to zapíšeme jako „table1 JOIN table2 USING(cola)“.

Příklad

V následujícím příkladu spojíme dvě tabulky „Studenti“ a „Katedry“ pomocí DepartmentId, abychom získali název katedry pro každého studenta takto:

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“. Napsali jsme pouze „USING(DepartmentId)“.
  • 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 Výsledek příkladu JOIN USING

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žije ke spojení dvou tabulek. Zatímco v přirozeném spojení se podmínka spojení nezadává. Stačí zapsat názvy dvou tabulek bez jakékoli podmínky. Přirozené spojení pak automaticky otestuje shodu hodnot pro každý sloupec 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í

  • Nemusíme 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 ze dvou tabulek Students a Departments.

Výstup

Příkaz PŘIROZENÝ JOIN vám dá přesně stejný 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 ekvivalentní. V některých případech se však výstup z vnitřního spojení bude lišit od výstupu z přirozeného spojení. Například pokud existuje více tabulek se stejnými názvy, pak přirozené spojení porovná všechny sloupce. Vnitřní spojení však porovná pouze sloupce v podmínce spojení.

SQLite Výsledek příkladu PŘIROZENÉHO SPOJENÍ

SQLite LEVÁ VNĚJŠÍ SPOJENÍ

Standard SQL definuje tři typy vnějších spojení (OUTER JOIN): levé (LEFT), pravé (RIGHT) a úplné (FULL), ale SQLite podporuje pouze přirozený LEFT OUTER JOIN.

V levém vnějším spojení budou všechny hodnoty sloupců, které vyberete z levé tabulky, zahrnuty do výsledku dotazu, takže bez ohledu na to, zda hodnota splňuje podmínku spojení, bude zahrnuta do výsledku.

Takže pokud má levá tabulka 'n' řádků, výsledky dotazu budou mít 'n' řádků. Nicméně pro hodnoty sloupců pocházejících z pravé tabulky, pokud jakákoli hodnota nesplňuje podmínku 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 vidíte, zahrnuty jsou všechny řádky z tabulky studentů, což je celkem 10 studentů. I když čtvrtý a poslední student, Jena a George, mají ID oddělení, která v tabulce Oddělení neexistují, jsou také zahrnuti.

A v těchto případech bude hodnota departmentName pro Jenu i George „null“, protože tabulka departments neobsahuje hodnotu departmentName, která by odpovídala jejich hodnotě departmentId.

SQLite Výsledek příkladu LEFT OUTER JOIN

Vysvětlíme si předchozí dotaz s použitím levého spojení podrobněji pomocí Vennových diagramů:

SQLite LEVÝ VNĚJŠÍ SPOJENÍ Vennův diagram

LEFT JOIN vrátí všechna jména studentů z tabulky studenti, i když student má ID oddělení, které v tabulce oddělení neexistuje. Dotaz tedy nevrátí pouze odpovídající řádky jako INNER JOIN, ale vrátí i část navíc, která obsahuje neshodné řádky z levé tabulky, což je tabulka studenti.

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 zadávat podmínku spojení, protože SQLite nepotřebuje to pro CROSS JOIN.

Jedno SQLite výsledkem bude logická sada výsledků 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), sloupec A obsahuje dvě hodnoty (1,2) a sloupec B 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 zkombinované pomocí 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í se shodovaly s druhým studentem Janem.
  • Čtyři hodnoty pro čtyři oddělení z tabulky oddělení se shodovaly s třetím studentem Jackem… a tak dále.

SQLite Výsledek příkladu CROSS JOIN

Nejčastější dotazy

SQLite Ve verzi 3.39.0, vydané v roce 2022, byla přidána podpora pro RIGHT JOIN a FULL OUTER JOIN. Ve starších sestaveních emulujete RIGHT JOIN pomocí swapu.ping tabulky pomocí LEFT JOIN a FULL OUTER JOIN kombinací dvou LEFT JOIN pomocí UNION.

Samostatné spojení spojuje tabulku sama se sebou pomocí aliasů tabulek, takže jedna kopie funguje jako levá tabulka a druhá jako pravá. Je to užitečné pro porovnávání řádků ve stejné tabulce, například pro porovnávání zaměstnanců s jejich manažery.

Ano. V jednom příkazu SELECT se zřetězí několik klauzulí JOIN, každá s vlastní podmínkou ON nebo USING, například FROM A JOIN B ON … JOIN C ON …. SQLite Spojí tabulky zleva doprava do jedné kombinované sady výsledků.

Psaní samotného JOIN je stejné jako INNER JOIN v SQLiteOba ponechávají pouze řádky, které splňují podmínku ON nebo USING, takže neshodné řádky jsou odstraněny. Klíčové slovo INNER je volitelné, takže JOIN a INNER JOIN jsou zaměnitelné.

Vytvoření indexu na sloupcích použitých v podmínce spojení umožňuje SQLite porovnávání řádků bez prohledávání celých tabulek, což zrychluje spojení u velkých datových sad. Indexování sloupců s cizím klíčem a spuštění příkazu ANALYZE pro aktualizaci statistik dále zlepšuje výkon dotazů spojení.

INNER JOIN vrací pouze řádky, které se shodují v obou tabulkách. LEFT OUTER JOIN vrací všechny řádky z levé tabulky a odpovídající řádky z pravé tabulky, přičemž neshodné pravé sloupce vyplní hodnotou NULL. LEFT JOIN tedy nikdy neodstraní řádky z levé tabulky.

Ano. Asistenti pro převod textu do SQL s umělou inteligencí převádějí požadavky v prosté angličtině na SQLite Příkazy INNER, LEFT, NATURAL a CROSS JOIN. Zadání názvů tabulek, názvů sloupců a vztahů zvyšuje přesnost a každé vygenerované spojení by mělo být před spuštěním na reálných datech zkontrolováno a otestováno.

GitHub Copilot navrhuje SQLite Dotazy JOIN inline v editorech, jako je VS Code, dokončuje klauzule INNER JOIN, LEFT JOIN a ON nebo USING. Čte blízká schémata a komentáře, takže jeho návrhy znovu používají skutečné názvy vašich tabulek a sloupců.

Shrňte tento příspěvek takto: