
なぜ、WHERE句とHAVING句があるのか?(質問文修正版)
SQLを学んでいる時に、疑問に思ったことがあります。
それは、「なぜ、WHERE句とHAVING句があるのか?」ということです。
この2つは、
・WHERE句 → 表から取り出す行の条件を指定
・HAVING句 → グループ化した結果から取り出す行の条件を指定
という違いがあることは分かっています。
ですが、おなじ「行のかたまりに対する抽出条件」を指定しているのに、
なぜ、わざわざ2つに分ける必要があったのでしょうか?
分けないと不都合が生じるのでしょうか。
もし、明瞭簡潔に説明できる方がいらっしゃいましたら、教えていただけないでしょうか。
※本質問は、質問内容に質問の主旨が変わってしまう大きな誤りがあったため、いったん締め切り後、再掲載させていただきました。
No.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
この回答への補足
なるほど、具体的な機能の違いは分りました。
では、なぜSQLを作った昔の人は、HAVING句にWHERE句の機能を統合しなかったのでしょうか?
例えば、
(1)仮に、HAVING句にWHERE句の機能を統合したとします。
(2)機能統合により、HAVING句で「表」も「グループ」も関係なくの抽出条件を指定できるようになる。
(3)結果、SQLがシンプルになる。(抽出条件には何でもHAVING=条件とつければよくなるから)
「仮定の話をいくらしてもムダ。現にこういう規則なんだからそれに従え」という向きもあると思いますが、なぜ、機能統合して1つの句にしなかったのか。然るべき理由があるのか。
そこが、どうしても疑問です。
No.3
- 回答日時:
・WHERE句
単一のレコードで条件が確定するもの
例えば、顧客レコードに性別フィールドがあるとして、
「性別=男」というのは、別にグループ化して平均を
取ったり、合計しなくても判別できる条件ですね。
・HAVING句
集計した結果は条件になるもの
例えば、地域別個人情報があるとします。
「平均年齢>60」とは個別レコードを見ても判定
出来ない話で、特定の条件でグループ化して、始めて
そのグループが抽出条件になるか否かが判定できます。
このような違いがあります。
もっと具体的にはWHERE句が先に作用して抽出が行われ、
その後に集計されます。集計結果はHAVING句で判定され、
最終的にクエリの結果が出力されます。
No.1
- 回答日時:
あなたの質問中に答えが書いてあると思うけど。
>・WHERE句 → 表から取り出す行の条件を指定
>・HAVING句 → グループ化した結果から取り出す行の条件を指定
表から取り出す行の条件を指定
と
グループ化した結果から取り出す行の条件を指定
明らかに違いがあるじゃないですか。
「取り出す条件」と「取り出してグループ化した結果から取り出す条件」は違いますよね。
この回答への補足
そうなんですか?
どちらも、表もグループ化した結果も、結局のところ「行の固まり」であり、同じではないのですか?
確かに、説明文は違いますが、差異が分りません。
例えば、
SELECT 列名 FROM 表名 WHERE 条件;
SELECT 列名 FROM 表名 HAVING 条件;
は、一緒の動きですよね?
じゃあ、WHEREとHAVINGはどっちかに統一すればいいじゃん。両方無いと不都合あるの?
その具体的なケースはどのようなものがあるのだろう?
と、思い質問させていただきました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Access(アクセス) アクセス where句を使用して複数条件抽出をするには 2 2022/08/29 13:24
- その他(悩み相談・人生相談) 信用と裏はどちらも必要なのに矛盾してますよね。 信用信頼は常日頃の行いから積み重ね手に入れる物だと思 2 2022/08/14 00:36
- 英語 「this is the/my first time~」の文法上の制約について 1 2023/04/06 09:48
- その他(悩み相談・人生相談) Yahoo!知恵袋の「不適切な情報」の基準について 9 2022/04/13 01:25
- MySQL 書籍の内容はまともでしょうか? 1 2023/01/22 03:07
- Oracle 質問です。 下記のテーブルとデータがあり、 取得想定結果のように出力したいです。 下記のsqlだと0 2 2023/05/23 19:10
- 統計学 こんな問題を使って教育するのは、文科省の方針ですか。 3 2022/06/17 09:14
- その他(教育・科学・学問) 某大学のコンプライアンス室に通報しても規程を無視して「不受理」という回答しかしない場合の対応策 2 2022/04/19 23:56
- Visual Basic(VBA) 【前回の続きです、ご教示ください】VBAの記述方法がわかりません。 2 2022/08/16 16:44
- JavaScript 変数宣言と初期値代入の場所について 3 2022/10/31 19:09
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
pear MDB2からレコードを配列で...
-
【PL/SQL】FROM区に変数を使う方法
-
データ
-
単一グループのグループ関数で...
-
トリガからプロシージャのコー...
-
トランザクションログを出力せ...
-
BLOB型項目をSQLの検索条件に指...
-
一部のレコードをバックアップ...
-
SQLで条件にヒットしたレコード...
-
updateで複数行更新したい
-
あるカラムに同じ値を持つレコ...
-
AccessのSQL文で1件のみヒット...
-
int型フィールドにnullを登録で...
-
日本語で、likeを使うと値が正...
-
varcharでの最大値抽出
-
最初のレコードを取得したい
-
テーブルの最後(最新)のレコー...
-
SQLローダーCSV取込で、囲み文...
-
UPDATEのCASE文で・・
-
update実行時の、追加情報の取...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
単一グループのグループ関数で...
-
group byの並び順を変えるだけ...
-
where句中のtrim関数について
-
【PL/SQL】FROM区に変数を使う方法
-
トランザクションログを出力せ...
-
SELECT FOR UPDATE で該当レコ...
-
引数によってwhere句を切り替え...
-
データ
-
SQL*Loader Append
-
AccessのSQL文で1件のみヒット...
-
updateで複数行更新したい
-
アクセスのレポートでレコード...
-
「数字で始まらない」ものを抽...
-
SQLで条件にヒットしたレコード...
-
デフォルトでデータが表示され...
-
osqleditについて
-
PL/SQL内の共通関数の引数にフ...
-
1レコード全てを改行なしで表...
-
トリガからプロシージャのコー...
-
BLOB型項目をSQLの検索条件に指...
おすすめ情報