sql >> Databáze >  >> RDS >> SQLite

Poddotaz SQLite

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.


  1. skript pro převod mysql dump sql souboru do formátu, který lze importovat do sqlite3 db

  2. Zpracování velkých transakcí pomocí replikace streamování a MariaDB 10.4

  3. Jak změnit datový adresář MySQL?

  4. Vynutit použití indexu v Oracle