【SQL】HAVING句の使い方を1分でわかりやすく解説

Database

SQLで利用するHAVING句について構文ルールと使い方、注意点などをわかりやすく解説します。

HAVING句を利用するとGROUP BY句によってグループ化されたレコードに対して取得条件を指定することできます。

SELECT HAVING
HAVING句のイメージ

このページではHAVING句の使い方/構文ルールを初心者向けに解説します。

このページで学べる内容
  • HAVING句の使い方・構文ルール
    • 【復習】GROUP BY句
  • HAVING句のTips/注意点
    • AS句を利用した場合

プログラマーやシステムエンジニアを目指す方であれば知らないと恥ずかしい超・基本知識です。是非最後までご覧ください。

スポンサーリンク

HAVING句の使い方・構文ルール

SELECT    (カラム名),(カラム名), ・・・・
  FROM    (テーブル名)
 WHERE    (レコード取得条件)
 GROUP BY (カラム名),(カラム名), ・・・・
HAVING    (グループの値に対する条件);

HAVING句はGROUP BY句の後ろに記述します。

HAVING句を利用する際のSELECT文の記述順序

  • ①:SELECT
  • ②:FROM
  • ③:WHERE
  • ④:GROUP BY
  • ⑤:HAVING

早速以下のようなテーブルに対してHAVING句を利用したSQL文を見てみましょう。

SELECT FM, SUM(Japanese)
  FROM PointList
 GROUP BY FM
HAVING SUM(Japanese) = 180;

/* 実行結果
  +----------+-----------+
  | FM       | SUM       |
  +----------+-----------+
  | 男       | 180       |
*/

HAVING句では「SUM(Japanese) = 180」と指定しているため、結果は1行だけになります。

SELECT HAVING

仮にHAVING句を利用せずに同じようなSQL文を実行すると以下のように、すべての結果が表示されます。

SELECT FM, SUM(Japanese)
  FROM PointList
 GROUP BY FM;

/* 実行結果
  +----------+-----------+
  | FM       | SUM       |
  +----------+-----------+
  | 男       | 180       |←先ほどのサンプルコードではこちらの行だけが表示されていた
  | 女       | 320       |
  | NULL     | 110       |
*/

関連記事:【SQL】SUM関数(SELECT SUM)を1分でわかりやすく解説

GROUP BY句

GROUP BY句はテーブルをいくつかのグループに分ける働きをします。指定したカラムの値ごとの合計値や平均値、最大値・最小値を取得したいような場合に利用します。

SQL GROUP BY
GROUP BY句のイメージ

HAVING句の完全な理解までには、GROUP BY句への基本的な理解がないとかなり難しいです。GROUP BY句の基本をもう1度学習したい!という方は以下の記事をご確認ください。

HAVING句の注意点

HAVING句の基本は以上。一度わかってしまえば決して難しくはありません。

ここからはHAVING句を利用したいくつかのサンプルコードを見ながら、HAVING句に関する細かなTipsや注意点について解説します。

HAVING句:AS句との併用

HAVING句ではAS句で付与された別名を条件式の中で利用することができます。

SELECT FM, SUM(Japanese) AS Summary
  FROM PointList
 GROUP BY FM
HAVING Summary >= 300;

/* 実行結果
  +----------+-----------+
  | FM       | SUM       |
  +----------+-----------+
  | 女       | 320       |
*/

4行目のHAVING句では、1行目のAS句で付与された「Summary」という別名が用いられていることが確認できます。

COUNT関数を組み合わせて実行したSQL文がこちら。

SELECT FM, COUNT(Japanese) AS Count
  FROM PointList
 GROUP BY FM
HAVING Count > 2 ;

/* 実行結果
  +----------+-----------+
  | FM       | COUNT     |
  +----------+-----------+
  | 男       | 3         |
  | 女       | 5         |
*/

HAVING句:WHERE句との併用

続いてHAVING句とWHERE句を同時に記述した場合です。

HAVING句とWHERE句を同時に利用する場合は、①WHERE句で指定した条件を満たすデータの抽出&グループ化 ⇒②HAVING句で指定したグループ化されたデータに対する条件の適用 の順番で処理が行われます。

SELECT FM, COUNT(Japanese) AS Count50
  FROM PointList
 WHERE Japanese >= 50
 GROUP BY FM
HAVING Count50 > 0;

/* 実行結果
  +----------+-----------+
  | FM       | COUNT     |
  +----------+-----------+
  | 男       | 2         |
  | 女       | 3         |
*/

つまり、WHERE句ではJapanaeseカラムが「50以上」という条件を指定しているので上記の黄色ハイライト部分が抜き出され、その後でグループ化が行われるということです。

HAVING句の条件を変えた結果も併せてみてみると理解が深まるかもしれません。↓

SELECT FM, COUNT(Japanese) AS Count50
  FROM PointList
 WHERE Japanese >= 50
 GROUP BY FM
HAVING Count50 > 2;

/* 実行結果
  +----------+-----------+
  | FM       | COUNT     |
  +----------+-----------+
  | 女       | 3         |
*/
HAVING句のまとめ
  • HAVING句はGROUP BY句によってグループ化されたレコードに対する取得条件を指定する
  • HAVING句ではAS句で付与された別名を条件式の中で利用することが可能
  • HAVING句とWHERE句を同時に利用する場合の実行順序
    • ①WHERE句で指定した条件を満たすデータの抽出&グループ化
    • ②HAVING句で指定したグループ化されたデータに対する条件の適用
SELECT FM, COUNT(Japanese) AS Count50
  FROM PointList
 WHERE Japanese >= 50
 GROUP BY FM
HAVING Count50 > 2;

/* 実行結果
  +----------+-----------+
  | FM       | COUNT     |
  +----------+-----------+
  | 女       | 3         |
*/

システムエンジニアを目指したい方は

システムエンジニアを目指す方や、IT知識を1から身につけたい方は以下のページをご覧ください。

正直どこから学び始めればよいかわからない。どのように勉強していけば、エンジニアとしてのスキルが磨けるか?が分からない・・・という方は必見です。

システムエンジニア向けに「できるエンジニア」になる方法を1から解説しておりますので、是非ご覧ください。

タイトルとURLをコピーしました