既に紹介したように、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句を使う方が効率的です。
|
|
|