SQL 複数の行をまとめるサンプル(group byとhaving)

SQLの複数の行をまとめるサンプルです。
集約関数とgroup by句とhaving句を使用します。

目次

集約関数

  • 集約関数は、複数の行をまとめて1つの列の平均や合計などの計算結果を返します。
主な集約関数
集約関数 説明
AVG() 平均を返す
SUM() 合計を返す
MAX() 最大値を返す
MIN() 最小値を返す
COUNT() 個数を返す

サンプル

集約関数のサンプルです。
以下の1のテーブルに対して、2のSQLを実行します。

1.テーブル

syouhin
id category name price
1 まぐろ 500
2 野菜 白菜 200
3 あじ 200
4 野菜 大根 100

2.SQL

SELECT SUM(price),AVG(price),MAX(price),MIN(price),COUNT(price) 
FROM `syouhin`;

結果は以下のとおりです。
複数の行が1行になり集約関数の値が表示されます。

SUM(price) AVG(price) MAX(price) MIN(price) COUNT(price)
1000 250.0000 500 100 4

 

複数の行をグループごとにまとめる

group by
  • group by句を使用すると、複数の行をグループごとにまとめることができます。

サンプル

group by句のサンプルです。
以下の1のテーブルに対して、2のSQLを実行します。

1.テーブル

syouhin
id category name price
1 まぐろ 500
2 野菜 白菜 200
3 あじ 200
4 野菜 大根 100

2.SQL

SELECT category,AVG(price) 
FROM `syouhin` 
group by category;

結果は以下のとおりです。
group by句で指定した項目のcategoryごとに行が表示され、それぞれの行ごとの集約関数の値が表示されます。

syouhin
category AVG(price)
野菜 150.0000
350.0000

 

複数の行をグループごとにまとめ、集約関数の値に条件を指定する

having
  • having句を使用すると、複数の行をグループごとにまとめた列の項目の集約関数の値に条件を指定することができます。

サンプル

having句のサンプルです。
以下の1のテーブルに対して、2のSQLを実行します。

1.テーブル

syouhin
id category name price
1 まぐろ 500
2 野菜 白菜 200
3 あじ 200
4 野菜 大根 100

2.SQL

SELECT category,AVG(price) 
FROM `syouhin` 
group by category 
having AVG(price) > 200;

結果は以下のとおりです。
group by句で指定した項目のcategoryごとに行のAVG(price)に対して
having句で指定した条件を満たす行が表示されます。

syouhin
category AVG(price)
350.0000

where句を使用した場合

以下のように、集約関数(AVG)の結果をwhere句で条件にすることはできません。

SELECT category,AVG(price) 
FROM `syouhin` 
where AVG(price) > 200
group by category;

MySQLでは、以下のメッセージが表示されます。
#1111 - 集計関数の使用方法が不正です。

集約関数の結果を条件にする場合は、having句を使用します。

 

リンク

以下は、MySQLのGROUP BY 修飾子のリンクです。
https://dev.mysql.com/doc/refman/5.6/ja/group-by-modifiers.html

関連の記事

SQL INSERT文のサンプル
SQL UPDATE文とDELETE文のサンプル
SQL 重複行を表示しないサンプル(distinct)
SQL 外部結合のサンプル(left outer join/right outer join)
SQL 副問合せのサンプル(サブクエリ)
SQL 自己結合とは
SQL 内部結合とは (inner join)
SQL UNIONとは

プログラムでつまったらteratailに登録して質問しましょう!↓↓↓

△上に戻る