Sự khác biệt số một đối với tôi: nếu HAVINGbị 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ỏ WHEREkhỏ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ụ: DUALtrong Oracle) bằng cách sử dụng ONmệnh đề để mô phỏng WHEREmệ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 HAVINGvà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 HAVINGmệnh đề có thể được sử dụng mà không có một GROUP BYmệnh đề. Trong trường hợp này, HAVINGmệ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 SELECTmệ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 namecộ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 HAVINGmệ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.
HAVINGlà bộ lọc tổng hợp, trong khi đóWHERElà bộ lọc tổng hợp trước.