【ぐるーぷばい】

GROUP BY とは?

💡 データを「グループに分けて」集計するためのSQL句
📌 このページのポイント
GROUP BY:グループごとに集計 売上テーブル 商品 金額 りんご 100 みかん 80 りんご 150 みかん 60 りんご 120 GROUP BY 商品 集計結果 商品 SUM(金額) りんご 370 みかん 140 SELECT 商品, SUM(金額) FROM 売上 GROUP BY 商品;
GROUP BYのイメージ
ひよこ ひよこ

GROUP BYってどういうときに使うの?

ペンギン先生 ペンギン先生

「カテゴリごとの商品数」「部署ごとの平均給与」「月ごとの売上合計」みたいに、何かの単位で集計したいときに使う。「SELECT category, COUNT(*) FROM products GROUP BY category」とすればカテゴリごとの商品数が出る。

ひよこ ひよこ

WHEREとHAVINGって何が違うの?

ペンギン先生 ペンギン先生

WHEREは「グループ化する前」に行を絞る条件、HAVINGは「グループ化した後」にグループを絞る条件。例えば「価格1000円以上の商品だけを対象に(WHERE)、カテゴリごとに集計して、10件以上あるカテゴリだけ表示(HAVING)」という2段階の絞り込みができる。

ひよこ ひよこ

GROUP BYに複数のカラムを指定できるの?

ペンギン先生 ペンギン先生

できるよ。「GROUP BY category, year」とすれば「カテゴリ×年」の組み合わせごとに集計される。2軸でのクロス集計みたいなイメージ。

ひよこ ひよこ

GROUP BYで遅くなることってある?

ペンギン先生 ペンギン先生

大量データのGROUP BYは結構負荷が高い。データベースは内部的にソートやハッシュテーブルを使ってグループ化するから、メモリが足りないとディスクに書き出して激遅になる。特に「GROUP BYのカラムインデックスがない」「HAVING句で複雑な条件を書く」「GROUP BY後のソートが加わる」といった状況が重なるとつらい。実行計画で「Using temporary; Using filesort」と出たらちょっと注意した方がいいよ。

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
GROUP BYって出てきたら「指定カラムの値ごとにレコードをまとめてグループ単位で集計する」と思えばだいたいOK!
📖 おまけ:英語の意味
「GROUP BY」 = 〜でグループにする
💬 「GROUP(グループにする)」+「BY(〜によって)」で、指定カラムでグループ分けするという意味
← 用語集にもどる