Developer

【SQL基礎】GROUP BY句の基本構文~HAVING句での絞り込み~
2021.01.28
Lv1

【SQL基礎】GROUP BY句の基本構文~HAVING句での絞り込み~

—–

GROUP BY句の基本構文では、データをグループ化する方法について触れました。

本項では、「HAVING句」を使ってさらに条件を指定して、結果を絞り込む方法について説明していきます。

—–

HAVING句とは

HAVING句はGROUP BY句によってグループ化されたデータに対して条件を指定してデータを絞り込む場合に使用します。

HAVING句の条件式に記述できるのはグループ化に指定したカラム名や関数を使ってグループ単一で集計した結果だけとなります。

HAVING句については以下の図を参考にして動作をイメージしてください。

 

①データベースの中から取得したいテーブルを取り出す。

例えば、データベースの中に以下のようなstoreテーブルがあるとしましょう。

図ではstoreテーブルに格納されているデータ全体が表示されています。

②データのグループ化

テーブル全体のデータが表示されていると、確認したいデータを見つけるのに手間がかかってしまいます。

そのような場合に、データをグループ化してあげると、指定したデータのみ表示してくれるので確認したいデータをすぐに確認できます。

例えばstoreテーブルで場所とメニューごとにグループ化すると、それだけが表示されます。

③条件と一致するグループを取り出す。

②でグループ化したデータに対して条件を指定することで、さらにデータを絞り込むことができます。

例えば1000円以上するメニューのみ表示させたとすると、これだけ見やすくなるのです。

—–

HAVING句の基本構文

HAVING句の基本構文は以下の通りです。

SELECT 取得したいカラム名

FROM 対象とするテーブル名

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

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

 

HAVING句はGROUP BY句の後に記述する必要があるので注意してください。

また、HAVING句には取得したいデータの条件として、集約関数を条件に含めることができます。

—–

グループ化した結果に対して条件を指定して絞り込む

HAVING句を使ってグループ化した結果に条件を指定します。

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


SELECT *

FROM store

HAVING句を使って価格の平均が1000円以下のメニューだけを抽出します。


SELECT place , avg(value)

FROM store

GROUP BY place

HAVING avg(value) <= 1000 ;

HAVING句の中でAVG関数を使い各メニューの中から平均価格が1000円以下のものを抽出しました。

他の関数も使用できるので順番に確認していきましょう。

 

・MAX関数

各メニューごとにグループ化を行った上で、MAX関数を使い一番高い価格を表示します。


SELECT menu , MAX(value)

FROM store

GROUP BY menu

HAVING MAX(value) ;

・MIN関数

各メニューごとにグループ化を行った上で、MIN関数を使い一番低い価格を表示します。


SELECT menu , MIN(value)

FROM store

GROUP BY menu

HAVING MIN(value) ;

・SUM関数

各メニューごとにグループ化を行った上で、SUM関数を使い価格の合計を表示します。


SELECT menu,

SUM(value)

FROM store

GROUP BY menu

HAVING SUM(value) ;

—–

今回の学習ポイント

・グループ化されたデータに対してさらに条件を指定して結果を絞り込む場合はHAVING句を使用する。

・HAVING句はGROUP BYの後に記述する必要がある。

・取得したいグループの条件として集約関数をHAVING句の条件に含めることができる。

練習問題

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

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

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

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

worldcup2014.sql

[sql]

CREATE DATABASE worldcup2014;

USE worldcup2014;

Source C/worldcup2014.sql

[/sql]

 

  1. 各グループのランキングの平均を算出する。
答え
[sql]

SELECT group_name , AVG(ranking)

FROM countries

GROUP BY group_name

HAVING AVG(ranking) ;

[/sql]

 

  1. 全選手の中から身長が195㎝以上の選手を抽出する。
答え
[sql]

SELECT name , MAX(height)

FROM players

GROUP BY name

HAVING MAX(height) >= 195 ;

[/sql]

 

以上、HAVING句での絞り込みについてでした。

 

 

連載目次リンク

SQL基礎 連載目次

関連する連載リンク

SQL練習問題 一覧まとめ