サブクエリー①(サブクエリーの基礎)
1.サブクエリーの原理
SQLでは、SELECT文の中にSELECT文を記述することによって、クエリーの中で別のクエリーを実行することができます。このようにクエリーの中に埋め込まれたクエリーのことをサブクエリーまたは副問合せといいます。
それでは、実際にサブクエリーを見てみましょう。今回も商品表と受注表を使います。2つの列には商品コードという共通の列が存在します。
商品表
受注表
ここで、ある商品に対する受注明細を知りたいとします。しかし現時点では、商品名は分かりますが、商品コードがわかりません。このような場合にサブクエリーを使用します。早速試してみます。
SELECT * FROM 受注
WHERE 商品コード =
(SELECT 商品コード FROM 商品 WHERE 商品名 = ‘中華まんじゅう’);
結果は以下のようになります。
考え方としては、まずカッコ()の中のSQLを最初に実行します。結果を見てみると、
(SELECT 商品コード FROM 商品 WHERE 商品名 = ‘中華まんじゅう’)
結果は以下のとおりです。
つまり、このサブクエリーのSQLは以下と同じということになります。
SELECT * FROM 受注 WHERE 商品コード = 22;
このように、一見複雑そうに見えるサブクエリーも、分解して各結果を見ながら確認するとスッキリしたものとなります。
2.サブクエリーと表の結合
複数の表を結合すると、さらに役に立つ情報を得ることができます。次の例を見てみます。受注表と商品表を結合し、商品表から商品名列を出力することによって、受注明細に商品名を加えています。次のSQLを実行します。
SELECT J.受注日, J.得意先名, J.商品コード, S.商品名, J.数量
FROM 受注 J INNER JOIN 商品 S
ON J.商品コード = S.商品コード
WHERE J.商品コード =
(SELECT 商品コード FROM 商品 WHERE 商品名 = ‘中華まんじゅう’);
結果は以下のようになります。
3.結果が1つに定まらないサブクエリー
ここで、前項のSQLを再考すると、’中華まんじゅう’に対する受注だけを抽出しました。しかし、今度は’まんじゅう’類全体の受注明細を抽出します。商品には、’中華まんじゅう’、’ごままんじゅう’の2つがあります。
SELECT J.受注日, J.得意先名, J.商品コード, S.商品名, J.数量
FROM 受注 J INNER JOIN 商品 S
ON J.商品コード = S.商品コード
WHERE J.商品コード =
(SELECT 商品コード FROM 商品 WHERE 商品名 LIKE ‘%まんじゅう%’);
結果はいかのとおりエラーとなります。
サブクエリー側の結果は2件の結果を返しています。通常、サブクエリーの結果は1つに定まるように設定しなければなりません。
今回はここまでです。次回は複雑なサブクエリーを考えてみます。
コメントを残す