データベース千夜一夜第20回

データの集計(2)~グループ化とレコードの絞り込み 長谷川裕行
有限会社 手國堂

HAVING句とWHERE句

既に紹介したように、WHERE句を使っても条件を指定してレコードを絞り込めます。HAVING句との違いを知っておきましょう。


- WHERE句で絞り込む -

HAVING句はGROUP BY句の後ろに記述しましたが、WHERE句はGROUP BY句の前(FROM句の直後)に記述します。記述位置を間違えると正しいSQLとは見なされないので、注意しましょう。

 SELECT 商品名, 金額 ,性別
 FROM 累積売上_fx
 WHERE 性別='女'

 GROUP BY 商品名, 金額, 性別

実行結果は先のHAVING句を用いたものとまったく同じです。



- 両者の違いに注意 -

HAVING句とWHERE句、どちらを使っても同じ結果が得られました。どこが異なるのか、両者の違いを知っておきましょう。

HAVING句はGROUP BY句と共に用いますが、WHERE句にはそういった制限はありません。それぞれの記述位置も異なっています。このことが、2つの抽出命令の違いを明確にしています。

両者の違いは『条件判定の対象』です。

 WHERE句:レコード
 HAVING句:グループ

WHERE句による条件の判定は、GROUP BY句によるグループ化より先に行われます。つまり、

1.WHERE句でレコードを絞り込む
2.絞り込まれた結果に対してGROUP BY句でグループ化する

という順序です。

一方HAVING句による条件の判定は、GROUP BY句によるグループ化の後で行われます。

1.GROUP BY句で全レコードをグループ化する
2.グループ化された結果に対してHAVING句でレコードを絞り込む


- 単純なグループ化にはWHERE句を使う -

グループ化の処理は、条件の判定以上に時間ががかります。そのため、全レコードをグループ化してからHAVING句でレコードを絞り込むより、先にWHERE句で必要なレコードだけに絞り込んでおいてからグループ化した方が、処理は速くなります。

行を絞り込んで集計する処理をWHERE句で代替できるのであれば、HAVING句の使用は控えたほうがよいでしょう。HAVING句で抽出しなければならないケースは、『抽出条件で指定するフィールドの値がグループ化によって生成される』場合です。

次節で例を示しますが、集計関数を使って金額の合計などを算出した後、そのフィールドを抽出条件とする場合、WHERE句で抽出する段階(グループ化の前)では対象となるフィールドが確定されません。

一般的な集計では数値計算を伴うのが普通ですから、GROUP BY句とHAVING句はよくペアで使われます。しかし、ここまでの例で扱ってきたような単純なグループ化では、WHERE句を使う方が効率的です。



トップページ
サンプルのテーブルを確認する
複数フィールドでグループ化する
レコードを絞り込んでグループ化する
HAVING句とWHERE句
WHERE句で絞り込む
両者の違いに注意
単純なグループ化にはWHERE句を使う
さらに詳細な集計処理へ
あとがき
Copyright © MESCIUS inc. All rights reserved.