SQL文で集約したものに条件を付けたい場合があると思います。
そんな時はHAVING句が使用できます。
条件を付けたい場合だとWHERE関数を思いつくと思いますが、WHERE句はレコード単体に対してのみしか条件を付ける事ができません。
集約関数を使用する平均値が〇〇、合計値が〇〇といった条件はWHEREではできません。
そこででてくるのがHAVING句です。
windowsのプロンプトで使用できるbatやpythonやphpを使用して、業務効率化やWebサイトを作成しております。javaやシェルスクリプトなど、様々なプログラミングを行った実績ありの筆者です。
HAVING句の使い方を学んで行きましょう!
SQLでhavingの使い方を学ぶ。countなどを使用する

SQLでHaving句を使用する時の基礎構文
SQLでHaving句の基本構文は以下となります。
SELECT 集約関数 FROM テーブル名 GROUP BY カラム名 HAVING 集約関数;
集約関数を使用できるのは以下の3つです。
- SELECT句
- HAVING句
- ORDER BY句
WHEREで集約関数は使用できないのでHaving句を使用します!
SQLでHAVING句を使用する時の注意点
- 位置はGROUP BY句の後
- Having句で使用できるものに制限あり
一つ目の注意点として位置でHAVING関数が使用できるのはGROUP BY句の後ろになります。
二つ目の注意点はHaving関数で使用できる要素が限られています。
- 定数
- 集約関数
- GROUP BY句で指定したカラム
SQLでhavingとCountを使ってみる

では実際にSQLでHaving句を使用して実施してみます
以下のテーブルがあったとします。

それぞれのチームの人数が4人のチームを表示させてみます。
下のSQL文を実行します。
SELECT `チーム名`,COUNT(*) '人数' FROM `点数` GROUP BY `チーム名` HAVING COUNT(*) = 4;
SQL文解説:havingとCount
SELECT文で表示するカラムで「チーム名」と集約関数COUNTを指定し、わかりやすいようにカラム名を「人数」にします。
FROMでテーブル名を指定します。
GROUP BY句でグルーピングするカラム「チーム名」を指定します。
Having句で人数の合計が4を指定します。
ここでHaving句を使用する時の注意点を思い出してください。
GROUP BY句の後ろに記述しています。またHaving句で集約関数を使用しているので注意点はクリアしている事が分かると思います。
SQL文実施:havingとCount
実行結果は以下となります。

チームの合計人数が4のチームが表示されています!
SQLでhavingとSumを使ってみる

今度はチームごとの合計値が1500以上のチーム名と合計値を表示してみます。
下のSQL文を実行してみます。
SELECT `チーム名`,SUM(`点数`) FROM `点数` GROUP BY `チーム名` HAVING SUM(`点数`) > 1500;
SQL文解説:havingとSum
SELECT文で表示するカラムでチーム名と集約関数SUMを指定します。
FROMでテーブル名を指定します。
GROUP BY句でグルーピングするカラム「チーム名」を指定します。
Having句で条件の点数の合計が1500以上を指定します。
ここでHaving句を使用する時の注意点を思い出してください。
GROUP BY句の後ろに記述しています。またHaving句で集約関数を使用しているので注意点はクリアしている事が分かると思います。
SQL文実施:havingとSum
では上記のSQL文を実行してみます。

チーム名でグルーピングしてその合計値が表示されて1500以上のものが表示されています。
SQLでhavingを使用してエラーが出る場合

では以下のSQL構文を実行してみます。
SELECT `チーム名`,SUM(`点数`) FROM `点数` GROUP BY `チーム名` HAVING `点数` > 250;
Having句で「点数」カラムを条件にしていますが、GROUP BY句で使用されていないのでエラーが出てしまいます。
#1054 - 列 '点数' は 'having clause' にはありません。
Having句で使用する時の注意点に気を付けながら使用してください。
SQLでhavingの使い方を学ぶ。countなどを使用するのまとめ

SQLでHaving句の基本構文は以下となります。
SELECT 集約関数 FROM テーブル名 GROUP BY カラム名 HAVING 集約関数;
SQLでHaving句を使う時の注意点は以下となります。
- 位置はGROUP BY句の後
- Having句で使用できるものに制限あり
Having句で使用できるものは以下となります。
- 定数
- 集約関数
- GROUP BY句で指定したカラム
レコード単体に条件を付けたい場合はWHEREですが集約したものは指定できません。集約関数やグルーピングしたものに条件を付けたいときは、Having句を使用して見て下さい。