私の知る限り、SQLでは、概念的な解釈順序である論理クエリ処理順序は、次のようにFROMで始まります。
- から
- どこ
- GROUP BY
- 持っている
- 選択する
- ORDER BY
このリストに従うと、エイリアスがまだ作成されていないため、WHERE句でSELECTエイリアスを使用できない理由を簡単に確認できます。T-SQL(SQL Server)は厳密にこれに従い、SELECTを渡すまでSELECTエイリアスを使用できません。
しかし、MySQLでは、SELECT句の前に(論理的に)処理する必要がある場合でも、HAVING句でSELECTエイリアスを使用できます。これはどのように可能ですか?
例を挙げると:
SELECT YEAR(orderdate), COUNT(*) as Amount
FROM Sales.Orders
GROUP BY YEAR(orderdate)
HAVING Amount>1;
ステートメントはT-SQLでは無効です(HAVINGはSELECTエイリアスを参照しているためAmount
)...
Msg 207, Level 16, State 1, Line 5
Invalid column name 'Amount'.
...しかし、MySQLでは問題なく動作します。
これに基づいて、私は疑問に思っています:
- MySQLはユーザーを支援するためにSQLルールのショートカットを取っていますか?何らかの事前分析を使用しているのでしょうか?
- または、MySQLはすべてのRDBMSが従っていたものとは異なる概念解釈順序を使用していますか?
SELECT C, ROW_NUMBER() OVER (ORDER BY X) AS RN FROM T GROUP BY C HAVING RN = 1
として問題になる可能性がありますROW_NUMBER
実行した後にHAVING
SELECT @rownum:=@rownum + 1 as row ...
。たぶん、SELECTエイリアスをサポートする理由は、それが不可能になることをサポートしていないという事実のために、単にサポートできるからです。:)
HAVING
とfor SELECT
節の実行の論理的な順序は交換できます。そのため、これを行うのにあいまいさはなく、に巨大な式がある場合にコードの外観を簡素化できSELECT
ます。