Mệnh đề HAVING
trong SQL chỉ định rằng câu lệnh SQL SELECT
chỉ được trả về các hàng có giá trị tổng hợp đáp ứng các điều kiện đã chỉ định
Người mới bắt đầu thường nhầm lẫn giữa HAVING
và WHERE
, nhưng chúng phục vụ các mục đích khác nhau. WHERE
được tính đến ở giai đoạn trước của quá trình thực thi truy vấn, lọc các hàng được đọc từ các bảng. Nếu một truy vấn chứa
SELECT DepartmentName, COUNT[*] FROM Employee JOIN Department ON Employee.DepartmentID = Department.DepartmentID GROUP BY DepartmentName HAVING COUNT[*] > 1;0, các hàng từ các bảng được nhóm lại và tổng hợp. Sau thao tác tổng hợp,
HAVING
được áp dụng, lọc ra các hàng không khớp với các điều kiện đã chỉ định. Do đó, WHERE
áp dụng cho dữ liệu đọc từ bảng và HAVING
chỉ nên áp dụng cho dữ liệu tổng hợp, không được biết trong giai đoạn đầu của truy vấnĐể xem điều kiện hiện tại được hình thành bởi mệnh đề
SELECT DepartmentName, COUNT[*] FROM Employee JOIN Department ON Employee.DepartmentID = Department.DepartmentID GROUP BY DepartmentName HAVING COUNT[*] > 1;0, mệnh đề
HAVING
được sử dụng. [cần phải làm rõ]Các ví dụ[sửa]
Để trả về danh sách ID bộ phận có tổng doanh thu vượt quá $1000 vào ngày 1 tháng 1 năm 2000, cùng với tổng doanh thu của họ vào ngày đó
SELECT DeptID, SUM[SaleAmount] FROM Sales WHERE SaleDate = '01-Jan-2000' GROUP BY DeptID HAVING SUM[SaleAmount] > 1000
Tham chiếu đến , câu truy vấn sau sẽ trả về danh sách các phòng ban có nhiều hơn 1 nhân viên
SELECT DepartmentName, COUNT[*] FROM Employee JOIN Department ON Employee.DepartmentID = Department.DepartmentID GROUP BY DepartmentName HAVING COUNT[*] > 1;
HAVING
thuận tiện, nhưng không cần thiết. Mã tương đương với ví dụ trên, nhưng không sử dụng HAVING
, có thể giống như
Mệnh đề HAVING cho phép bạn chỉ định các điều kiện lọc kết quả nhóm nào xuất hiện trong kết quả
Mệnh đề WHERE đặt điều kiện cho các cột được chọn, trong khi mệnh đề HAVING đặt điều kiện cho các nhóm được tạo bởi mệnh đề GROUP BY
cú pháp
Khối mã sau hiển thị vị trí của Mệnh đề HAVING trong một truy vấn
SELECT FROM WHERE GROUP BY HAVING ORDER BY
Mệnh đề HAVING phải tuân theo mệnh đề GROUP BY trong một truy vấn và cũng phải đứng trước mệnh đề ORDER BY nếu được sử dụng. Khối mã sau đây có cú pháp của câu lệnh SELECT bao gồm mệnh đề HAVING -
SELECT column1, column2 FROM table1, table2 WHERE [ conditions ] GROUP BY column1, column2 HAVING [ conditions ] ORDER BY column1, column2
Thí dụ
Xét bảng KHÁCH HÀNG có các bản ghi sau
+----+----------+-----+-----------+----------+ | ID | NAME | AGE | ADDRESS | SALARY | +----+----------+-----+-----------+----------+ | 1 | Ramesh | 32 | Ahmedabad | 2000.00 | | 2 | Khilan | 25 | Delhi | 1500.00 | | 3 | kaushik | 23 | Kota | 2000.00 | | 4 | Chaitali | 25 | Mumbai | 6500.00 | | 5 | Hardik | 27 | Bhopal | 8500.00 | | 6 | Komal | 22 | MP | 4500.00 | | 7 | Muffy | 24 | Indore | 10000.00 | +----+----------+-----+-----------+----------+
Sau đây là một ví dụ, sẽ hiển thị một bản ghi cho số tuổi tương tự lớn hơn hoặc bằng 2
Mệnh đề HAVING đặt điều kiện trong các nhóm được xác định bởi mệnh đề GROUP BY trong câu lệnh SELECT
Mệnh đề SQL này được triển khai sau mệnh đề 'GROUP BY' trong câu lệnh 'SELECT'
Mệnh đề này được sử dụng trong SQL vì chúng ta không thể sử dụng mệnh đề WHERE với các hàm tổng hợp SQL. Cả hai mệnh đề WHERE và HAVING đều được sử dụng để lọc các bản ghi trong truy vấn SQL
Sự khác biệt giữa mệnh đề HAVING và WHERE
Sự khác biệt giữa mệnh đề WHERE và HAVING trong cơ sở dữ liệu là câu hỏi quan trọng nhất được hỏi trong cuộc phỏng vấn CNTT
Bảng sau đây cho thấy sự so sánh giữa hai mệnh đề này, nhưng điểm khác biệt chính là mệnh đề WHERE sử dụng điều kiện để lọc các bản ghi trước khi thực hiện bất kỳ nhóm nào, trong khi mệnh đề HAVING sử dụng điều kiện để lọc các giá trị từ một nhóm
HAVINGWHERE1. Mệnh đề HAVING được sử dụng trong các hệ thống cơ sở dữ liệu để lấy dữ liệu/giá trị từ các nhóm theo điều kiện đã cho. 1. Mệnh đề WHERE được sử dụng trong các hệ thống cơ sở dữ liệu để lấy dữ liệu/giá trị từ các bảng theo điều kiện đã cho. 2. Mệnh đề HAVING luôn được thực thi với mệnh đề GROUP BY. 2. Mệnh đề WHERE có thể được thực thi mà không cần mệnh đề GROUP BY. 3. Mệnh đề HAVING có thể bao gồm các hàm tổng hợp SQL trong một truy vấn hoặc câu lệnh. 3. Chúng ta không thể sử dụng hàm tổng hợp SQL với mệnh đề WHERE trong câu lệnh. 4. Chúng ta chỉ có thể sử dụng câu lệnh SELECT với mệnh đề HAVING để lọc các bản ghi. 4. Trong khi đó, chúng ta có thể dễ dàng sử dụng mệnh đề WHERE với các câu lệnh UPDATE, DELETE và SELECT. 5. Mệnh đề HAVING được sử dụng trong các truy vấn SQL sau mệnh đề GROUP BY. 5. Mệnh đề WHERE luôn được sử dụng trước mệnh đề GROUP BY trong truy vấn SQL. 6. Chúng ta có thể thực hiện mệnh đề SQL này trong các hoạt động cột. 6. Chúng ta có thể triển khai mệnh đề SQL này trong các thao tác hàng. 7. Nó là một bộ lọc sau. 7. Nó là một bộ lọc trước. 8. Nó được sử dụng để lọc các nhóm. 8. Nó được sử dụng để lọc bản ghi duy nhất của bảngCú pháp mệnh đề HAVING trong SQL
Ví dụ về mệnh đề HAVING trong SQL
Trong bài viết này, chúng tôi đã lấy bốn ví dụ khác nhau sau đây để giúp bạn cách sử dụng mệnh đề HAVING với các hàm tổng hợp SQL khác nhau
ví dụ 1. Hãy lấy bảng Nhân viên sau đây, giúp bạn phân tích mệnh đề HAVING với hàm tổng hợp SUM
Emp_IdEmp_NameEmp_SalaryEmp_City201Abhay2000Goa202Ankit4000Delhi203Bheem8000Jaipur204 Ram2000Goa205Sumit5000DelhiNếu bạn muốn thêm lương của nhân viên cho từng thành phố, bạn phải viết truy vấn sau
Đầu ra của truy vấn trên hiển thị đầu ra sau
SUM[Emp_Salary]Emp_City4000Goa9000Delhi8000JaipurBây giờ, giả sử bạn muốn hiển thị những bộ phận có mức lương trung bình lớn hơn và bằng 6500. Đối với trường hợp này, bạn phải nhập truy vấn sau với mệnh đề HAVING trong SQL