【SQL】SELECT文の文法は評価順序を暗記しておけば楽に理解できる
はじめに
基本情報技術者試験の午後問題、ORACLE MASTER Bronze 12c SQL基礎、Silver DBA 2019、Silver SQL 2019、といった試験ではSQLの文法に関する問題が数多く出題されます。
FROM
句、WHERE
句、GROUP BY
句、HAVING
句では列別名を使用できない1、ORDER BY
句では列別名を使用できる、WHERE
句やFROM
句では集約関数を使用できない、ORDER BY
句では一部の集約関数を使用できる etc...
といったSELECT文の細かい文法規則を覚えるの、面倒ですよね。
実は上記の文法規則は全て、SELECT
文が評価される順序を覚えるだけで暗記が不要になります。
SELECT文の評価順序
実際に見ていきましょう。
FROM
WHERE
GROUP BY
HAVING
- SELECT
ORDER BY
一見複雑ですが、特に着目すべきはSELECT
句の評価順です。
手続き型プログラミング言語等に慣れていると、初めに書かれるSELECT
句が最初に評価されると誤解しがちですが、実際にSELECT句が評価されるのは終盤です。列別名を定義するのはSELECT
句であるため、それ以前に評価される構文内では列別名が使用できません。これが(Oracle DBにおいて)FROM
句~HAVING
句で列別名が使用できない理由です。
また、WHERE
句が実行されるのはGROUP BY
句より先なので、WHERE
句ではSUM
といった集約関数を使うことはできないことがわかります。
その他にも、SELECT
句で指定した列の全てをGROUP BY
句で指定するルールや、WHERE
とHAVING
のどちらがパフォーマンスが良いか? といった疑問にも、評価順序の観点から考えることができます。
前者のルールは実際には逆2で、「GROUP BY
句で集約していない列をSELECT
句で指定できない」というのが正しいです。集約結果に存在していない列を参照できるわけがないので当然ですね。
また後者のケースではGROUP BY
で集約される前に条件分けができる、WHERE
句のほうがHAVING
句と比べてパフォーマンスが良いことがわかります。
このように、評価順序を覚えておくだけで多くの文法事項について説明できることがわかります。あとはGROUP BY
句とHAVING
句の構文(評価順序ではない)が順不同である、というような例外的な事項を抑えておけばよいでしょう。
まとめ
SELECT
句の評価順序を覚えておくことで、その場で考えるだけで様々な文法規則を導き出せます。試験では評価順について直接は聞かれないはずですが、コストパフォーマンスの良い学習なので覚えておいて損はないでしょう。
Author And Source
この問題について(【SQL】SELECT文の文法は評価順序を暗記しておけば楽に理解できる), 我々は、より多くの情報をここで見つけました https://qiita.com/arucarap/items/0f8af6c2cb55e1fdaf92著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .