アプリ版:「スタンプのみでお礼する」機能のリリースについて

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

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

この2つは、

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

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

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

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

A 回答 (5件)

たとえば



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

こんなSQLを書くってことでしょうか?
自分的にはわかりずらいです・・
    • good
    • 0
この回答へのお礼

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

お礼日時:2010/10/20 09:59

分かりやすい違いとしては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

この回答への補足

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

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

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

補足日時:2010/10/20 00:53
    • good
    • 0
この回答へのお礼

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

お礼日時:2010/10/20 00:54

・WHERE句


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

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

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

お礼日時:2010/10/20 00:57

例を挙げます。



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

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

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



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

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

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

この回答への補足

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

例えば、

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

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

補足日時:2010/10/19 22:29
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!