はじめに
本記事は、私がデータベーススペシャリスト試験にチャレンジする過程で、超苦手なSQLを克服しようと学習していたときにつまずいたポイントとそこからの学びについて書いたものです。
別名が使えないのだが。
SQLの学習サイトでこんな感じのSQLを書いていました。
SELECT member.name AS NAME,member.team AS TEAM FROM member
...
GROUP BY member.team
「あとはmember.teamを降順に並べ替えて……できた!」
SELECT member.name AS NAME,member.team AS TEAM FROM member
...
GROUP BY member.team
ORDER BY member.team DESC;
無事に正しい結果が出力されましたが、私はあることに気付きました。
模範解答は以下のようになっていました。
SELECT member.name AS NAME,member.team AS TEAM FROM member
...
GROUP BY member.team
ORDER BY TEAM DESC;
「あれ、ORDER BY句は別名使ってる」
AS
句でカラムや表に別名をつけることができます。そして、ORDER BY句では別名でカラムを指定し、並べ替えていたのです。
「でも、GROUP BY句では別名使ってないな。問題作った人間違えちゃったのかな?」
ORDER BY句で別名が使えるなら大丈夫だろう、と思い、私は試しにGROUP BY句を以下のように書き換えました。
SELECT member.name AS NAME,member.team AS TEAM FROM member
...
GROUP BY TEAM
ORDER BY TEAM DESC;
「あれ、エラー吐いちゃった……」
ORDER BY句とGROUP BY句で、別名が使えたり使えなかったりと、そんなことがあるのでしょうか。
SQLの構文には実行順序がある
今回のつまづきポイントは実はAS句ではなく、クエリの実行順序です。
たとえば、SQL Serverではクエリの実行順は以下のようになっています。
- FROM
- ON
- JOIN
- WHERE
- GROUP BY
- WITH CUBE または WITH ROLLUP
- HAVING
- SELECT
- DISTINCT
- ORDER BY
- TOP
GROUP BY句よりもSELECT句の方が後で実行されるようになっています。
今回私が書いたクエリは以下。
SELECT member.name AS NAME,member.team AS TEAM FROM member
...
GROUP BY TEAM
ORDER BY TEAM DESC;
AS句による別名の指定をSELECT句で行っています。
つまり、GROUP BY句が実行された時点では別名は指定されていません。
だからエラーが出てしまったんですね。
ORDER BY句で別名が使えるのも同じ理由で、ORDER BY句の実行順はSELECT句よりも後であるため、SELECT句で指定した別名を使うことができるのです。
最後に
つまずいたときは本当に訳が分からず、かつSQL勉強始めたて状態だったのでどう調べたら答えが出てくるのかもわからなかったのですが、ふとC#のlinqの遅延実行のことを思い出したことで答え(ググるキーワード)にたどり着けました。
今回実行順について学んだことで、
「GROUP BY句の後で絞り込みたいときにWHEREじゃなくてHAVINGを使うのも、もしかしてWHERE句はGROUP BY句の前に実行されちゃうから?」
などという気づきもありました。
なお、先日データベーススペシャリスト試験受験してまいりましたが、想像通りのずたぼろでした。 点数見たくないです。
とはいえ手応えはありましたし、応用情報を受けていた頃は苦手すぎて即捨てていたデータベースの問題を少しでも解けるようになったのは嬉しかったです。
受け続ければ受かるはずなのでこれからも頑張ります。