データベース

【超簡単】SQL文のGROUP BY句とHAVING句の使い方!

  • このエントリーをはてなブックマークに追加
  • LINEで送る

皆さん、こんにちわ!

SQLのSELECT文にある「GROUP BY」や「HAVING」はご存知でしょうか?

 

『SELECT文はわかるけど、GROUP BYの使い方がわからない…』

『HAVINGのの使い方もわからない…』

『使用条件や注意点は何だろう…』

このような疑問に答えます。


SEおっさん
SEおっさん
SE歴20年のオッサンが詳しく解説するぞい!

※保有資格:OracleMasterGold/JavaWebコンポーネントディベロッパ/応用情報技術者/簿記2級

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 |
+--------+---------------+
SEおっさん
SEおっさん
どうやろか? イメージ湧いた??

※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          |
+--------+---------------+-------------+--------------------+-------------+-------------+

 

SEおっさん
SEおっさん
イメージはわかるかのぅ?

続いて、それぞれの集約関数について詳しく説明します。

SUM関数(集計を取得)

集約した項目毎の数値を合計を取得します。

数値じゃないとダメよ。

エクセルでもめっちゃ使うから、一番イメージは湧きやすいよね。

AVG関数(平均を取得)

集約した項目毎の数値の平均を取得します

MAX関数(最大を取得)

集約した項目毎の最大値を取得します

数値じゃなくてもOK!

MIN関数(最小を取得)

集約した項目毎の最小値を取得します

数値じゃなくてもOK

集計関数を使用すると小数点になる場合

さっきの集計関数の結果をもう1回見てみよか

+--------+---------------+-------------+--------------------+-------------+-------------+
| 性別   | Count(性別)   | Sum(国語)   | Avg(数学)          | Max(理科)   | Min(社会)   |
+--------+---------------+-------------+--------------------+-------------+-------------+
| 女     |             3 |         146 | 57.333333333333336 | 75          | 37          |
| 男     |             5 |         351 |                 71 | 65          | 33          |
+--------+---------------+-------------+--------------------+-------------+-------------+

 

たろちゃん
たろちゃん
数学の平均の小数点が気持ち悪いナ
SEおっさん
SEおっさん
そんな時は、ROUND関数で丸めるねん

【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 |
+--------+---------------+----------------------+
SEおっさん
SEおっさん
な、ちゃんと条件指定できてますやろ。

GROUP BY句 の使用条件!よくある間違いなど

GROUP BY句はSELECT項目に集約していない(Group BYを指定していない)項目を使用することはできません。

この使用条件を知らずに、よく間違いを起こします。

具体的にはこんな感じです。

SELECT
    性別, 数学
FROM クラス
GROUP BY 性別;

この場合、データベースではエラーを返します。

Oracleだったらこんなエラー

ORA-00979: GROUP BYの式ではありません。
00979. 00000 -  "not a GROUP BY expression"
SEおっさん
SEおっさん
SE20年のオッサンでも、この間違いはやってしまいそうになります。
注意してね!

詳しくはこちらにまとめました。

【解決】ORA-00979: GROUP BYの式ではありません。
【解決】ORA-00979: GROUP BYの式ではありません。
Oracleで”GROUP BY”の使い方を間違うと… 「ORA-00979: GROUP BYの式ではありません」 というエラーが発生.....

 



スポンサーリンク
  • このエントリーをはてなブックマークに追加
  • LINEで送る

コメントを残す

*