
「GROUP BY句」とは?
テーブルのデータを、商品分類ごとに価格を集計する等、カテゴリ分けします。
集約関数(COUNT、MAX等)と組み合わせることで、カテゴリ別に集計することができます。
「HAVING句」とは?
「GROUP BY句」でグループ化した結果に対する条件指定をする場合に使用します。
「WHERE句」はあくまで、行に対する条件指定のために使用するのであり、グループ化した結果に対する条件指定をするものではないので注意です。
「GROUP BY句」、「HAVING句」の記述ルール
構文
1 2 3 4 5 |
SELECT 列1,列2,列3 FROM テーブル名 WHERE 抽出条件 GROUP BY 列1,列2,列3 HAVING グループ化された結果に対する条件を指定する。 |
GROUP BY句は、必ずFROM句やWHERE句の後ろに置くこと。
WHERE句を使う場合
WHERE句で絞り込まれた条件に対して、GROUP BY句が実行されます。
「GROUP BY句」と「集約関数」を使った場合の注意点
- SELECT句に書けるものが限定される。
- GROUP BY句には、SELECT句でつけた別名は使えない。
- GROUP BY句は、集計結果のソートをしない。
- WHERE句に集約関数を書くことはできない。
SELECT句に書けるものが限定されます。
GROUP BYを使った場合は、SELECT句に書けるものは、下記の3つに限定されます。
- 定数
- 集約関数
- GROUP BY句で指定した列名(集約のキーとなる列)
要は、「集約キーに登場していない列は書くことができない」のです。
理由としては、グループ化されているということは、グループ化のキー項目で1意になっており、それ以外の項目は一つに特定できる内容かわからないためです。
GROUP BY句には、SELECT句でつけた別名は使えない。
GROUP BY句では、SELECT句で使った別名は使えません。
これは、SQLの評価順として、SELECT句よりも、GROUP BY句の方が先だからです。
SQLの句の評価順については、下記の記事でも解説しています。
GROUP BY句の集計結果のソート順はランダムになる。
GROUP BY句の集計結果のソート順はランダムです。
ソートさせるには、ORDER BY句でしっかりとソートさせるようにしましょう。
WHERE句に集計関数を指定できない。
集計関数を書くことができるのは、下記の三つです。
- SELECT句
- HAVING句
- ORDER BY句
「DISTINCTキーワード」と、「GROUP BY句」の比較
単純に「GROUP BY句」で、列をまとめるだけであれば「DISTINCTキーワード」と抽出結果は同じです。
また、実行速度もほぼ同じですが、「GROUP BY句」はあくまで「グループ分けをする」という目的の元に使用する構文であり、「重複を排除する」という目的とは少しずれるので、重複を排除する目的であれば、「GROUP BY句」ではなく、「DISTINCTキーワード」を使用するべきでしょう。
「HAVING句」に指定できる条件
下記の3つです。
- 定数
- 集約関数
- GROUP BY句で指定した列名
例えば、「HAVING COUNT(*) = 2」という条件指定であれば、「COUNT(*)」が集約関数であり、「2」が定数になります。
「WHERE句」と「HAVING句」の使い分け
また、例えば下記のようにGROUP BY句で指定した列名も抽出条件として指定することができます。
1 2 3 4 |
SELECT NAME FROM ITEM GROUP BY NAME HAVING NAME = '商品1' |
しかし、GROUP BY句に対する抽出条件を指定する場合は、WHERE句で指定するべきです。
理由としては、あくまでHAVING句は「抽出結果に対して、条件を指定するもの」であり、「集約キーに対する条件の指定」は、集約前のWHERE句での条件指定で補うことができるためです。
また、WHERE句の方が、HAVING句よりも、パフォーマンスが良いので、もしグループ化の列に対して条件を指定する場合は、WHERE句に指定するべきです。
この記事へのコメントはありません。