みなさんこんにちは!
フリーランスプログラマーのsatoです。
今回は「GROUP BY」などと合わせて使用される「HAVING」について学んでみましょう。
- [基本]「HAVING」とは
- [基本]「HAVING」の使い方!
- [基本]「WHERE」と「HAVING」の違い
- [応用]集計関数と合わせて使ってみよう!
まず「HAVING」とはなんなのかを学び、続けて気になる「WHERE」との違いなど応用的な話を見ていきましょう。
「HAVING」とは
まず「HAVIING」を一言で説明すると、「抽出条件を指定」する命令です。実際使ってみれば一発でわかると思いますので、実例を見てみましょう。
今回使用するテーブル
その前に今回使用するテーブルについて見ておきましょう。今回はシンプルなテーブルを用意しています。今後はこのテーブルを使用して実例を見ていきましょうか。
userテーブル:
+--------+------------+ | name | team | +--------+------------+ | 山田 | チームA | | 鈴木 | チームA | | 加藤 | チームA | | 田中 | チームB | | 小林 | チームB | +--------+------------+
「HAVING」の使い方!
では実際に見ていきましょう。
例えば所属チーム(team)要素が「チームA」の人のみ抽出したい場合は以下のコマンドとなります。
SELECT * FROM user HAVING team="チームA";
+--------+------------+ | name | team | +--------+------------+ | 山田 | チームA | | 鈴木 | チームA | | 加藤 | チームA | +--------+------------+
うまく抽出されていますね!
このように「HAVING」の後ろに条件を書くことで使用できるわけです。
SELECT [表示したい要素] FROM [テーブル名] HAVING [抽出条件];
非常にシンプルに扱えることがわかっていただけたと思います。
「WHERE」と「HAVING」の違い
しかしここで一つの疑問点が生まれる人もいるでしょう。そう「WHERE」の存在です。
「WHERE」とは
一度でも使ったことがある人はご存知だと思いますが、「WHERE」も「HAING」と同じく「抽出条件を指定」するコマンドでのです。つまり、先ほどの処理は「WHERE」で書いても全く同じ結果が返ってくるんです。
SELECT * FROM user WHERE team="チームA";
+--------+------------+ | name | team | +--------+------------+ | 山田 | チームA | | 鈴木 | チームA | | 加藤 | チームA | +--------+------------+
ではこの二つの違いはなんでしょうか。
違いは呼ばれるタイミング!
見出しにも書いてありますが、違いはズバリ呼ばれるタイミングです。以下の画像は、SELECT文を使用した時の、命令の呼ばれる順番です。
今回の主役である「WHERE」と「HAVING」は画像の通り「WHERE」→「GROUP BY」→「HAVING」の順に呼ばれるわけです。つまり間にある「GROUP BY」が関わってこなければ、全く同じ挙動をしますが、
「GROUP BY」を使って、グループ化を行った際には、以下の違いが出てくるわけです。
HAVING・・・グループ化した後の情報での、抽出条件を指定できる。
この辺りの違いは「GROUP BY」を実際に行った例で理解が出来ると思います。「GROUP BY」の記事に詳細を載せていますので、実例を見て理解を深めてみてください。
まとめ
今回はHAVINGの使い方を見てきました。
処理の順番が違うだけで、基本的な挙動は「WHERE」と同じというわけです。ということはつまり「GROUP BY」を使用した特殊なことをやる場合に「HAVING」を活用しつつ。それ以外は基本的には「WHERE」を使用すれば良いということですね!