こんにちは、あおです\(^0^)/
先日2/10に誕生日を迎え、26歳になりました!!
しかし、祝っていただけて嬉しいという気持ちがだんだん消えかけてる今日この頃です…。
早寝早起きしちゃうし、トイレが近いし、腰痛くるし…。
身体はほんとじじいです( =.= )
最近は近所にある大型スーパーによく行くのですが…。
一人暮らしする前までは、買ってもジュースばっかりで(・・ : )
財布・携帯・ジュースは私の三大生活必需品(笑)。
特にミルクティーが大好きです(*’ω’*)
お菓子も食べるんですけど、買うほど食べたいって感じではないんですよね~。
どちらかといえば、つまみ系は好きで昆布やチーズなどを買います!
渋い食べ物が好きかもです…。
かといってお酒は買わないしあまり飲まないです( : 。)z-z
味覚はきっとおこちゃまです…。
甘いジュースが好きな割には、甘い食べ物はあまり食べないので…。
自分でもよくわからない部分があったりします(;’∀’)
ただ一人暮らししてからというと
まずはお店のポイントカードを作って…
毎日チラシを見て…
週ごとに何を食べようか考えて…
何をどのくらい買おうか考えて…
賞味期限を気にして…
家に何が残っているかを思い出して…
仕事帰り、両手で大きな荷物を抱えて帰宅するという…
自称主婦(笑)。
親がどれだけ大変だったかを実感している今日この頃です(-_- ; )
雑談はここまで!本日の研修内容を書いていきます。
◆本日の内容
今日もSQLの課題を進めています。前回のブログでお伝えした通り、今日は「グループ化」について記載します。
次回のブログでは「副問い合わせ」を記載したいと思います。
今日は主に以下の内容を学習いたしました
・グループ化
・副問い合わせ
◆所感
グループ化…。グループ化をするとすごく便利に値を抽出することができます。
例えば、とある会社の社員名簿テーブルがあるとします。名前や年齢はもちろんですが、
支店コードや出身地、誕生日や血液型、部署コードなど様々な情報の値をもっています。
そのなかで「血液型をグループ化して、何人いるか表示したい」なんてことが簡単にできます。
他にも「支店コードが○○である、社員の数を部署コードごとに表示したい」なんてこともできます。
~とある会社の作業記録~
SELECT * FROM test.accesslog; INSERT INTO test.accesslog VALUE ("2016-08-01",1,"渡辺",1), ("2016-08-01",null,"渡辺",1), ("2016-08-02",1,"田中",3), ("2016-08-02",null,"田中",3), ("2016-08-03",1,"鈴木",3), ("2016-08-03",1,"関口",3), ("2016-08-04",1,"吉田",3), ("2016-08-04",1,"菊池",2), ("2016-08-05",1,"田中",1); /* 日付ごとの入出回数を取得 */ SELECT dating,SUM(entry_exit) as "入出回数" FROM accesslog GROUP BY dating; /* 社員ごとの入出回数(多い順) */ SELECT SUM(entry_exit) as "入出回数",name as "名前" FROM accesslog GROUP BY name ORDER BY entry_exit desc; /* 事由区分ごとの入出回数 */ SELECT SUM(entry_exit), CASE WHEN classification = 1 THEN "メンテナンス" WHEN classification = 2 THEN "リリース作業" WHEN classification = 3 THEN "障害対応" ELSE "その他" END AS "名前" FROM accesslog GROUP BY classification; /* 入室が2回以上の社員で社員名と入出回数 */ SELECT name as "名前",COUNT(entry_exit) as "入出回数" FROM accesslog GROUP BY name HAVING COUNT(entry_exit) >= 2; /* 障害発生日時と対応した人数 */ SELECT dating as "障害発生日時",count(entry_exit) as "対応人数" FROM accesslog GROUP BY dating;
グループ化と言葉でいうと、何も知らない人でもイメージがつくと思いますがSQLではGROUP BYを用います。
例えば15行目の”日付ごとの入出回数を取得”では、まず日付一覧の表示とその入出回数の合計を
SUM関数を用いて計算しています。今回はカラム に”入出回数”という名前をつけて表示しています。
今回の場合、以下のような出力になります。
dating | 入出回数
—————————————————————
2016-08-01 | 1
2016-08-02 | 1
2016-08-03 | 2
2016-08-04 | 2
2016-08-05 | 1
また、23行目の”社員ごとの入出回数(多い順)”では15行目とそんな変わらず、求めたい値がどういったもので、
どの値を表示したいかが変わるだけで、15行目とほぼほぼ記載することは同じです。
ここで一番注目してほしいのは、ORDER BY です。以前習ったのを今回のように複合して使用することもあるので、
一度習ったことは復習し、応用できるようになりたいと思います。今回の場合、以下のような出力になります。
入出回数 | 名前
—————————————————————
2 | 田中
1 | 鈴木
1 | 関口
1 | 吉田
1 | 菊池
1 | 渡辺
また、33行目の”事由区分ごとの入出回数”ではCASE式にて名前をつけ、その名前ごとにグループ化をしています。
事由区分は数字で表記されていて、パッと見では何の作業か判断しづらい状態です。そのため、事由区分名を
表示するようにしています。 今回の場合、以下のような出力になります。
SUM(entry_exit)| 名前
—————————————————————
2 | メンテナンス
4 | 障害対応
1 | リリース作業
また、58行目の”入室が2回以上の社員で社員名と入出回数”ではとても大事なことを学びました。
それはHAVINGとWHEREの違いについてです。HAVINGとは GROUP BY の後に記述し、条件を付け加えて
値を抽出するときにつかいます。そもそも条件抽出するときに使っていたのはお馴染みのWHEREです。
「WHEREがあるなら全部WHEREを使えばいいのでは?」と思いました。ただWHEREとHAVINGには
とても大きな違いがありました。それは“いつ実行されるのか”です。
WHEREはGROUP BYより先に実行されます。逆にHAVINGはGROUP BYより後に実行されます。
要は条件を指定する際に「グループ化する前のデータ」を指定するのか、「グループ化した後のデータ」を
指定するのかで使い分けています。
そしてWHEREは”集計関数(SUMやAVG、COUNTなど)を利用できない”がHAVINGは集計関数を
利用できます。そのため、集計関数を利用するときはHAVINGを用います。
今回COUNTでレコードの数(入出回数)を計算した後、条件として2回以上を指定しています。
そのため、WHEREではなくHAVINGを使っています。今回の場合、以下のような出力になります。
名前 | 入出回数
——————————————————
田中 | 2
◆一言
グループ化自体はイメージしやすくそんなに難しくはないが、WHEREとHAVINGの使いわける理由は
今後SQLを理解していくうえでかなり重要な部分であると思いました。いつ実行されるかによって
結果が大きく変わったり、実行できなかったりするのでこの辺りもしっかり詰めていきたいと思います。
次回は「副問い合わせ」について記載したいと思っております。
では皆さん、次回のブログまでさようなら(*’ω’*)