サブクエリというワードをご存じでしょうか?
SQLを使用する上でサブクエリが使えるようになると、非常にシンプルな記述が可能になります。
そこで今回はこのサブクエリについて解説してみようと思います。
SQLクエリの中でもサブクエリの使用頻度は非常に高いので、現在SQLを学習中の方はこの記事を読んで必ず習得するようにしましょう。
サブクエリとは

サブクエリは別名「副問い合わせ」とも呼ばれています。
このサブクエリは特定の条件式の中にSELECT文を埋め込むことにより、そのSELECTの結果を条件として利用する事を指します。
テーブル結合であるJOIN句や絞り込みの代表格であるWHERE句を利用することで条件などを指定することが出来ますが、サブクエリはその上位版に位置します。
基本的な記述方
サブクエリを使用する場合、基本的な記述方法は次の通りです。
SELECT 列名 FROM テーブル名 WHERE 列名 演算子 (サブクエリ)
上の記述ではWHERE句を用いていますが、これ以外にもHAVING句などで使用できます。
使い方

それでは早速、実際にサブクエリを使いながら挙動を確認してみましょう。
まず次のようなテーブルデータがあったとします。
// Shop_A
ItemID Name Cost Code
----------- ---------- ----------- ----------
1 item_a 300 dcjr6
2 item_b 400 tqh7o
3 item_c 350 up0nh
4 item_d 500 ocd18
5 item_e 350 5gasc
// Shop_B
ItemID Name Cost Code
----------- ---------- ----------- ----------
1 item_a 500 ui3j3
2 item_b 100 uo83a
3 item_c 150 3fr6u
4 item_d 500 qkc6c
5 item_e 250 19318
「Shop_A」と「Shop_B」にはそれぞれ商品とその商品のコストがデータとして格納されています。
この二つのデータを使用し、「NameとCostが同一の商品のShop_AのCode」を検索してみます。
最初はJOIN句を使い、テーブルを結合させて検索する方法です。
SELECT SA.Code FROM Shop_A AS SA INNER JOIN Shop_B AS SB ON SA.Name = SB.Name WHERE SA.Cost = SB.Cost GO Code ---------------- ocd18 (1 行処理されました)
次に同じスクリプトで、サブクエリを使ってみます。
SELECT Code FROM Shop_A WHERE Cost = (SELECT Cost FROM Shop_B WHERE SHop_A.Name = Shop_B.Name ); GO Code ---------------- ocd18 (1 行処理されました)
サブクエリを使っているためINNER JOIN句でテーブルを結合させていないにもかかわらず、結果はINNER JOIN句を使った時と同じになっていることが確認できます。
複数の結果を返す

SELECT文には二通りの結果があります。
一つは単一結果を返すものでもう一つは複数行に渡って結果を返すものです。
単一結果に関しては特に問題なく条件式を利用できますが、これが複数行となると先ほどまでの条件式は使えなくなります。
ではそういうケースではどのようにするかというと、IN句を利用して組み立てます。
例えば次のクエリを見てください。
SELECT
ProductID
FROM
SalesLT.Product
WHERE
ProductModelID = 11
GO
ProductID
-----------
713
714
715
716
(4 行処理されました)
これはAdventureWorksLT2019というサンプルデータを使い、通常通り条件式で検索をしたものですが、このSELECT文では複数の結果が返ってきていることがわかります。
サブクエリでこの記述を直接利用することは出来ない為、こういった場合には以下のようにIN句に置き換えます。
SELECT
SalesOrderID
FROM
SalesLT.SalesOrderDetail
WHERE
ProductID IN (
SELECT
ProductID
FROM
SalesLT.Product
WHERE
ProductModelID = 11
);
GO
SalesOrderID
------------
71782
71783
71784
71797
71899
71902
71938
71782
71783
71784
71797
71816
71845
71858
71895
71902
71938
71783
71784
71797
(20 行処理されました)
まとめ
いかがでしたか?
今回はサブクエリの基本について解説してみました。
使い慣れるまではあまり便利とは思えない方もいるかもしれませんが、非常に見やすい記述をすることが出来るため、出来るだけこういった形で記述出来るように心がけたいところです。
サブクエリについてはかなり幅広い使い方があるため、色々と調べてみるのも良いかもしれません。