こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

なぜ、WHERE句とHAVING句があるのか?(質問文修正版)

なぜ、WHERE句とHAVING句があるのか?(質問文修正版)

SQLを学んでいる時に、疑問に思ったことがあります。
それは、「なぜ、WHERE句とHAVING句があるのか?」ということです。

この2つは、

・WHERE句 → 表から取り出す行の条件を指定
・HAVING句 → グループ化した結果から取り出す行の条件を指定

という違いがあることは分かっています。
ですが、おなじ「行のかたまりに対する抽出条件」を指定しているのに、
なぜ、わざわざ2つに分ける必要があったのでしょうか?
分けないと不都合が生じるのでしょうか。

もし、明瞭簡潔に説明できる方がいらっしゃいましたら、教えていただけないでしょうか。

※本質問は、質問内容に質問の主旨が変わってしまう大きな誤りがあったため、いったん締め切り後、再掲載させていただきました。

投稿日時 - 2010-10-19 22:09:14

QNo.6261726

困ってます

質問者が選んだベストアンサー

たとえば

select col,sum(col2)
from table1
having col3 = 10
group by col1
having sum(col2) > 10

こんなSQLを書くってことでしょうか?
自分的にはわかりずらいです・・

投稿日時 - 2010-10-20 09:11:34

お礼

ん~…。そうですか~。
言われてみれば、たしかに分かりづらいやも。
だからWHERE句とHAVING句を分けているのかな。
ありがとうございます。
私の求めていた答えが見つかりました。

投稿日時 - 2010-10-20 09:59:22

このQ&Aは役に立ちましたか?

2人が「このQ&Aが役に立った」と投票しています

回答(5)

ANo.4

分かりやすい違いとしてはHAVING句では集約関数が使えます。
下記の様な条件はWHERE句では書けません。

SELECT col_a, SUM(col_b) FROM tbl
GROUP BY col_a
HAVING SUM(col_b) > 3


HAVING句の使い方次第では歯抜けを調べたり、中央値を取得することもできます。
http://codezine.jp/article/detail/652

投稿日時 - 2010-10-20 00:01:52

補足

なるほど、具体的な機能の違いは分りました。
では、なぜSQLを作った昔の人は、HAVING句にWHERE句の機能を統合しなかったのでしょうか?

例えば、
(1)仮に、HAVING句にWHERE句の機能を統合したとします。
(2)機能統合により、HAVING句で「表」も「グループ」も関係なくの抽出条件を指定できるようになる。
(3)結果、SQLがシンプルになる。(抽出条件には何でもHAVING=条件とつければよくなるから)

「仮定の話をいくらしてもムダ。現にこういう規則なんだからそれに従え」という向きもあると思いますが、なぜ、機能統合して1つの句にしなかったのか。然るべき理由があるのか。
そこが、どうしても疑問です。

投稿日時 - 2010-10-20 00:53:01

お礼

丁寧な解説ありがとうございました。
今回の回答を糧にして、さらに学んでいきたいと思います。

投稿日時 - 2010-10-20 00:54:26

ANo.3

・WHERE句
単一のレコードで条件が確定するもの
例えば、顧客レコードに性別フィールドがあるとして、
「性別=男」というのは、別にグループ化して平均を
取ったり、合計しなくても判別できる条件ですね。
・HAVING句
集計した結果は条件になるもの
例えば、地域別個人情報があるとします。
「平均年齢>60」とは個別レコードを見ても判定
出来ない話で、特定の条件でグループ化して、始めて
そのグループが抽出条件になるか否かが判定できます。

このような違いがあります。
もっと具体的にはWHERE句が先に作用して抽出が行われ、
その後に集計されます。集計結果はHAVING句で判定され、
最終的にクエリの結果が出力されます。

投稿日時 - 2010-10-19 23:21:28

お礼

WHERE句が先に作用するというの件は存じ上げませんでした。
明瞭なご回答ありがとうございます。

投稿日時 - 2010-10-20 00:57:08

ANo.2

例を挙げます。

WHERE句→金額がプラスのものだけを抽出して集計する。

HAVING句→集計結果がプラスのものだけを抽出する。

投稿日時 - 2010-10-19 22:51:25

ANo.1

あなたの質問中に答えが書いてあると思うけど。

>・WHERE句 → 表から取り出す行の条件を指定
>・HAVING句 → グループ化した結果から取り出す行の条件を指定

表から取り出す行の条件を指定

グループ化した結果から取り出す行の条件を指定
明らかに違いがあるじゃないですか。
「取り出す条件」と「取り出してグループ化した結果から取り出す条件」は違いますよね。

投稿日時 - 2010-10-19 22:13:17

補足

そうなんですか?
どちらも、表もグループ化した結果も、結局のところ「行の固まり」であり、同じではないのですか?
確かに、説明文は違いますが、差異が分りません。

例えば、

SELECT 列名 FROM 表名 WHERE 条件;
SELECT 列名 FROM 表名 HAVING 条件;

は、一緒の動きですよね?
じゃあ、WHEREとHAVINGはどっちかに統一すればいいじゃん。両方無いと不都合あるの?
その具体的なケースはどのようなものがあるのだろう?
と、思い質問させていただきました。

投稿日時 - 2010-10-19 22:29:33

あなたにオススメの質問