SELECT
trong tiêu chuẩn SQL / IEC theo quy định thứ tự cú pháp sau đây cho các mệnh đề phụ:
SELECT
projection-expressions
FROM
sources
WHERE
predicate-expression
GROUP BY
key-expression
HAVING
predicate-expression
ORDER BY
ordering-expressions
Trong khi thứ tự thực hiện logic là thế này:
FROM
sources
WHERE
predicate-expression
GROUP BY
value-expression
HAVING
value-expression
SELECT
projection-expressions
ORDER BY
ordering-expressions
Cho người dùng mới làm quen của SQL nó trở nên ngạc nhiên rằng một chiếu quy định tại các SELECT
khoản không có sẵn trong WHERE
hoặc GROUP BY
khoản mặc dù nó tuyên bố đầu tiên - cho rằng chương trình máy tính thường làm theo trình tự thực hiện từ trên xuống.
Nó cũng ngạc nhiên rằng tác giả SQL được yêu cầu để lặp lại nét mặt của họ ở SELECT
, WHERE
và GROUP BY
khoản dư thừa hoặc sử dụng một subquery đó không thích hợp với một truy vấn ngắn gọn. Ít nhất là khi người dùng đã quen với thứ tự thực thi mệnh đề thực tế, họ biết tại sao họ cần phải lặp lại, nhưng điều đó không ngăn được sự bực bội.
Vấn đề này và các vấn đề liên quan khác, được ghi lại trong bài viết này tôi tìm thấy: https://blog.jooq.org/2016/12/09/a-beginners-guide-to-the-true-order-of-sql- hoạt động / và không có gì ngạc nhiên khi một QA trên StackOverflow có gần 30.000 lượt xem: /programming/3241352/USE-an-alias-column-in-the-where-clause-in-postgresql
Nó làm tôi tự hỏi liệu có bất kỳ triển khai SQL nào cho phép thứ tự các mệnh đề "hợp lý" hơn này không. Tôi lưu ý rằng Linq trong .NET thực sự tuân theo thứ tự này, mặc dù tôi sẽ không mô tả nó là một triển khai SQL thực sự, nhưng thực sự, trong Linq tương đương sẽ là:
source // FROM equivalent
.Where( predicate-expression )
.GroupBy( key-expression )
.Where( predicate-expression ) // HAVING equivalent
.Select( projection-expression )
.OrderBy( ordering-expression )
(Tôi cũng thích cách Linq cho phép bạn thêm một Select()
phép chiếu ở bất cứ đâu trong chuỗi lệnh để bạn có thể sử dụng các biểu thức được đánh giá của mình mà không cần phải gọi lại các biểu thức).
Vì vậy, có bất kỳ triển khai SQL nào cho phép bạn thể hiện các truy vấn theo cấu trúc logic hơn không?
SELECT
khoản trongWHERE
vàGROUP BY
khoản - và khá nhiều mỗi thực hiện SQL lệch khỏi tiêu chuẩn một cách nào đó hoặc cách khác - Tôi đang đề xuất hoặc yêu cầu một độ lệch cho phép một mệnh đề cú pháp khác nhau thay vì vi phạm quy định về bán buôn. Nhân tiện, cảm ơn bạn về thông tin lịch sử :)