Đó là quy tắc từ tiêu chuẩn SQL (khá phức tạp vì nó đi sâu vào nhiều chi tiết mà người dùng SQL có thể không nghĩ đến).
Có hai nguyên tắc đằng sau quy tắc. Đầu tiên là tiêu chuẩn không áp đặt thứ tự các hoạt động, ngoại trừ khi cần thiết về mặt logic (having
chẳng hạn, mệnh đề phải được xử lý hợp lý sau một nhóm group by
). Đây là cơ sở của khái niệm SQL là một mô tả ngôn ngữ, nơi kết quả được mô tả. Bất kỳ công cụ cơ sở dữ liệu cụ thể nào cũng có thể xác định các đường dẫn thực thi của riêng nó.
Nguyên tắc thứ hai là tránh mơ hồ. Đây là nơi các quy tắc xác định phạm vi, xác định những gì một trình biên dịch SQL biết khi nào.
Hãy xem xét tuyên bố sau:
select a as b, b as a, a + 1 as d
-----------------------^
from t
Câu hỏi là:a
nào hiện a+1
tham chiếu đến, cột a
trong bảng hoặc cột b
(bí danh là a
) trong select
. Theo tiêu chuẩn, điều này là rõ ràng. Bí danh cột không được xác định trong select
mệnh đề nơi chúng được xác định.
Điều này mở rộng đến where
cũng như mệnh đề, được đánh giá trong cùng một phạm vi. Hãy xem xét cùng một ví dụ:
select a as b, b as a, a + 1 as d
from t
where a > 100
a
nào where
điều kiện tham khảo? Tiêu chuẩn là rõ ràng. where
mệnh đề không hiểu bí danh cột trong select
. Điều này là do select
được đánh giá (về mặt logic) sau where
. Vì vậy, khi bạn nói:
select row_number() over (order by a) as seqnum
from t
where a > 100
Giá trị được trả về bắt đầu bằng a
đầu tiên sau 100. Việc liệt kê không xảy ra đầu tiên, với các hàng được lọc nhận các số thứ tự được lọc ra.