WHEREとHAVINGで対比するとわかりやすい
- WHERE:1行の特徴を調べる
- HAVING:集合の特徴を調べる
例:下記テーブルから算数80点以上&国語80点以上の生徒を調べたい
答えはstudentId 100 200。
WHERE
・WHERE句で何も考えずに条件を指定する
SELECT * FROM testscore where subject = '算数' and subject = '国語' and score >= 80;
算数&国語の両方を持つ行はもちろん存在しないので結果はなし。
whereだと各行に対して検索をかける。
HAVING
・HAVING句で特性関数を使って抽出
select studentid from testscore group by studentid having sum(case when subject = '算数' and score >= 80 then 1 when subject = '国語' and score >= 80 then 1 else 0 end) = 2
studentid 100 200 300は算数国語を持っている。
havingは集合に対して検索をかけるイメージ。
今回の場合はstudentidという部分集合に対して検索をかけている。
或る行ではなく、或る集合を抽出したいときに使うイメージかな。