Shrnutí :v tomto tutoriálu se dozvíte o poddotazu SQLite pro vytváření čitelnějších a složitějších dotazů.
Úvod do poddotazu SQLite
Poddotaz je SELECT
příkaz vnořený do jiného příkazu. Viz následující prohlášení.
SELECT column_1
FROM table_1
WHERE column_1 = (
SELECT column_1
FROM table_2
);
Code language: SQL (Structured Query Language) (sql)
Následující dotaz je vnější dotaz :
SELECT column_1
FROM table_1
WHERE colum_1 =
Code language: SQL (Structured Query Language) (sql)
A následující dotaz je poddotaz .
(SELECT column_1
FROM table_2)
Code language: SQL (Structured Query Language) (sql)
K uzavření poddotazu musíte použít pár závorek. Všimněte si, že poddotaz můžete vnořit do jiného poddotazu s určitou hloubkou.
Poddotaz obvykle vrátí jeden řádek jako atomickou hodnotu, i když může vrátit více řádků pro porovnání hodnot s IN
operátor.
Můžete použít poddotaz v SELECT
, FROM
, WHERE
a JOIN
klauzule.
Příklady poddotazů SQLite
Použijeme tracks
a albums
tabulky z ukázkové databáze pro ukázku.
1) Poddotaz SQLite v WHERE
příklad klauzule
Jako podmínku hledání můžete použít jednoduchý poddotaz. Například následující příkaz vrátí všechny skladby v albu s názvem Let There Be Rock
SELECT trackid,
name,
albumid
FROM tracks
WHERE albumid = (
SELECT albumid
FROM albums
WHERE title = 'Let There Be Rock'
);
Code language: SQL (Structured Query Language) (sql)
Dílčí dotaz vrátí ID alba s názvem 'Let There Be Rock'
. Dotaz používá stejný operátor (=) k porovnání albumid
vrácené dílčím dotazem s albumid
ve tracks
tabulka.
Pokud poddotaz vrací více hodnot, můžete použít IN
operátor pro kontrolu existence jedné hodnoty oproti množině hodnot.
Viz následující employees
a customers
tabulka ve vzorové databázi:
Například následující dotaz vrátí zákazníky, jejichž obchodní zástupci jsou v Kanadě.
SELECT customerid,
firstname,
lastname
FROM customers
WHERE supportrepid IN (
SELECT employeeid
FROM employees
WHERE country = 'Canada'
);
Code language: SQL (Structured Query Language) (sql)
Poddotaz vrátí seznam ID zaměstnanců, kteří se nacházejí v Kanadě. Vnější dotaz používá IN
operátora, aby našel zákazníky, kteří mají v seznamu ID obchodního zástupce.
2) Poddotaz SQLite v FROM
příklad klauzule
Někdy chcete použít agregační funkce na sloupec vícekrát. Například nejprve chcete sečíst velikost alba a poté vypočítat průměrnou velikost všech alb. Můžete přijít s následujícím dotazem.
SELECT AVG(SUM(bytes)
FROM tracks
GROUP BY albumid;
Code language: SQL (Structured Query Language) (sql)
Tento dotaz není platný.
Chcete-li to opravit, můžete použít dílčí dotaz v FROM
doložka takto:
SELECT
AVG(album.size)
FROM
(
SELECT
SUM(bytes) SIZE
FROM
tracks
GROUP BY
albumid
) AS album;
Code language: SQL (Structured Query Language) (sql)
AVG(album.size) --------------- 338288920.317
V tomto případě SQLite nejprve provede poddotaz v FROM
klauzuli a vrátí sadu výsledků. Potom SQLite použije tuto sadu výsledků jako odvozenou tabulku ve vnějším dotazu.
Korelovaný poddotaz SQLite
Všechny dílčí dotazy, které jste dosud viděli, lze spustit nezávisle. Jinými slovy, nezávisí na vnějším dotazu.
Korelovaný poddotaz je poddotaz, který používá hodnoty z vnějšího dotazu. Na rozdíl od ordinálního poddotazu nelze korelovaný poddotaz provést nezávisle.
Korelovaný poddotaz není efektivní, protože je vyhodnocen pro každý řádek zpracovaný vnějším dotazem.
Následující dotaz používá korelovaný poddotaz k vrácení alb, jejichž velikost je menší než 10 MB.
SELECT albumid,
title
FROM albums
WHERE 10000000 > (
SELECT sum(bytes)
FROM tracks
WHERE tracks.AlbumId = albums.AlbumId
)
ORDER BY title;
Code language: SQL (Structured Query Language) (sql)
Jak dotaz funguje.
- Pro každý řádek zpracovaný ve vnějším dotazu vypočítá korelovaný dílčí dotaz velikost alb ze stop, které patří aktuálnímu albu pomocí
SUM
funkce. - Predikát v
WHERE
klauzule filtruje alba, která mají velikost větší nebo rovnou 10 MB (1 000 000 bajtů).
SQLite korelovaný poddotaz v SELECT
příklad klauzule
Následující dotaz používá korelovaný poddotaz v SELECT
klauzule pro vrácení počtu skladeb v albu.
SELECT albumid,
title,
(
SELECT count(trackid)
FROM tracks
WHERE tracks.AlbumId = albums.AlbumId
)
tracks_count
FROM albums
ORDER BY tracks_count DESC;
Code language: SQL (Structured Query Language) (sql)
V tomto tutoriálu jsme vám představili poddotaz a ukázali různé způsoby použití poddotazu v dotazu k výběru dat z tabulek.