はじめに
SQLのSELECT句の選択リスト項目には、別名(エイリアス)を指定可能です。SELECT句に複雑な式を書いて、同じ式の結果順にソートしたい場合、ORDER BY句を別名で指定できるなど便利な存在です。そんな列別名、ORDER BY句では使える認識でいましたが、GROUP BY句では使えたような、使えなかったような曖昧な理解でした。そこで改めて調べてみたところ、DBMSによって違いがあることを知ったため、まとめておくことにしました。
環境
今回調べたのは以下のDBMSで、それぞれ2024年11月現在の最新バージョンとなります。他のバージョンについては念のため別途確認をお願いします。
- MySQL 9.1
- Oracle 23ai
- PostgreSQL 17.1
- SQLite 3.47.0
- SQL Server 2022
DBMSごとの比較表
DBMSごとに各句で列別名を使えるかどうかの結論は下記の通りとなります。
DBMS | WHERE句 | GROUP BY句 | HAVING句 | ORDER BY句 |
---|---|---|---|---|
MySQL | ✕ | ◯ | ◯ | ◯ |
Oracle | ✕ | ✕ | ✕ | ◯ |
PostgreSQL | ✕ | ◯ | ✕ | ◯ |
SQLite 1 | ◯ | ◯ | ◯ | ◯ |
SQL Server | ✕ | ✕ | ✕ | ◯ |
MySQL
The alias is used as the expression's column name and can be used in GROUP BY, ORDER BY, or HAVING clauses.
Oracle
The alias can be used in the ORDER BY clause, but not other clauses in the query.
PostgreSQL
An output column's name can be used to refer to the column's value in ORDER BY and GROUP BY clauses, but not in the WHERE or HAVING clauses; there you must write out the expression instead.
SQLLite
2. If the ORDER BY expression is an identifier that corresponds to the alias of one of the output columns, then the expression is considered an alias for that column.
SQL Server
column_alias can be used in an ORDER BY clause. However, it cannot be used in a WHERE, GROUP BY, or HAVING clause. If the query expression is part of a DECLARE CURSOR statement, column_alias cannot be used in the FOR UPDATE clause.
補足
今回の調査にあたり、SQL Fiddleで動作確認を行いましたが、Oracleに関しては公式ドキュメントの記載と異なる挙動を示しました。具体的には、GROUP BY句、HAVING句でも列別名が使えました。公式ドキュメントの記載が間違っているのかと思いましたが、Oracle Live SQLで確認したところ、公式ドキュメント通りの挙動となりました。
おわりに
今回調べた範囲において、ORDER BY句では、すべてのDBMSで列別名が使用可能でした。WHERE句では、すべてのDBMSで使用不可でした。GROUP BY句とHAVING句では、DBMSによる違いがありました。DBMSの移行の可能性があるシステム開発でSQLを書く場合、ORDER BY句以外では列別名を使わないという判断をした方がよさそうです。
-
公式ドキュメントからはORDER BY以外の句に関する言及を見つけられませんでした。自分で作成した実行環境において確認した結果を記載しています。 ↩