【ぐるーぷばい】

GROUP BY とは?

最終更新:
💡 データを「グループに分けて」集計するためのSQL句

SQLでレコードを指定したカラムの値ごとにグループ化し、集約関数と組み合わせてグループごとの集計を行う句。

📌 このページのポイント
GROUP BY:商品ごとに売上を合計 売上テーブル 集計結果 商品 金額 りんご 100 みかん 80 りんご 150 みかん 60 りんご 120 商品 合計 りんご 370 みかん 140 100+150+120 80+60 SELECT 商品, SUM(金額) FROM 売上 GROUP BY 商品; 元の行を集計し、結果は1商品につき1行 並び順を決めるときは ORDER BY
5行の売上を集計した例です。元の表は書き換えません。結果の表示順が必要ならORDER BYを指定します。
ひよこ ひよこ
GROUP BYってどういうときに使うの?
ペンギン先生 ペンギン先生
カテゴリごとの商品数や部署ごとの平均給与など、何かの単位で集計したいときだよ。SELECT category, COUNT(*) FROM products GROUP BY category とすれば、カテゴリごとの行数を数えられる。元の表を書き換える命令ではないよ。
ひよこ ひよこ
WHEREとHAVINGはどう違うの?
ペンギン先生 ペンギン先生
WHEREは集計前の行、HAVINGは集計後のグループを絞る条件だよ。価格1000円以上の商品だけをWHEREで選び、カテゴリ別に数え、その件数が10以上のカテゴリをHAVING COUNT(*) >= 10で残す、と使い分けられるね。
ひよこ ひよこ
複数のカラムでも分けられる?
ペンギン先生 ペンギン先生
GROUP BY category, year なら、カテゴリと年の組み合わせが同じ行ごとにまとめるよ。結果の並び順まで決まるわけではないので、順番が必要ならORDER BYを指定するんだ。
ひよこ ひよこ
SELECTに好きな列を追加していい?
ペンギン先生 ペンギン先生
同じグループの中で値が複数ある列は、そのままではどれを表示するか決まらないよ。基本はグループのキーか集約した値を選ぶ。PostgreSQLでは主キーをGROUP BYに指定すると、その主キーで決まる同じ表の列を選べる場合もある。使うDBの規則を確認しよう。
ひよこ ひよこ
大量のデータだと遅くなる?
ペンギン先生 ペンギン先生
処理する行数やインデックス、クエリ、DBの実装などで変わるよ。MySQLでは条件によってインデックスを使い、一時テーブルを避けられる場合もある。実行計画と実測を見て判断し、GROUP BYがあるだけで必ず遅いとは考えないでね。
ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「GROUP BY」って出てきたら「指定カラムの値ごとにレコードをまとめてグループ単位で集計する」と思えばだいたいOK!
📖 おまけ:英語の意味
「GROUP BY」 = 〜でグループにする
💬 「GROUP(グループにする)」+「BY(〜によって)」で、指定カラムでグループ分けするという意味

参考資料

← 用語集にもどる