概要 :このチュートリアルでは、より読みやすく複雑なクエリを構築するためのSQLiteサブクエリについて学習します。
SQLiteサブクエリの概要
サブクエリはSELECTです 別のステートメントにネストされたステートメント。次のステートメントを参照してください。
SELECT column_1
FROM table_1
WHERE column_1 = (
SELECT column_1
FROM table_2
);Code language: SQL (Structured Query Language) (sql) 次のクエリは外部クエリです :
SELECT column_1
FROM table_1
WHERE colum_1 =Code language: SQL (Structured Query Language) (sql) そして、次のクエリはサブクエリです 。
(SELECT column_1
FROM table_2)Code language: SQL (Structured Query Language) (sql) サブクエリを囲むには、括弧のペアを使用する必要があります。サブクエリを特定の深さの別のサブクエリ内にネストできることに注意してください。
通常、サブクエリは単一の行をアトミック値として返しますが、値をINと比較するために複数の行を返す場合があります。 オペレーター。
SELECTでサブクエリを使用できます 、FROM 、WHERE 、およびJOIN 条項。
SQLiteサブクエリの例
tracksを使用します およびalbums デモンストレーション用のサンプルデータベースのテーブル。
1)WHEREのSQLiteサブクエリ 条項の例
単純なサブクエリを検索条件として使用できます。たとえば、次のステートメントは、タイトルが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)
サブクエリは、タイトルが'Let There Be Rock'のアルバムのIDを返します。 。クエリはequal演算子(=)を使用してalbumidを比較します albumidを使用してサブクエリによって返される tracksで テーブル。
サブクエリが複数の値を返す場合は、INを使用できます 一連の値に対して単一の値が存在するかどうかを確認する演算子。
次のemployeesを参照してください およびcustomers サンプルデータベースのテーブル:
たとえば、次のクエリは、営業担当者がカナダにいる顧客を返します。
SELECT customerid,
firstname,
lastname
FROM customers
WHERE supportrepid IN (
SELECT employeeid
FROM employees
WHERE country = 'Canada'
);
Code language: SQL (Structured Query Language) (sql)
サブクエリは、カナダにいる従業員のIDのリストを返します。外部クエリはINを使用します オペレーターは、リストに営業担当者IDを持つ顧客を検索します。
2)FROMのSQLiteサブクエリ 条項の例
集計関数を列に複数回適用したい場合があります。たとえば、最初にアルバムのサイズを合計してから、すべてのアルバムの平均サイズを計算します。次のクエリを思い付くかもしれません。
SELECT AVG(SUM(bytes)
FROM tracks
GROUP BY albumid;Code language: SQL (Structured Query Language) (sql) このクエリは無効です。
これを修正するには、FROMでサブクエリを使用できます 次のような条項:
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
この場合、SQLiteは最初にFROMでサブクエリを実行します 句を使用して、結果セットを返します。次に、SQLiteはこの結果セットを外部クエリの派生テーブルとして使用します。
SQLite相関サブクエリ
これまでに見たすべてのサブクエリは、独立して実行できます。つまり、外部クエリに依存しません。
相関サブクエリは、外部クエリの値を使用するサブクエリです。通常のサブクエリとは異なり、相関サブクエリを個別に実行することはできません。
相関サブクエリは、外部クエリによって処理される行ごとに評価されるため、効率的ではありません。
次のクエリは、相関サブクエリを使用して、サイズが10MB未満のアルバムを返します。
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)
クエリの仕組み。
- 外部クエリで処理された行ごとに、相関サブクエリは、
SUMを使用して、現在のアルバムに属するトラックからアルバムのサイズを計算します。 機能。 -
WHEREの述語 句は、サイズが10MB(10000000バイト)以上のアルバムをフィルタリングします。
SELECTのSQLite相関サブクエリ 条項の例
次のクエリは、SELECTで相関サブクエリを使用します アルバム内のトラック数を返す句。
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)
このチュートリアルでは、サブクエリを紹介し、クエリでサブクエリを使用してテーブルからデータを選択するさまざまな方法を示しました。