okinawa

IT勉強メモ

HAVING句をマスターすると集合志向が理解できるらしい

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という部分集合に対して検索をかけている。

或る行ではなく、或る集合を抽出したいときに使うイメージかな。

参考書籍