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.