SQL難易度 応用

次の 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 を計算する
正しい順番
  1. WHERE salary >= 300 で行を絞る
  2. GROUP BY dept で部署ごとにまとめる
  3. HAVING COUNT(*) >= 2 で部署を絞る
  4. SELECT で dept と total を計算する
  5. 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

clause-ordergroup-byhaving

この問題を含む SQL のテストを制限時間つきで解く

SQLクイズへ