Dalam SQL, sejauh yang saya tahu, urutan pemrosesan kueri logis, yang merupakan urutan interpretasi konseptual, dimulai dengan FROM dengan cara berikut:
- DARI
- DIMANA
- KELOMPOK OLEH
- MEMILIKI
- PILIH
- DIPESAN OLEH
Mengikuti daftar ini mudah untuk melihat mengapa Anda tidak dapat memiliki alias SELECT dalam klausa WHERE, karena alias belum dibuat. T-SQL (SQL Server) mengikuti ini dengan ketat dan Anda tidak dapat menggunakan alias SELECT sampai Anda telah melewati SELECT.
Tetapi dalam MySQL dimungkinkan untuk menggunakan alias SELECT dalam klausa HAVING meskipun harus (secara logis) diproses sebelum klausa SELECT. Bagaimana ini bisa terjadi?
Untuk memberi contoh:
SELECT YEAR(orderdate), COUNT(*) as Amount
FROM Sales.Orders
GROUP BY YEAR(orderdate)
HAVING Amount>1;
Pernyataan ini tidak valid dalam T-SQL (karena HAVING mengacu pada alias SELECT Amount
) ...
Msg 207, Level 16, State 1, Line 5
Invalid column name 'Amount'.
... tetapi berfungsi dengan baik di MySQL.
Berdasarkan ini, saya bertanya-tanya:
- Apakah MySQL mengambil jalan pintas dalam aturan SQL untuk membantu pengguna? Mungkin menggunakan semacam pra-analisis?
- Atau apakah MySQL menggunakan urutan interpretasi konseptual yang berbeda dari yang saya ikuti, meskipun semua RDBMS mengikuti?
SELECT C, ROW_NUMBER() OVER (ORDER BY X) AS RN FROM T GROUP BY C HAVING RN = 1
akan bermasalah sebagai ROW_NUMBER
berjalan setelah ituHAVING
SELECT @rownum:=@rownum + 1 as row ...
. Mungkin alasan mengapa mereka mendukung alias SELECT adalah karena mereka dapat, karena fakta bahwa mereka tidak mendukung hal-hal yang membuat tidak mungkin ... siapa yang tahu? :)
HAVING
dan SELECT
klausa dapat dipertukarkan. Jadi, tidak ada ambiguitas dalam melakukan ini dan dapat menyederhanakan tampilan kode ketika ada ekspresi mengerikan di SELECT
.