こんにちは、r.matsumotoです。
私は最近SQLを学習中なのですが、
そこで少し誤解していたところがあったので今回はそれについて紹介してみたいと思います。
会社名ごとに年齢30歳以上の社員の数を出すSQLを書くという問題があり、私は最初このように書いていました。
1 2 3 4 5 |
select cmp.name count(emp.id) from comp as cmp left join employee as emp on cmp.id = emp.comp_id group by cmp.name having emp.old >= 30 |
実行結果は正しかったのですが、答えのSQLとは書き方が違っていて色々と調べていくうちにhavingの意味について理解することができました。
havingの使い方
私は最初select句に集計関数があったらhavingを使うというような曖昧な認識でhavingを使っていたのですが、
どうやら違うらしく、havingは集計関数の集計結果についての条件を書くようで上の文だと一回会社名ごとの人数を集計した後havingで30歳以上の社員を絞り込んでいるようです。
ですが、この条件自体は集計する前にwhere句で書いても同じなので
1 2 3 4 5 |
select cmp.name count(emp.id) from comp as cmp left join employee as emp on cmp.id = emp.comp_id where emp.old >= 30 group by cmp.name |
このように書くのが正しいようですね。