はじめに
最近MySQLのクエリを書いているときにSELECT句でASを使って作ったカラム名をWHERE句に投げるとエラーになった原因を調べて分かったことをメモ代わりに置いておきます。
WHERE句にSELECT句のASで作成したカラム名を投げると
入力
SELECT id AS number FROM table WHERE number = 1;
出力
ERROR 1054(42522): Unknown column 'number' in 'where clause'
とこのようにこのようなカラムは存在しませんとエラーを返されます。
なぜこのようなことになるのか
調べてみたところ、SQLでは上から順に実行されていくわけではなく、下記のように実行される順序があるようでした。
順序 | 句 |
---|---|
1 | FROM |
2 | JOIN |
3 | WHERE |
4 | GROUP BY |
5 | HAVING |
6 | SELECT |
7 | ORDER BY |
8 | LIMIT |
SELECT句よりもWHERE句のほうが先に実行されるのでASによってカラム名が作成されるよりも前に呼び出そうとしてしまい結果的にカラムが存在しないということになるようです。