目次
SQLの書き順と実行順
SQLでは人間の「記述する順番」と、システムの「実行する順番」が異なります…
どういうことか?
SQLは「SELECT」から始めることがほとんどですが、
一方で裏側のデータベースでは「FROM」から始まります
当たり前のことですが「書くのは人間」「実行するのは機械」だからです
人間は欲しいデータから書き始める「SELECT」
機械はそもそも取ってくるテーブルから指定する「FROM」
書き順と実行順を知らないと人間と機械のミスマッチが起こります
例えば人間がSELECTで新しいカラム名を決めてGROUP BYに記述…
しかし、機械はGROUP BYが先に実行されてなので新しいカラム名が見つからない
のようなエラーが起きるケースがあります
人間の書き順
人間の書き順は皆さんがよく見るSQLと同じです
- SELECT(抽出するカラムを選択)
- FROM(どのテーブルから抽出するか)
- WHERE(条件を設定する)
- GROUP BY(まとめる)
- HAVING(まとめた後に条件を設定する)
- ORDER BY(順番を入れ替える)
※JOINやWITHは省いています
機械の実行順
見慣れた人間の実行順とは違い
機械の実行順は大きく異なります
当たり前のことですが、SQLで抽出する内容の中には、大量のデータがある
なのにいきなり「SELECT」で欲しいデータを選択してしまうと
広い海(データ)の中から、数粒の水滴(欲しい情報)を探すようなもの…
まずは「FROM」でテーブルを指定します
続いて「WHERE」で条件を設定し数を減らします
のように人間の書き順とは違いますね
- FROM(どのテーブルから抽出するか)
- WHERE(条件を設定する)
- GROUP BY(まとめる)
- HAVING(まとめた後に条件を設定する)
- SELECT(抽出するカラムを選択)←ここだけ違う
- ORDER BY(順番を入れ替える)
よく見ると「SELECT」の位置が違うだけですね
実際のSQLを見てみましょう
こちらは【機械側】の実行順序です
「期末テストテーブルから(FROM)、野球部・サッカー部・バスケ部だけの(WHERE)試験の平均点をクラスごと(GROUP BY)に算出し、80点以上のクラス(HAVING)を抽出する(SELECT)。また平均点の高いクラス順に並び替えて(ORDER BY)結果を出す」SQLを記述する
SELECT
クラス, AVG(点数) AS 平均点
FROM
期末テストテーブル
WHERE
部活 IN (野球・サッカー・バスケットボール)
GROUP BY
クラス
HAVING
平均点 >= 80
ORDER BY
平均点 DESC
;
SELECT句で付けた列がWHEREで使えない理由
SELECT句で列名を抽出するときに、「AS 〇〇」と名前を付けることができます
しかしそれをWHERE句で利用すると、エラーが発生してしまいます…
その理由は「書き順と実行順」の違いにあります
システムでは「WHERE句」が「SELECT句」より先に実行されるため、
「SELECT句」で指定する「名前」は、後で登場することになります
- FROM
- WHERE 平均点 >= 80 ←先
- GROUP BY
- HAVING
- SELECT AVG(点数) AS 平均点 ←後
- ORDER BY
SELECT
クラス, AVG(点数) AS 平均点
FROM
期末テストテーブル
WHERE
平均点 >= 80
GROUP BY
クラス
SELECT句で指定した列名を使いたい場合は、
実行順が「SELECT句」より後の「HAVING句」を使うか、
サブクエリで補いましょう
まとめ
今回はSQLにおける「書き順と実行順の違い」についてご紹介してきました
人間が書くSQLとシステムが実行するSQLでは異なります!
エラーが起こってしまう可能性があるので、注意してください