最近、基本情報の午前問題の過去問を解く機会があります。
SQLの問題で疑問に思った点があったので調べてみました。
疑問に思った問題
“商品売上”表から支店ごと、商品ごとの商品売上合計を求め、支店名の昇順、商品売上合計の降順に表示するSQL文中のaに入れるべき字句はどれか。
商品売上(支店名,商品名,社員番号,名前,売上)
FROM 商品売上
a
- GROUP BY 支店名 ORDER BY 支店名 ASC
- GROUP BY 支店名 ORDER BY 支店名 ASC, 商品売上合計 DESC
- GROUP BY 支店名, 商品名 ORDER BY 支店名, 商品売上合計
- 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句などを書いていきます。
しかし、コンピューターは文の一番最初から解釈しているわけではありません。
よく使われる句の評価順序を並べると以下のようになります。
- FROM句
- WHERE句
- GROUP BY句
- HAVING句
- SELECT句
- ORDER BY句
コンピューターがSELECT句を読み込むのはかなり後なんですね。
GROUP BY句はSELECT句よりも先に読み込まれています。
ですから、SELECT句でASを使って別名を付けてもGROUP BY句を処理する時点では認識されないわけです。
ORDER BY句はSELECT句以降に処理されるので、別名を使えるんですね。
MySQLはGROUP BY句も別名を使えるらしい
この記事を書く際に色々調べたところ、MySQLはGROUP BY句でも別名を使えるらしいです。
とはいえ、GROUP BY句を使う筆記問題では別名を使わないようにしましょう。
全国高等学校情報処理競技大会とかだとGROUP BY句で別名使うとはねられます。