ORDER BY句で別名が使えてGROUP BY句では別名が使えない理由

SQL PC

最近、基本情報の午前問題の過去問を解く機会があります。
SQLの問題で疑問に思った点があったので調べてみました。

疑問に思った問題

“商品売上”表から支店ごと、商品ごとの商品売上合計を求め、支店名の昇順、商品売上合計の降順に表示するSQL文中のaに入れるべき字句はどれか。

商品売上(支店名,商品名,社員番号,名前,売上)

SQL文
SELECT 支店名,商品名,SUM(売上) AS 商品売上合計
FROM 商品売上
a
選択肢
  1. GROUP BY 支店名 ORDER BY 支店名 ASC
  2. GROUP BY 支店名 ORDER BY 支店名 ASC, 商品売上合計 DESC
  3. GROUP BY 支店名, 商品名 ORDER BY 支店名, 商品売上合計
  4. GROUP BY 支店名, 商品名 ORDER BY 支店名 ASC, 商品売上合計 DESC

疑問点

「支店ごと、商品ごとの商品売上合計」の部分から、GROUP BY句に支店名しか指定していない1番と2番は除外できます。
ORDER BY句の降順に並び替えるDESCは省略できないので、答えは4番です。

1~3番の選択肢が論外なので4番が答えであることはわかりました。
ただ、僕が疑問に思った点がORDER BY句にSELECT句で定義した別名を使っている点です。

ASで定義した名前は出力した表に表示する名前であり、SQL文の中では使えない。
このようなことを昔習った気がしたのですが…

ORDER BY句では別名を使えます。

どうやら僕が習った内容はGROUP BY句に関する内容だったようです。
GROUP BY句とORDER BY句を混同していました。

では、何故ORDER BY句では別名を使えるのにGROUP BY句では使えないのか。
それはSELECT文の評価順序によるものでした。

SELECT文の評価順序

SELECT文はSELECT句から始まってFROM句やWHERE句などを書いていきます。
しかし、コンピューターは文の一番最初から解釈しているわけではありません。

よく使われる句の評価順序を並べると以下のようになります。

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

コンピューターがSELECT句を読み込むのはかなり後なんですね。
GROUP BY句はSELECT句よりも先に読み込まれています。

ですから、SELECT句でASを使って別名を付けてもGROUP BY句を処理する時点では認識されないわけです。
ORDER BY句はSELECT句以降に処理されるので、別名を使えるんですね。

MySQLはGROUP BY句も別名を使えるらしい

この記事を書く際に色々調べたところ、MySQLはGROUP BY句でも別名を使えるらしいです。
とはいえ、GROUP BY句を使う筆記問題では別名を使わないようにしましょう。

全国高等学校情報処理競技大会とかだとGROUP BY句で別名使うとはねられます。