Sự khác biệt số một đối với tôi: nếu HAVING
bị xóa khỏi ngôn ngữ SQL thì cuộc sống sẽ tiếp tục ít nhiều như trước đây. Chắc chắn, một truy vấn thiểu số sẽ cần phải được viết lại bằng cách sử dụng bảng dẫn xuất, CTE, v.v. Có lẽ mã tối ưu hóa của các nhà cung cấp sẽ cần phải được viết lại để giải thích cho điều này, một lần nữa là cơ hội để cải tiến trong ngành.
Bây giờ hãy xem xét cho một thời điểm loại bỏ WHERE
khỏi ngôn ngữ. Lần này, phần lớn các truy vấn tồn tại sẽ cần phải được viết lại mà không có cấu trúc thay thế rõ ràng. Các lập trình viên sẽ phải có được sự sáng tạo, ví dụ như tham gia bên trong vào một bảng được biết có chứa chính xác một hàng (ví dụ: DUAL
trong Oracle) bằng cách sử dụng ON
mệnh đề để mô phỏng WHERE
mệnh đề trước . Những công trình như vậy sẽ bị chiếm đoạt; rõ ràng là có một cái gì đó bị thiếu từ ngôn ngữ và kết quả sẽ tồi tệ hơn.
TL; DR chúng ta có thể mất HAVING
vào ngày mai và mọi thứ sẽ không tệ hơn, có thể tốt hơn, nhưng điều tương tự không thể được nói đến WHERE
.
Từ các câu trả lời ở đây, dường như nhiều người dân không nhận ra rằng một HAVING
mệnh đề có thể được sử dụng mà không có một GROUP BY
mệnh đề. Trong trường hợp này, HAVING
mệnh đề được áp dụng cho toàn bộ biểu thức bảng và yêu cầu chỉ các hằng số xuất hiện trong SELECT
mệnh đề. Thông thường các HAVING
điều khoản sẽ liên quan đến tổng hợp.
Điều này hữu ích hơn âm thanh. Ví dụ: xem xét truy vấn này để kiểm tra xem name
cột có phải là duy nhất cho tất cả các giá trị trong T
:
SELECT 1 AS result
FROM T
HAVING COUNT( DISTINCT name ) = COUNT( name );
Chỉ có hai kết quả có thể xảy ra: nếu HAVING
mệnh đề là đúng thì kết quả có một hàng duy nhất chứa giá trị 1
, nếu không kết quả sẽ là tập hợp trống.
HAVING
là bộ lọc tổng hợp, trong khi đóWHERE
là bộ lọc tổng hợp trước.