【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ドライブ直下に配置した場合。
[sql]CREATE DATABASE worldcup2014;
USE worldcup2014;
Source C/worldcup2014.sql
[/sql]
- WHERE句とHAVING句を同時に使って平均ランキングが10以下のグループを抽出する。
以上、HAVING句の注意点についてでした。