サブクエリとは、他の SQL ステートメントの内部にネストされた SELECT 文です。単一レベルのクエリでは明確に表現できないようなデータのフィルター処理、集計、変換を実現するために、サブクエリを使用します。
例
以下のクエリは、「会場リストに登場する都市名を除いた」販売者の中で、最大販売チケット数が最も高い上位 10 名を抽出します。WHERE 句では、NOT IN を用いたテーブルサブクエリが使用されています。このサブクエリは、複数行を含む単一列(venuecity)を返します。
説明
テーブルサブクエリは、複数行・複数列を返すことができます。
select firstname, lastname, cityname, max(qtysold) as maxsold
from users join sales on users.userid=sales.sellerid
where users.cityname not in(select venuecity from venue)
group by firstname, lastname, cityname
order by maxsold desc, cityname desc
limit 10;実行結果:
firstname | lastname | cityname | maxsold
-----------+----------+----------------+---------
Noah | Guerrero | Worcester | 8
Isadora | Moss | Winooski | 8
Kieran | Harrison | Westminster | 8
Heidi | Davis | Warwick | 8
Sara | Anthony | Waco | 8
Bree | Buck | Valdez | 8
Evangeline | Sampson | Trenton | 8
Kendall | Keith | Stillwater | 8
Bertha | Bishop | Stevens Point | 8
Patricia | Anderson | South Portland | 8クエリの動作の仕組み:
JOIN sales ON users.userid = sales.sellerid— 各ユーザーを、そのユーザーが販売者として関連付けられた販売レコードと結合します。WHERE users.cityname NOT IN (SELECT venuecity FROM venue)— テーブルサブクエリがすべての会場都市名を返し、外部クエリはそのリストに含まれない都市に所在する販売者のみを抽出します。MAX(qtysold) AS maxsold— 販売者ごとのチケット販売数を集計します。ORDER BY maxsold DESC, cityname DESC— 販売ボリューム(maxsold)の降順で並べた後、都市名(cityname)も降順で並べます。LIMIT 10— 上位 10 行のみを返します。