SQLの複数の行をまとめるサンプルです。
集約関数とgroup by句とhaving句を使用します。
目次
集約関数
集約関数は、複数の行をまとめて1つの列の平均や合計などの計算結果を返します。
| 集約関数 | 説明 |
|---|---|
| AVG() | 平均を返す |
| SUM() | 合計を返す |
| MAX() | 最大値を返す |
| MIN() | 最小値を返す |
| COUNT() | 個数を返す |
テストデータ
次のテーブルがあるとします。
| id | category | name | price |
|---|---|---|---|
| 1 | 魚 | まぐろ | 500 |
| 2 | 野菜 | 白菜 | 200 |
| 3 | 魚 | あじ | 200 |
| 4 | 野菜 | 大根 | 100 |
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 |
複数の行が1行になり集約関数の値が表示されます。
複数の行をグループごとにまとめる(group by)
| select 項目 from テーブル名 group by 項目 |
- group by句を使用すると、複数の行をグループごとにまとめることができます。
テストデータ
次のテーブルがあるとします。
| id | category | name | price |
|---|---|---|---|
| 1 | 魚 | まぐろ | 500 |
| 2 | 野菜 | 白菜 | 200 |
| 3 | 魚 | あじ | 200 |
| 4 | 野菜 | 大根 | 100 |
SQL文
上記テーブルに対してgroup by句を使用してデータを抽出します。
SELECT category,AVG(price)
FROM `syouhin`
group by category;
3行目は、group by句を指定しています。
結果
結果は、以下のとおりです。
| category | AVG(price) |
|---|---|
| 野菜 | 150.0000 |
| 魚 | 350.0000 |
group by句で指定した項目「category」の値でまとめられた行が表示されます。
また、その行ごとに集約関数の値が表示されます。
複数の行をグループごとにまとめ、集約関数の値に条件を指定する(having)
| select 項目 from テーブル名 group by 項目 having 条件 |
- having句を使用すると、複数の行をグループごとにまとめた列の集約関数の値に条件を指定できます。
テストデータ
次のテーブルがあるとします。
| id | category | name | price |
|---|---|---|---|
| 1 | 魚 | まぐろ | 500 |
| 2 | 野菜 | 白菜 | 200 |
| 3 | 魚 | あじ | 200 |
| 4 | 野菜 | 大根 | 100 |
SQL文
上記テーブルに対してhaving句を使用してデータを抽出します。
SELECT category,AVG(price)
FROM `syouhin`
group by category
having AVG(price) > 200;
4行目は、having句を指定しています。
結果
結果は、以下のとおりです。
| category | AVG(price) |
|---|---|
| 野菜 | 150.0000 |
| 魚 | 350.0000 |
まずgroup by句で指定した項目「category」の単位でまとめらます。
| category | AVG(price) |
|---|---|
| 魚 | 350.0000 |
次に、AVG(price)の列に対してhaving句で指定した条件(200より大きい)を満たす行が表示されます。
where句を使用した場合
以下のように、where句で、集約関数(AVG)の結果を条件にすることはできません。
SELECT category,AVG(price)
FROM `syouhin`
where AVG(price) > 200
group by category;
MySQLでは、以下のメッセージが表示されます。
#1111 - 集計関数の使用方法が不正です。
集約関数の結果を条件にする場合は、having句を使用します。
where句を使用できるパターン
ただし、集約関数の結果以外を条件にする場合は、group byとwhereを使用できます。
SELECT category,AVG(price)
FROM `syouhin`
where name = '白菜'
group by category;
この場合は、件数を絞れるwhereを使用した方が良いです。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とUNION ALLのサンプル