Developer

【SQL基礎】GROUP BY句の基本構文~HAVING句の注意点~
2021.01.28
Lv1

【SQL基礎】GROUP BY句の基本構文~HAVING句の注意点~

HAVING句での絞り込みでグループ化した結果に条件を指定する方法について説明しましたが、

HAVING句の指定を行う際に注意しなければならない点があるので、本項ではそれを説明していきます。

 

WHERE句とHAVING句の違い


データを抽出する際に条件を指定して絞り込むという点ではWHERE句とHAVING句は似ていますが、

条件を絞り込む対象とタイミングがそれぞれ異なります。

 

WHERE句の場合はSELECT句に対する絞り込み条件を設定する際に使用され、

WHERE句の検索条件はグループ化前に適用されます。

一方HAVING句はGROUP BY句に対する絞り込み条件を設定する際に使用され、

HAVING句の検索条件はグループ化後に適用されます。

 

WHERE句とHAVING句を同時に記述した場合は、まずWHERE句で設定した条件に該当するデータを対象にグループ化されます。そしてグループ化されたデータに対してHAVING句で設定した条件を満たすデータだけが抽出されます。

 

違いをまとめると以下のようになります。

GROUP BY句でグループ化される前にデータを抽出するのがWHERE句

GROUP BY句でグループ化された後にデータを抽出するのがHAVING句

 

WHERE句とHAVING句をまとめて記述する場合の順番


WHERE句とHAVING句を同時に記述する際の順番は以下の通りです。

SELECT 取得したいカラム名

FROM 対象とするテーブル名

WHERE 取得したいレコードの条件

GROUP BY グループ化したいカラム名

HAVING 取得したいグループの条件 ;

 

WHERE句とHAVING句を同時に記述した場合


それではWHERE句とHAVING句を同時に記述した際の動作を確認してみましょう。

今回は以下のテーブル(テーブル名teachers)を使用します。

1
2
3
SELECT *
 
FROM teachers ;

まず年齢が25歳以上だけを対象にグループ化を行い、グループごとに平均年齢が30以上のデータだけを取得してみます。

1
2
3
4
5
6
7
8
9
SELECT class , AVG(age)
 
FROM teachers
 
WHERE age >= 25
 
GROUP BY class
 
HAVING AVG(age) >= 30 ;

内部的な処理の違い


データを集計する場合、データベース内部ではソートが行われています。

ソートとはデータを一定の基準に従って並べることですが、行の並べ替えを行うという処理は負荷がかかります。

WHERE句で条件を指定した場合は、ソートの前に行が絞り込まれます。

一方HAVING句で条件を指定した場合は、ソートが完了してグループ化された後に行が絞り込まれます。

レコード数やインデックスにもよりますが、WHERE句は条件を絞り込んでからソートを行うため、ソートする行数が少なくて済むのでHAVING句よりも処理速度が早くなります。

そのためWHERE句で書ける処理であるなら、SQLのパフォーマンス的にWHERE句を用いたほうが良いでしょう。

 

今回の学習ポイント


・HAVING句はGROUP BY句に対する絞り込み条件を設定する際に使用される。

・WHERE句とHAVING句を同時に記述してより細かい検索条件を設定することができる。

 

練習問題

問題として使用するデータは「SQL練習問題」のものを使用しています。

以下からダウンロード可能です。

以下のようにしてworldcup2014データベースを作成し、インポートしてください。

※worldcup2014.zip解凍してできるworldcup2014.sqlファイルをCドライブ直下に配置した場合。

worldcup2014.sql

[sql]

CREATE DATABASE worldcup2014;

USE worldcup2014;

Source C/worldcup2014.sql

[/sql]

 

  1. WHERE句とHAVING句を同時に使って平均ランキングが10以下のグループを抽出する。
答え
[sql]

SELECT group_name , AVG(ranking)

FROM countries

WHERE ranking <= 20

GROUP BY group_name

HAVING AVG(ranking) <= 10 ;

[/sql]

 

以上、HAVING句の注意点についてでした。

 

 

連載目次リンク

SQL基礎 連載目次

関連する連載リンク

SQL練習問題 一覧まとめ