皆さん、こんにちわ!
SQLのSELECT文にある「GROUP BY」や「HAVING」はご存知でしょうか?
『SELECT文はわかるけど、GROUP BYの使い方がわからない…』
『HAVINGのの使い方もわからない…』
『使用条件や注意点は何だろう…』
こんな疑問に答えます。
SQL文のGROUP BY句の使い方
GROUP BY句はSELECT文の結果を集約して、集約した結果を集計したり平均や最大を取得する時に使います。
実際の使い方を、簡単な例を挙げて見ていきましょう。
GROUP BY 句の使用例
例えば、クラスという表に、こんなデータのがあるとします。
select * from クラス;
+-----------------+--------+--------+--------+--------+--------+ | 名前 | 性別 | 国語 | 数学 | 理科 | 社会 | +-----------------+--------+--------+--------+--------+--------+ | 青葉 一郎 | 男 | 85 | 36 | 42 | 58 | | 石野 真央 | 女 | 31 | 74 | 73 | 56 | | 真田 万吉 | 男 | 49 | 97 | 41 | 33 | | 田中 佐助 | 男 | 40 | 91 | 31 | 97 | | 月野 弥生 | 女 | 72 | 64 | 75 | 37 | | 玉井 治夫 | 男 | 83 | 49 | 65 | 98 | | 林田 啓二 | 男 | 94 | 82 | 50 | 50 | | 山田 花子 | 女 | 43 | 34 | 50 | 74 | +-----------------+--------+--------+--------+--------+--------+
男女それぞれの人数の合計を表示したかったら、こうすんねん。
select 性別, count(性別)
from クラス
GROUP BY 性別;
+--------+---------------+ | 性別 | count(性別) | +--------+---------------+ | 女 | 3 | | 男 | 5 | +--------+---------------+
※SQLの実行環境はMariaDB5.5(旧MySQL5.5)です
SQL文のGROUP BY句の使い方:集約関数アレコレ
GROUP BYは集計と思われガチですが…
正しくは集計ではなく、集約です。
もちろん集計することもできるけど、平均も出せるし最大・最小も出せます。
先ほどは、カウント関数を使用して人数をカウントしたけど…
集約すると出来るコトは、他にもメチャクチャあります。
集約関数は簡単な英語です。
Excel関数でも使われてるので、まず使用例から眺めていきましょう。
集約関数の使用例
集約関数を使ったSELECT文です。
SELECT 性別, Count(性別), Sum(国語), Avg(数学) , Max(理科) , Min(社会)
FROM クラス
GROUP BY 性別;
SELECT結果です。
+--------+---------------+-------------+--------------------+-------------+-------------+ | 性別 | Count(性別) | Sum(国語) | Avg(数学) | Max(理科) | Min(社会) | +--------+---------------+-------------+--------------------+-------------+-------------+ | 女 | 3 | 146 | 57.333333333333336 | 75 | 37 | | 男 | 5 | 351 | 71 | 65 | 33 | +--------+---------------+-------------+--------------------+-------------+-------------+
続いて、それぞれの集約関数について詳しく説明します。
SUM関数(集計を取得)
集約した項目毎の数値を合計を取得します。
数値じゃないとダメよ。
エクセルでもめっちゃ使うから、一番イメージは湧きやすいよね。
AVG関数(平均を取得)
集約した項目毎の数値の平均を取得します
MAX関数(最大を取得)
集約した項目毎の最大値を取得します
数値じゃなくてもOK!
MIN関数(最小を取得)
集約した項目毎の最小値を取得します
数値じゃなくてもOK
集計関数を使用すると小数点になる場合
さっきの集計関数の結果をもう1回見てみよか
SELECT 性別, Count(性別), Sum(国語), Avg(数学) , Max(理科) , Min(社会)
FROM クラス
GROUP BY 性別;
+--------+---------------+-------------+--------------------+-------------+-------------+ | 性別 | Count(性別) | Sum(国語) | Avg(数学) | Max(理科) | Min(社会) | +--------+---------------+-------------+--------------------+-------------+-------------+ | 女 | 3 | 146 | 57.333333333333336 | 75 | 37 | | 男 | 5 | 351 | 71 | 65 | 33 | +--------+---------------+-------------+--------------------+-------------+-------------+
【SELECT文:Round使用】
AVG関数の結果を、Roundで丸める⇒少数第1位を四捨五入して、整数にする
SELECT 性別, Count(性別), Round(Avg(数学))
FROM クラス
GROUP BY 性別;
+--------+---------------+----------------------+ | 性別 | Count(性別) | Round(Avg(数学),0) | +--------+---------------+----------------------+ | 女 | 3 | 57 | | 男 | 5 | 71 | +--------+---------------+----------------------+
Roundに引数を追加して、丸める少数部の位置を指定できる
↓少数部の位置を2に指定するとこんなん
SELECT 性別, Count(性別), Round(Avg(数学),2)
FROM クラス
GROUP BY 性別;
+--------+---------------+----------------------+ | 性別 | Count(性別) | Round(Avg(数学),2) | +--------+---------------+----------------------+ | 女 | 3 | 57.33 | | 男 | 5 | 71.00 | +--------+---------------+----------------------+
関数は他にもいっぱいあるから、また違う記事で解説したいと思います。
集約の条件が指定できるHAVING句
集約結果に対して、条件を指定したいときもあるよね。
そんな時、使用するのは「HAVING句」です。
あ、最後のbyはいらんよ。
「GROUP BY」の同じで「HAVING BY」と勢いで書いちゃう時があるから、ご注意を。
ほな、実際にやってみよっ!
SELECT 性別, Count(性別), Round(Avg(数学),2)
FROM クラス
GROUP BY 性別
HAVING 性別 = '男';
+--------+---------------+----------------------+ | 性別 | Count(性別) | Round(Avg(数学),2) | +--------+---------------+----------------------+ | 男 | 5 | 71.00 | +--------+---------------+----------------------+
GROUP BY句 の使用条件!よくある間違いなど
GROUP BY句はSELECT項目に集約していない(Group BYを指定していない)項目を使用することはできません。
この使用条件を知らずに、よく間違いを起こします。
具体的にはこんな感じです。
SELECT
性別, 数学
FROM クラス
GROUP BY 性別;
この場合、データベースではエラーを返します。
Oracleだったらこんなエラー
ORA-00979: GROUP BYの式ではありません。 00979. 00000 - "not a GROUP BY expression"
SE20年のオッサンでも、この間違いはやってしまいそうになります。注意してね!
~詳しくはこちら~
【解決】ORA-00979: GROUP BYの式ではありません。
「記事を読んでもわからないトコがある」「内容が変だよ」
という時は、お気軽にコメントください♪
「もっとSEおっさんに詳しく聞きたい。何かお願いしたい!」
という時は、ココナラまで。メッセージもお気軽に♪
LINEでのお問合わせも受付中!
LINE公式アカウント
メッセージをお待ちしています!
- 応用情報技術者
- Oracle Master Gold
- Java SE Gold
- Java EE Webコンポーネントディベロッパ
- Python エンジニア認定データ分析
- 簿記2級