こんにちは!カヤです!!
先日社内にて1日使ってゲーム制作を行うハッカソンがありました!
我がチームはJavaを使用したRPGを作成しました。
Java研修中の身なので、とことんJavaにこだわって、
フレームワークにSwingを使用し、ゲーム画面の作成を行いました。
これまでのJava研修と前もって準備した甲斐もあり、何とか完成に漕ぎ着けました。
ストーリーは他メンバーに任せっきりになってしまいました。
次回参加の際は内容にも口出していきたいです(笑)
SQLは表計算ソフトでテーブルを作るイメージがあると理解しやすくて、
研修もサクサクと進めています!
さて、今回は副問い合わせを学んでいきます。
副問い合わせとは、テーブル内のデータを事前に出力して、別のSQL文で使うことを言います。
SQL文でテーブルの出力といえばSELECTです。
SELECTを用いて出力したテーブルを、
他のWHERE句、SELECT内のカラム名やFROM句等でテーブル代わりに使うことができます。
例としてお店の注文一覧テーブル「orders」をサンプルとして用意しました。
orders
id | | | dating | | | name | | | classification | | | unit_price | | | quantity | | | order_amount |
1 | | | 2014-05-15 | | | ウーロン茶 | | | 1 | | | 180 | | | 3 | | | 540 |
2 | | | 2014-05-15 | | | かっぱ巻き | | | 2 | | | 540 | | | 1 | | | 540 |
3 | | | 2015-09-09 | | | 刺し盛り | | | 2 | | | 780 | | | 1 | | | 780 |
4 | | | 2016-04-10 | | | 日本酒 | | | 3 | | | 680 | | | 1 | | | 680 |
5 | | | 2015-06-20 | | | ウーロン茶 | | | 1 | | | 180 | | | 3 | | | 540 |
6 | | | 2016-01-01 | | | ウーロン茶 | | | 1 | | | 180 | | | 2 | | | 360 |
7 | | | 2016-02-02 | | | 刺し盛り | | | 2 | | | 780 | | | 2 | | | 1560 |
この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によって日付でソートされています。
dating | | | name | | | quantity |
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文を書いてみてください。
今日はここまでです。
カヤでした!
ありがとうございました!