Về cơ bản vì chúng được xác định cho các mục đích khác nhau. Mệnh đề WHERE
là để lọc hồ sơ và mệnh đề HAVING
được thiết kế để lọc với chức năng tổng hợp (GROUP BY
). Trong truy vấn thứ hai của bạn, bộ lọc GROUP BY
tiềm ẩn đang được sử dụng, ví dụ: nếu bạn thêm một cột khác vào mệnh đề SELECT
, bạn sẽ kết thúc với các kết quả khác nhau.
EDIT dựa trên chỉnh bởi Martin Smith
HAVING
được tạo ra để cho phép lọc các hàng kết quả của một GROUP BY
. Khi không có GROUP BY
được chỉ định, toàn bộ kết quả được coi là một nhóm.
Nếu không phải là một <where clause>
hay một <group by clause>
được chỉ định, sau đó để T là kết quả của trước đó <from clause>
hoặc
... nhóm là toàn bộ bảng nếu không có <group by clause>
được chỉ định
EDIT 2 Bây giờ về ALIAS:
Các đặc điểm kỹ thuật cho mệnh đề WHERE về tài liệu tham khảo cột trong điều kiện tìm kiếm nói điều này:
Mỗi <column reference>
chứa trực tiếp trong <search condition>
sẽ rõ ràng tham khảo một cột của T hoặc là tham chiếu ngoài.
Tham khảo: 7.6 <where clause>
, Quy tắc cú pháp 1.
Các đặc điểm kỹ thuật cho các mệnh đề HAVING về tài liệu tham khảo cột trong điều kiện tìm kiếm nói điều này:
Mỗi <column reference>
chứa trực tiếp trong <search condition>
trách nhiệm rõ ràng tham khảo một cột nhóm của T hoặc là một bên ngoài tài liệu tham khảo.
Tham khảo: Quy tắc 7.8 <having clause>
, Cú pháp 1.
Và một nhóm cột được định nghĩa là:
Một cột được tham chiếu trong một <group by clause>
là một cột nhóm.
Vì vậy, trong kết luận, WHERE
phải tham chiếu cột của bảng và mệnh đề HAVING
phải tham chiếu cột nhóm của nhóm hàng.
(Second Informal Review Draft) ISO/IEC 9075:1992, Database Language SQL- July 30, 1992
Đây là phần mở rộng của MySQL cho tiêu chuẩn. Bạn không thể tham khảo bí danh cột trong 'có' trong SQL Server chẳng hạn. –