😆
MySQL8.0でHAVING句を理解する
背景
応用情報の午後試験の過去問を解いているときに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