データベース初心者必見!入門編その10〜副問い合わせ〜
2015/08/10
はじめに
今回は、入門編その1、入門編その2、入門編その3、入門編その4、入門編その5、入門編その6、入門編その7、入門編その8、入門編その9の続きです。
今回は少し複雑な副問い合わせについて紹介します。今回でSELECT文にまつわる説明は一旦最後となります。
副問い合わせ
ここからは、もう少し複雑なSELECT文である副問い合わせについて紹介いたします。
SELECT文のなかでさらにSELECT文を記述して問い合わせを行うことを副問い合わせやサブクエリーと呼びます。「SELECT文の中にSELECT文?」なんだか不思議な感じがしますね。
具体的には、SELECT文のWHERE句にSELECT文を記述します。
実際にSQLを発行してみましょう。
[shell]SELECT * FROM goods WHERE gds_price =
(SELECT MAX(gds_price) FROM goods [/shell]
実行結果
WHERE句の「 (SELECT MAX(gds_price) FROM goods 」が副問い合わせの部分になります。
この内部のSELECT文は、goodsテーブルのgoods列の最大値を問い合わせるSELECT文です。
つまり、今回のSQL文全体では、goodsテーブルでgds_price列の値が最大である行を取得しています。
このように、副問い合わせはSELECT分を入れ子(ネスト)にして行います。この入れ子は基本的に何重にしても構いません。(わかりにくい文になっしまうという欠点があります。)
副問い合わせ部分のSELECT分は、()で括る必要があり括らないとエラーになってしまします。
複数行に問い合わせる副問い合わせ
先ほどの問い合わせでは、副問い合わせによって一行が返ってきますが、場合によっては複数行が返ってくる事も考えられます。複数行が返ってくる場合には=演算子では比較できません。
そこで、複数行に戻される副問い合わせでは、比較演算子「=,<,<=,>=」と次の行の演算子を組み合わせて条件を記述します。
複数行を返す副問い合わせで使用する演算子
演算子 | 意味 |
[NOT] IN | 副問い合わせで返された値の中のいずれかの値と一致する行を返す |
ANY,SOME |
問い合わせで返された値の中のいずれかの値と比較して真となる行を返す。 (ANY,SOME)は同じ意味を持つ |
ALL | 副問い合わせで返された値の中の全ての値と比較して真となる行を返す。 |
IN演算子を使った例
まずは比較演算子IN演算子を使ってSQLを発行します。
[shell]SELECT ctg_name FROM category WHERE ctg_id IN
(SELECT ctg_id FROM goods WHERE
gds_stock < = 100[/shell]
実行結果
複数の列を指定してグループ化を行った場合には、列の値の組み合わせが同じものがグループ化して表示されます。今回取得した結果セットはあまり有用のないものとはいえませんが、このような方法があることも覚えておきましょう。
ANY演算子を使った例
続いてANY演算子を使います。
[shell]SELECT gds_name,gds_prie FROM goods
WHERE gds_price > ANY
(SELECT gds_price FROM goods WHERE mkr_id =4)[/shell]
実行結果
副問い合わせの部分では次のような結果が返されます。
副問い合わせ実行結果
ANY演算子を使用して、さらにgoodsテーブルのgds_price列と比較しているので、「5900,,32500,1900」のどれかより大きな値を持つ演算子を持つ行が返されます。言い換えると最も最小な値である(1900)よりも大きければ良いということになります。
以上のようにANY演算子は比較演算子とともに使用します。SOME,ALLについても同様です。
このctg_idのいずれかに一致するctg_nameを外側のSELECT文で取得しています。
ALL演算子を使った例
まずは比較演算子ALL演算子を使ってSQLを発行します。
[shell]SELECT gds_name,gds_prie FROM goods WHERE
gds_price > ALL
(SELECT gds_price FROM goods WHERE mkr_id =4)[/shell]
実行結果
今度は結果がかなり絞りこまれました。
ALL演算子は右辺の全ての値と条件を比較するものです。
副問い合わせの部分で返ってくる値は「5900,32500,1900」です。この全てとgds_price列の値が比較演算子「>」で比較されます。言い換えると最も大きな値(32500)よりも大きな値を持つ行が検索されるわけです。
さいごに
今回は複雑な問い合わせ方法である副問い合わせについて紹介しました。
次回は、テーブルに入っているデータの変更方法について紹介していきます。