😆

MySQL8.0でHAVING句を理解する

2022/01/15に公開

背景

応用情報の午後試験の過去問を解いているときにHAVING句が出題されていました.初歩的な構文ですが,直ぐに思い出せなかったので改めて復習したときのメモです.忘れるので小さな事でも,どんどんメモしていきます.
ミックさんのSQL 第2版 ゼロからはじめるデータベース操作 Kindle版の3章を再度読み直しました.
MySQL環境はサクッとこちらに作りました.

準備

HAVING句を使う前に雑にテーブルとレコードを作っておきます.最近Netflixを見まくっているので,videoを題材にしました.

create database having_app;
use having_app
create table video(
    id int not null primary key AUTO_INCREMENT,
    genre varchar(40) not null,
    name varchar(40) not null
);

show columns from video;
+-------+-------------+------+-----+---------+----------------+
| Field | Type        | Null | Key | Default | Extra          |
+-------+-------------+------+-----+---------+----------------+
| id    | int         | NO   | PRI | NULL    | auto_increment |
| genre | varchar(40) | NO   |     | NULL    |                |
| name  | varchar(40) | NO   |     | NULL    |                |
+-------+-------------+------+-----+---------+----------------+
insert into video(genre, name) values
("anime", "kingdom"),
("anime", "conan"),
("drama", "ikagame"),
("movie", "spider man");

select * from video;
+----+-------+------------+
| id | genre | name       |
+----+-------+------------+
|  1 | anime | kingdom    |
|  2 | anime | conan      |
|  3 | drama | ikagame    |
|  4 | movie | spider man |
+----+-------+------------+

HAVING句

HAVING句は「グループに対する条件」 を指定します.WHERE句も似ていますが,こちらは「行に対する条件」を指定します.
HAVING句の記述する場所はGROUP BY句の後ろです.

group byを使ってgenreで集約した場合

select genre, count(*)
from video
group by genre;
+-------+----------+
| genre | count(*) |
+-------+----------+
| anime |        2 |
| drama |        1 |
| movie |        1 |
+-------+----------+

group byを使ってgenreで集約したグループから,数が2のレコードを取り出す場合

select genre, count(*)
from video
group by genre
having count(*)=2;
+-------+----------+
| genre | count(*) |
+-------+----------+
| anime |        2 |
+-------+----------+
株式会社ゆめみ

Discussion