データベース初心者必見!入門編その10〜副問い合わせ〜

2015/08/10

はじめに

今回は、入門編その1入門編その2入門編その3入門編その4入門編その5入門編その6入門編その7入門編その8入門編その9の続きです。

今回は少し複雑な副問い合わせについて紹介します。今回でSELECT文にまつわる説明は一旦最後となります。

副問い合わせ

ここからは、もう少し複雑なSELECT文である副問い合わせについて紹介いたします。

SELECT文のなかでさらにSELECT文を記述して問い合わせを行うことを副問い合わせサブクエリーと呼びます。「SELECT文の中にSELECT文?」なんだか不思議な感じがしますね。

具体的には、SELECT文のWHERE句にSELECT文を記述します。

select3

実際にSQLを発行してみましょう。

SELECT * FROM goods WHERE gds_price =
              (SELECT MAX(gds_price) FROM goods 

実行結果

hyou15

 

WHERE句の「 (SELECT MAX(gds_price) FROM goods 」が副問い合わせの部分になります。

この内部のSELECT文は、goodsテーブルのgoods列の最大値を問い合わせるSELECT文です。

つまり、今回のSQL文全体では、goodsテーブルでgds_price列の値が最大である行を取得しています。

 

select4

 

このように、副問い合わせはSELECT分を入れ子(ネスト)にして行います。この入れ子は基本的に何重にしても構いません。(わかりにくい文になっしまうという欠点があります。)

副問い合わせ部分のSELECT分は、()で括る必要があり括らないとエラーになってしまします。

複数行に問い合わせる副問い合わせ

先ほどの問い合わせでは、副問い合わせによって一行が返ってきますが、場合によっては複数行が返ってくる事も考えられます。複数行が返ってくる場合には=演算子では比較できません。

hikaku1

そこで、複数行に戻される副問い合わせでは、比較演算子「=,<,<=,>=」と次の行の演算子を組み合わせて条件を記述します。

複数行を返す副問い合わせで使用する演算子

演算子 意味
[NOT] IN 副問い合わせで返された値の中のいずれかの値と一致する行を返す
ANY,SOME

問い合わせで返された値の中のいずれかの値と比較して真となる行を返す。

(ANY,SOME)は同じ意味を持つ

ALL 副問い合わせで返された値の中の全ての値と比較して真となる行を返す。

IN演算子を使った例

まずは比較演算子IN演算子を使ってSQLを発行します。

SELECT ctg_name FROM category WHERE ctg_id IN
              (SELECT ctg_id FROM goods WHERE 
               gds_stock   < = 100

実行結果

hyou16

複数の列を指定してグループ化を行った場合には、列の値の組み合わせが同じものがグループ化して表示されます。今回取得した結果セットはあまり有用のないものとはいえませんが、このような方法があることも覚えておきましょう。

ANY演算子を使った例

続いてANY演算子を使います。

SELECT gds_name,gds_prie FROM goods
         WHERE gds_price > ANY 
      (SELECT gds_price FROM goods WHERE mkr_id =4)

実行結果

hyou18

副問い合わせの部分では次のような結果が返されます。

副問い合わせ実行結果

hyou19

ANY演算子を使用して、さらにgoodsテーブルのgds_price列と比較しているので、「5900,,32500,1900」のどれかより大きな値を持つ演算子を持つ行が返されます。言い換えると最も最小な値である(1900)よりも大きければ良いということになります。

以上のようにANY演算子は比較演算子とともに使用します。SOME,ALLについても同様です。

このctg_idのいずれかに一致するctg_nameを外側のSELECT文で取得しています。

ALL演算子を使った例

まずは比較演算子ALL演算子を使ってSQLを発行します。

SELECT gds_name,gds_prie FROM goods WHERE
          gds_price > ALL
      (SELECT gds_price FROM goods WHERE mkr_id =4)

実行結果

hyou20

今度は結果がかなり絞りこまれました。

ALL演算子は右辺の全ての値と条件を比較するものです。

副問い合わせの部分で返ってくる値は「5900,32500,1900」です。この全てとgds_price列の値が比較演算子「>」で比較されます。言い換えると最も大きな値(32500)よりも大きな値を持つ行が検索されるわけです。

さいごに

今回は複雑な問い合わせ方法である副問い合わせについて紹介しました。

次回は、テーブルに入っているデータの変更方法について紹介していきます。

投稿者情報

パンダマン

パンダマン

パンダマンです。

主にWebシステム開発等を担当しております。
設計・プログラミング。サーバー管理なんでもやります。

今、担当しているプロジェクトではJavaの今まで触れたことのないフレームワークを使うことになり勉強中です。
学生にC言語のプログラミングの基礎を教えたりもしています。
最近「キングダム」にはまっています。

>> パンダマンが執筆した他の記事を読む

法人向け人気レンタルサーバー
法人向け人気専用サーバー
個人向け人気レンタルサーバー