BLOG

【プログラマー研修 SQL】カヤの記録4

こんにちは!カヤです!!
先日社内にて1日使ってゲーム制作を行うハッカソンがありました!
我がチームはJavaを使用したRPGを作成しました。
Java研修中の身なので、とことんJavaにこだわって、
フレームワークにSwingを使用し、ゲーム画面の作成を行いました。
これまでのJava研修と前もって準備した甲斐もあり、何とか完成に漕ぎ着けました。
ストーリーは他メンバーに任せっきりになってしまいました。
次回参加の際は内容にも口出していきたいです(笑)

SQLは表計算ソフトでテーブルを作るイメージがあると理解しやすくて、
研修もサクサクと進めています!
さて、今回は副問い合わせを学んでいきます。

副問い合わせ

副問い合わせとは、テーブル内のデータを事前に出力して、別のSQL文で使うことを言います。
SQL文でテーブルの出力といえばSELECTです。
SELECTを用いて出力したテーブルを、
他のWHERE句、SELECT内のカラム名やFROM句等でテーブル代わりに使うことができます。

副問い合わせ

例としてお店の注文一覧テーブル「orders」をサンプルとして用意しました。

orders

iddatingnameclassificationunit_pricequantityorder_amount
12014-05-15ウーロン茶11803540
22014-05-15かっぱ巻き25401540
32015-09-09刺し盛り27801780
42016-04-10日本酒36801680
52015-06-20ウーロン茶11803540
62016-01-01ウーロン茶11802360
72016-02-02刺し盛り278021560

このordersテーブルから複数個売れた商品が、いつ何個ずつ売れたのかを副問い合わせでテーブル作成しようと思います。

副問い合わせであらかじめ、売り上げ個数の合計が2個以上の商品のテーブルを作成します。
作成したテーブルの中に名前がある場合はordersから名前と日付、個数のテーブルを作成します。

# 複数個売れた商品の問い合わせ
SELECT
  dating,
  name,
  quantity
FROM
  orders
WHERE
  name IN
  (
    SELECT
      name
    FROM
      orders
    GROUP BY
      name
    HAVING
      SUM(quantity) >= 2
  )
ORDER BY 
  dating ASC
;

WHERE句内のSELECTで商品の一覧にしています。
商品ごとにquantityの数を合計し売り上げ個数を算出、
売り上げ個数が2個以上のテーブルとしました。
WHERE句内のINで売り上げ個数2個以上のテーブル内の商品名であるかを判断します。

このINを使用した副問い合わせは、
テーブルの中から一致するデータを問い合わせるので、
複数行副問い合わせと呼びます。
SELECTで指定するのが平均値などの1つの値であれば
「カラム名 = (SELECT句を使用した単一データ)」となり単一行副問い合わせです。

あとは初めのSELECTで 日付dating、商品名name、量quantityを指定して結果出力します。
出力した結果が下記の通りです。
ORDERによって日付でソートされています。

datingnamequantity
2014-05-15ウーロン茶3
2015-09-09刺し盛り1
2016-01-01ウーロン茶2
2016-02-02刺し盛り2
2016-06-20ウーロン茶3

複数売れた商品がいつ何個売れたのかが、テーブルで分かるようになりました。
副問い合わせの際、LIMIT句で上位3つまでと指定したりすれば、
人気商品のデータのみ取り出すことなんかもできそうです。

最後に

必要なデータだけ取り出す際に、複雑な条件を指定できる副問い合わせは、
テーブルからのデータ抽出の際に非常に役に立ちそうです。
今回は単一テーブルで使用しましたが複数テーブルでの取り扱いもできますし、
WHERE句以外のFROM・SELECTのカラム内、
さらにはINSERTやUPDATE、DELETEといった
テーブル内のデータ編集などでも使えるようです。
皆さんも様々なシチュエーションのテーブルで
副問い合わせを使用したSQL文を書いてみてください。

今日はここまでです。
カヤでした!
ありがとうございました!

BLOGトップへ戻る