次の SQL で、データベースが処理する順番に並べてください(FROM は最初に済んでいるとする)。
SELECT dept, SUM(salary) AS total FROM empWHERE salary >= 300 GROUP BY deptHAVING COUNT(*) >= 2 ORDER BY total DESC;正答
- WHERE salary >= 300 で行を絞る
- ORDER BY total DESC で並べる
- GROUP BY dept で部署ごとにまとめる
- HAVING COUNT(*) >= 2 で部署を絞る
- SELECT で dept と total を計算する
正しい順番
- WHERE salary >= 300 で行を絞る
- GROUP BY dept で部署ごとにまとめる
- HAVING COUNT(*) >= 2 で部署を絞る
- SELECT で dept と total を計算する
- ORDER BY total DESC で並べる
解説
論理的な評価順は FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY。WHERE は集約前の 1 行ずつに効くので最初に絞り、GROUP BY でまとめた後の部署単位の条件を HAVING で絞る。SELECT で付けた別名 total を ORDER BY で使えるのは、ORDER BY が SELECT より後に評価されるため。書いた順のとおり SELECT を先頭に置く並べ方は誤りで、そう考えると WHERE で別名が使えない理由も説明できない。
参考: www.sqlite.org
この問題を含む SQL のテストを制限時間つきで解く
SQLクイズへ