1から始めるPythonデータ分析 - やりたいこと逆引きリスト ▶︎▶︎

【SQL】集計順序|書き順と実行順の違いとは

SQLの書き順と実行順

SQLでは人間の「記述する順番と、システムの「実行する順番が異なります…

どういうことか?

SQLは「SELECT」から始めることがほとんどですが、

一方で裏側のデータベースでは「FROM」から始まります

当たり前のことですが「書くのは人間」「実行するのは機械」だからです

人間は欲しいデータから書き始める「SELECT

機械はそもそも取ってくるテーブルから指定する「FROM

知らないとエラーが発生!?

書き順と実行順を知らないと人間と機械のミスマッチが起こります

例えば人間がSELECTで新しいカラム名を決めてGROUP BYに記述…

しかし、機械はGROUP BYが先に実行されてなので新しいカラム名が見つからない

のようなエラーが起きるケースがあります

人間の書き順

人間の書き順は皆さんがよく見るSQLと同じです

  1. SELECT(抽出するカラムを選択)
  2. FROM(どのテーブルから抽出するか)
  3. WHERE(条件を設定する)
  4. GROUP BY(まとめる)
  5. HAVING(まとめた後に条件を設定する)
  6. ORDER BY(順番を入れ替える)

※JOINやWITHは省いています

機械の実行順

見慣れた人間の実行順とは違い

機械の実行順は大きく異なります

当たり前のことですが、SQLで抽出する内容の中には、大量のデータがある

なのにいきなり「SELECT」で欲しいデータを選択してしまうと

広い海(データ)の中から、数粒の水滴(欲しい情報)を探すようなもの…

まずは「FROM」でテーブルを指定します

続いて「WHERE」で条件を設定し数を減らします

のように人間の書き順とは違いますね

  1. FROM(どのテーブルから抽出するか)
  2. WHERE(条件を設定する)
  3. GROUP BY(まとめる)
  4. HAVING(まとめた後に条件を設定する)
  5. SELECT(抽出するカラムを選択)←ここだけ違う
  6. 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
;
SQL結果

SELECT句で付けた列がWHEREで使えない理由

SELECT句で列名を抽出するときに、「AS 〇〇」と名前を付けることができます

しかしそれをWHERE句で利用すると、エラーが発生してしまいます…

その理由は「書き順と実行順」の違いにあります

システムでは「WHERE句」が「SELECT句」より先に実行されるため、

「SELECT句」で指定する「名前」は、後で登場することになります

  1. FROM
  2. WHERE 平均点 >= 80 ←先
  3. GROUP BY
  4. HAVING
  5. SELECT AVG(点数) AS 平均点 ←後
  6. ORDER BY
エラーが発生するSQL
SELECT
    クラス, AVG(点数) AS 平均点
FROM
    期末テストテーブル
WHERE
    平均点 >= 80
GROUP BY
    クラス

SELECT句で指定した列名を使いたい場合は、

実行順が「SELECT句」より後の「HAVING句」を使うか、

サブクエリで補いましょう

まとめ

今回はSQLにおける「書き順と実行順の違い」についてご紹介してきました

人間が書くSQLとシステムが実行するSQLでは異なります!

エラーが起こってしまう可能性があるので、注意してください

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です