Shrnutí :v tomto tutoriálu se dozvíte o různých typech SQLite spojení pro dotazování na data ze dvou nebo více tabulek.
Pro demonstraci použijeme artists a albums tabulky z ukázkové databáze.
Interpret může mít nula nebo mnoho alb, zatímco album patří jednomu interpretovi.
Chcete-li dotazovat data od obou artists a albums tabulky, můžete použít INNER JOIN , LEFT JOIN nebo CROSS JOIN doložka. Každá klauzule spojení určuje, jak SQLite používá data z jedné tabulky ke shodě s řádky v jiné tabulce.
Pamatujte, že SQLite přímo nepodporuje RIGHT JOIN a FULL OUTER JOIN .
SQLite INNER JOIN
Následující příkaz vrátí názvy alb a jejich jména interpretů:
SELECT
Title,
Name
FROM
albums
INNER JOIN artists
ON artists.ArtistId = albums.ArtistId;
Code language: SQL (Structured Query Language) (sql) Zde je částečný výstup:
V tomto příkladu INNER JOIN klauzule odpovídá každému řádku z albums tabulka s každým řádkem z artists tabulka na základě podmínky spojení (artists.ArtistId = albums.ArtistId ) zadaný za ON klíčové slovo.
Pokud se podmínka spojení vyhodnotí jako pravdivá (nebo 1), sloupce řádků z obou albums a artists tabulky jsou součástí sady výsledků.
Tento dotaz používá aliasy tabulek (l pro albums tabulka a r pro artists table) pro zkrácení dotazu:
SELECT
l.Title,
r.Name
FROM
albums l
INNER JOIN artists r ON
r.ArtistId = l.ArtistId;
Code language: SQL (Structured Query Language) (sql)
V případě, že jsou názvy sloupců spojených tabulek stejné, např. ArtistId , můžete použít USING syntaxe takto:
SELECT
Title,
Name
FROM
albums
INNER JOIN artists USING(ArtistId);Code language: SQL (Structured Query Language) (sql)
Klauzule USING(ArtistId) je ekvivalentní klauzuli ON artists.ArtistId = albums.ArtistId .
SQLite LEFT JOIN
Toto prohlášení vybírá jména interpretů a názvy alb z artists a albums tabulky pomocí LEFT JOIN klauzule:
SELECT
Name,
Title
FROM
artists
LEFT JOIN albums ON
artists.ArtistId = albums.ArtistId
ORDER BY Name;
Code language: SQL (Structured Query Language) (sql) Zde je výstup:
LEFT JOIN klauzule vybírá data začínající z levé tabulky (artists ) a odpovídající řádky v pravé tabulce (albums ) na základě podmínky připojení (artists.ArtistId = albums.ArtistId ).
Levé spojení vrátí všechny řádky od artists tabulka (nebo levá tabulka) a odpovídající řádky z albums tabulka (nebo pravá tabulka).
Pokud řádek z levé tabulky nemá odpovídající řádek v pravé tabulce, SQLite zahrnuje sloupce řádků v levé tabulce a NULL pro sloupce pravé tabulky.
Podobné jako INNER JOIN klauzule, můžete použít USING syntaxe podmínky spojení takto:
SELECT
Name,
Title
FROM
artists
LEFT JOIN albums USING (ArtistId)
ORDER BY
Name;Code language: SQL (Structured Query Language) (sql)
Pokud chcete najít interprety, kteří nemají žádná alba, můžete přidat WHERE klauzule, jak je znázorněno v následujícím dotazu:
SELECT
Name,
Title
FROM
artists
LEFT JOIN albums ON
artists.ArtistId = albums.ArtistId
WHERE Title IS NULL
ORDER BY Name;
Code language: SQL (Structured Query Language) (sql) Tento obrázek ukazuje částečný výstup:
Obecně vám tento typ dotazu umožňuje najít řádky, které jsou dostupné v levé tabulce, ale nemají odpovídající řádky v pravé tabulce.
Všimněte si, že LEFT JOIN a LEFT OUTER JOIN jsou synonyma.
SQLite CROSS JOIN
CROSS JOIN klauzule vytvoří kartézský součin řádků ze spojených tabulek.
Na rozdíl od INNER JOIN a LEFT JOIN klauzule, CROSS JOIN nemá podmínku připojení. Zde je základní syntaxe CROSS JOIN klauzule:
SELECT
select_list
FROM table1
CROSS JOIN table2;
Code language: SQL (Structured Query Language) (sql)
CROSS JOIN kombinuje každý řádek z první tabulky (table1 ) s každým řádkem z druhé tabulky (table2 ), čímž vytvoříte sadu výsledků.
Pokud má první tabulka N řádků, druhá tabulka má M řádků, konečný výsledek bude mít NxM řádky.
Praktický příklad CROSS JOIN klauzule je kombinovat dva soubory dat pro vytvoření počátečního souboru dat pro další zpracování. Máte například seznam produktů a měsíců a chcete si vytvořit plán, kdy můžete které produkty prodat.
Následující skript vytvoří products a calendars tabulky:
CREATE TABLE products(
product text NOT null
);
INSERT INTO products(product)
VALUES('P1'),('P2'),('P3');
CREATE TABLE calendars(
y int NOT NULL,
m int NOT NULL
);
INSERT INTO calendars(y,m)
VALUES
(2019,1),
(2019,2),
(2019,3),
(2019,4),
(2019,5),
(2019,6),
(2019,7),
(2019,8),
(2019,9),
(2019,10),
(2019,11),
(2019,12);
Code language: SQL (Structured Query Language) (sql)
Tento dotaz používá CROSS JOIN doložka pro spojení produktů s měsíci:
SELECT *
FROM products
CROSS JOIN calendars;
Code language: SQL (Structured Query Language) (sql) Zde je výstup:
V tomto tutoriálu jste se naučili různé druhy SQLite spojení, které vám umožňují dotazovat se z více tabulek.