PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Thứ tự xử lý lôgic hoặc tiêu chuẩn SQL trong mệnh đề WHERE

Đó 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.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Kết nối với cơ sở dữ liệu PostgreSQL thông qua đường hầm SSH bằng Python

  2. Sao chép nhiều tệp CSV vào postgres

  3. PostgreSQL - truy xuất các mục theo thứ tự chúng được lưu trữ

  4. Đếm số hàng sau khi nối ba bảng trong PostgreSQL

  5. cách tốt để phân đoạn ngang trong postgresql là gì