tawara's blog

雑記。個人の見解です。

group by と having を使ってみる

SQLの学習で、group by とhavingを学んだ。

こういうテーブルがあるとする。

mysql> select * from book;
+---------+-----------------------------------------------+--------------------------+-------+------------+------------+
| book_id | book_mei                                      | book_bunrui              | price | genkouryou | hatubaibi  |
+---------+-----------------------------------------------+--------------------------+-------+------------+------------+
| 001     | まっすぐもぐらドキュメンタリー                | ドキュメンタリー         |  2000 |       1000 | 2022-12-20 |
| 002     | 山辺のニーチェ                                | プログラミング           |  1500 |       1000 | 2022-12-11 |
| 003     | 1968                                          | ドキュメンタリー         |  3000 |       2500 | NULL       |
| 004     | 立って・座って・立って                        | 小説                     |  1500 |        500 | 2022-12-20 |
| 005     | 土の叫びを無視する                            | 小説                     |  3000 |       2000 | 2022-12-15 |
| 006     | ジョンとお月さま                              | 小説                     |  1500 |        800 | 2022-12-20 |
| 007     | 暗闇、広がってますか                          | 小説                     |  1200 |        800 | 2022-12-28 |
| 008     | ひとり・ジャーニー                            | プログラミング           |  1000 |        600 | 2022-12-11 |
+---------+-----------------------------------------------+--------------------------+-------+------------+------------+
8 rows in set (0.00 sec)

group by

参考書籍によれば、group byはテーブルをナイフで切るイメージとして理解するとよいみたい。分離されたテーブルの部分ごとに処理を走らせるイメージかな。

たとえば分類(book_bunrui)ごとに何冊の本があるかを知るには、次のようにクエリを書く。

mysql> select book_bunrui, count(book_bunrui) from book group by book_bunrui;

+--------------------------+--------------------+
| book_bunrui              | count(book_bunrui) |
+--------------------------+--------------------+
| ドキュメンタリー         |                  2 |
| プログラミング           |                  2 |
| 小説                     |                  4 |
+--------------------------+--------------------+
3 rows in set (0.01 sec)

having

having は、上記のような集約関数の結果に対して抽出条件を加えることができる。参考書籍によれば、where は行(レコード)に対して処理をして、having はグループに対して処理をする、と整理できる。

たとえば、上記結果から、2冊ある分類のみを抽出したいとする。 次のようなクエリを書くと望み通りの結果が得られる。なんかこう、追い打ちをかける、イメージをもった。

mysql> select book_bunrui, count(book_bunrui) from book group by book_bunrui having count(book_bunrui) = 2;
+--------------------------+--------------------+
| book_bunrui              | count(book_bunrui) |
+--------------------------+--------------------+
| ドキュメンタリー         |                  2 |
| プログラミング           |                  2 |
+--------------------------+--------------------+
2 rows in set (0.00 sec)

便利だー。

参考文献

(了)