- MySQL
- 2024-06-06
MySQLではGROUP BYを使ってレコードをグループ化し、カラムの合計や最小値・最大値などを集計することができます。
集計した値をWHERE句の抽出条件指定に使用することはできません。
そんなときはHAVING句を使用します。
まずはサンプルのテーブルを用意しましょう。
CREATE TABLE `students` ( `id` int(8) NOT NULL AUTO_INCREMENT, `name` varchar(30) NOT NULL, `class` int(4) NOT NULL, `score` int(4) NOT NULL, PRIMARY KEY (`id`) );
サンプルデータを登録します。
INSERT INTO `students` VALUES (DEFAULT, '赤井', 1, 168), (DEFAULT, '井田', 2, 133), (DEFAULT, '宇野', 3, 167), (DEFAULT, '江崎', 1, 185), (DEFAULT, '奥本', 2, 142), (DEFAULT, '加藤', 3, 176), (DEFAULT, '菊池', 1, 159), (DEFAULT, '久保', 2, 181), (DEFAULT, '剣持', 3, 155);
classでグループ化し、scoreの合計を抽出してみましょう。
SELECT class, SUM(score) AS sum_score FROM `students` GROUP BY class;
結果は次のようになります。
+-------+-----------+ | class | sum_score | +-------+-----------+ | 1 | 512 | | 2 | 456 | | 3 | 498 | +-------+-----------+
試しにWHERE句を使ってみましょう。
SELECT class, SUM(score) AS sum_score FROM `students` WHERE sum_score > 500 GROUP BY class;
すると
ERROR 1054 (42S22): Unknown column 'sum_score' in 'where clause'
このようにエラーとなります。
それではHAVING句を使ってみましょう。
SELECT class, SUM(score) AS sum_score FROM `students` GROUP BY class HAVING sum_score > 500;
すると結果は次のようになります。
+-------+-----------+ | class | sum_score | +-------+-----------+ | 1 | 512 | +-------+-----------+
HAVING句による条件指定で絞り込みができています。
WHERE句はグループ化で集計される前、HAVING句はグループ化で集計された後のデータに対して条件を指定し絞り込むことができます。
156 views