概要 :このチュートリアルでは、より読みやすく複雑なクエリを構築するための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)
このチュートリアルでは、サブクエリを紹介し、クエリでサブクエリを使用してテーブルからデータを選択するさまざまな方法を示しました。