Ini adalah aturan dari standar SQL (yang agak rumit karena mencakup banyak detail yang mungkin tidak dipikirkan oleh pengguna SQL).
Ada dua prinsip di balik aturan tersebut. Yang pertama adalah bahwa standar tidak memaksakan urutan operasi, kecuali jika diperlukan secara logis (having
klausa, misalnya, harus diproses secara logis setelah group by
). Ini adalah dasar dari pengertian di SQL adalah deskriptif bahasa, di mana hasilnya dijelaskan. Setiap mesin database tertentu dapat menentukan jalur eksekusinya sendiri.
Prinsip kedua adalah menghindari ambiguitas. Di sinilah aturan pelingkupan masuk, yang menentukan apa yang diketahui oleh kompiler SQL.
Perhatikan pernyataan berikut:
select a as b, b as a, a + 1 as d
-----------------------^
from t
Pertanyaannya adalah:a
. yang mana? apakah a+1
lihat, kolom a
pada tabel atau kolom b
(yang disebut sebagai a
) di select
. Menurut standar ini tidak ambigu. Kolom alias tidak dikenal di select
klausa di mana mereka didefinisikan.
Ini meluas ke where
klausa juga, yang dievaluasi dalam lingkup yang sama. Perhatikan contoh yang sama:
select a as b, b as a, a + 1 as d
from t
where a > 100
Yang a
melakukan where
kondisi merujuk? Standarnya tidak ambigu. where
klausa tidak memahami alias kolom di select
. Ini karena select
(secara logis) dievaluasi setelah where
. Jadi, ketika Anda mengatakan:
select row_number() over (order by a) as seqnum
from t
where a > 100
Nilai yang dikembalikan dimulai dengan a
pertama setelah 100. Pencacahan tidak terjadi terlebih dahulu, dengan baris yang difilter mendapatkan nomor urut yang difilter.