【SQL】SELECT文の文法は評価順序を暗記しておけば楽に理解できる


はじめに

基本情報技術者試験の午後問題、ORACLE MASTER Bronze 12c SQL基礎、Silver DBA 2019、Silver SQL 2019、といった試験ではSQLの文法に関する問題が数多く出題されます。

FROM句、WHERE句、GROUP BY句、HAVING句では列別名を使用できない1ORDER BY句では列別名を使用できるWHERE句やFROM句では集約関数を使用できないORDER BY句では一部の集約関数を使用できる etc...

といったSELECT文の細かい文法規則を覚えるの、面倒ですよね。
実は上記の文法規則は全て、SELECT文が評価される順序を覚えるだけで暗記が不要になります。

SELECT文の評価順序

実際に見ていきましょう。

  1. FROM
  2. WHERE
  3. GROUP BY
  4. HAVING
  5. SELECT
  6. ORDER BY

一見複雑ですが、特に着目すべきはSELECT句の評価順です。
手続き型プログラミング言語等に慣れていると、初めに書かれるSELECT句が最初に評価されると誤解しがちですが、実際にSELECT句が評価されるのは終盤です。列別名を定義するのはSELECT句であるため、それ以前に評価される構文内では列別名が使用できません。これが(Oracle DBにおいて)FROM 句~HAVING句で列別名が使用できない理由です。
また、WHERE句が実行されるのはGROUP BY句より先なので、WHERE句ではSUMといった集約関数を使うことはできないことがわかります。

その他にも、SELECT句で指定した列の全てをGROUP BY句で指定するルールや、WHEREHAVINGのどちらがパフォーマンスが良いか? といった疑問にも、評価順序の観点から考えることができます。
前者のルールは実際には逆2で、「GROUP BY句で集約していない列をSELECT句で指定できない」というのが正しいです。集約結果に存在していない列を参照できるわけがないので当然ですね。
また後者のケースではGROUP BYで集約される前に条件分けができる、WHERE句のほうがHAVING句と比べてパフォーマンスが良いことがわかります。

このように、評価順序を覚えておくだけで多くの文法事項について説明できることがわかります。あとはGROUP BY句とHAVING句の構文(評価順序ではない)が順不同である、というような例外的な事項を抑えておけばよいでしょう。

まとめ

SELECT句の評価順序を覚えておくことで、その場で考えるだけで様々な文法規則を導き出せます。試験では評価順について直接は聞かれないはずですが、コストパフォーマンスの良い学習なので覚えておいて損はないでしょう。


  1. Oracle Database 19cの場合。Oracle以外のDBMSには、FROM句やGROUP BY句で列別名を使用できるものも存在します。実装依存の事項であるため、情報処理技術者試験では問われません。 

  2. 論理学的には逆というより対偶でしょうか。