Phân biệt WHERE và HAVING trong SQL

Trong SQL, lọc dữ liệu là một bước quan trọng giúp truy vấn trả về kết quả chính xác và tối ưu hơn. Hai mệnh đề thường được sử dụng để lọc dữ liệu là WHEREHAVING, tuy có cùng mục đích nhưng lại hoạt động theo cách khác nhau. Vậy sự khác biệt giữa chúng là gì? Hãy cùng UniTrain khám phá ngay.

Mệnh đề WHERE 

Mệnh đề WHERE trong SQL được sử dụng trong các truy vấn SELECT, INSERT, UPDATE và DELETE nhằm lọc dữ liệu theo điều kiện nhất định. Nó chỉ lấy những dòng dữ liệu đáp ứng điều kiện trước khi thực hiện việc nhóm. Mệnh đề này có thể kết hợp với các toán tử logic như AND, OR, NOT và hỗ trợ các toán tử so sánh như <, <=, >, >=, =, <>. 

Cú pháp hàm WHERE: 

SELECT column_list 
FROM table_name 
WHERE condition 
GROUP BY column_list;

Trong đó:

  •  WHERE condition: Lọc các dòng dữ liệu trước khi nhóm. 
  •  GROUP BY column_list: Nhóm các dòng có cùng giá trị ở cột được chỉ định. 
  •  Các cột trong SELECT phải có trong GROUP BY, ngoại trừ các cột sử dụng hàm tổng hợp (COUNT(), SUM(), AVG(), MAX(), MIN(),…). 

Ví dụ ta có bảng Sales.Invoices dữ liệu với các trường như:  InvoiceID, CustomerID, OrderID, InvoiceDate và SalespersonPersonID.  

đây chúng ta muốn trích xuất đơn hàng trong tháng 3 năm 2013, ta thực hiện câu lệnh:

SELECT OrderID,
    InvoiceDate 
FROM Sales.Invoices  
WHERE MONTH(InvoiceDate) = 3 AND  
YEAR(InvoiceDate) = 2013

Kết quả hiển thị như sau:

Ngoài ra nếu lọc nhiều giá trịmột cột ta thể sử dụng WHERE IN, dụ như chọn các quốc gia đến từ Châu Á (Asia), Châu Âu(Europe), Châu phi (Africa): 

SELECT CountryName, Region 
FROM Application.Countries
WHERE Region in ('Asia','Europe','Africa')

Output: 

Mệnh đề HAVING 

Mệnh đề HAVING trong SQL được sử dụng kết hợp với GROUP BY để lọc các nhóm dữ liệu dựa trên kết quả của các hàm tổng hợp. Khác với WHERE, vốn áp dụng điều kiện lọc trên từng dòng dữ liệu trước khi tổng hợp, HAVING thực hiện việc lọc sau khi dữ liệu đã được tổng hợp. 

Cú pháp mệnh đề HAVING:

SELECT column_list, 
aggregate_function(expression) 
FROM table_name 
WHERE condition 
GROUP BY column_list 
HAVING condition

Trong đó:

  • SELECT column_list, aggregate_function(expression): Chọn cột và tính toán trên dữ liệu. 
  • FROM table_name: Xác định bảng cần truy vấn. 
  • WHERE condition: Lọc dữ liệu trước khi nhóm. 
  • GROUP BY column_list: Nhóm dữ liệu theo cột. 
  • HAVING condition: Lọc nhóm sau khi tổng hợp. 

dụ đối với bảng Sales.Invoices như trên Tìm top 10 khách hàng số ngày mua hàng <= 40 ngày:

SELECT Top 10 CustomerID,
    COUNT(distinct InvoiceDate) as 'SNMH' 
FROM Sales.Invoices 
GROUP BY CustomerID 
HAVING COUNT(distinct InvoiceDate)<=40 
ORDER by COUNT(InvoiceID) desc

Kết quả hiển thị như sau:

Vậy điểm khác biệt giữa WHERE và HAVING ở đây là gì? 

Sự khác biệt chính giữa WHERE và HAVING 

Bảng So Sánh WHERE và HAVING

Tiêu chí Mệnh đề WHERE Mệnh đề HAVING
Chức năng Lọc từng dòng trước khi nhóm. Lọc nhóm sau khi tổng hợp.
Sử dụng với hàm tổng hợp Không thể dùng với hàm tổng hợp. Có thể dùng với hàm tổng hợp như SUM, COUNT, …
Thứ tự thực thi Được áp dụng trước GROUP BY. Được áp dụng sau GROUP BY.
Hiệu suất Nhanh hơn vì hoạt động trên dữ liệu thô. Chậm hơn vì hoạt động trên dữ liệu đã nhóm.
Phạm vi sử dụng Có thể dùng với SELECT, UPDATE, DELETE. Chỉ dùng với SELECT.

Kết hợp WHERE và HAVING trong SQL 

Chúng ta có thể sử dụng cả WHERE và HAVING trong cùng một truy vấn. Mệnh đề WHERE lọc dữ liệu thô và sau khi nhóm, mệnh đề HAVING sẽ lọc kết quả đã tổng hợp. 

Ví dụ Tìm top 10 khách hàng có số ngày mua hàng <= 40 ngày trong năm 2015:

SELECT TOP 10 CustomerID,
    COUNT(distinct InvoiceDate) as 'SNMH' 
FROM Sales.Invoices 
WHERE YEAR(InvoiceDate)=2015 
GROUP BY CustomerID 
HAVING COUNT(distinct InvoiceDate)<=40 
ORDER by COUNT(InvoiceID) desc

Kết quả như sau:

KẾT LUẬN:  

Cả WHEREHAVING đều có chức năng lọc dữ liệu trong SQL, nhưng chúng hoạt động ở các giai đoạn khác nhau trong quá trình thực thi truy vấn. WHERE lọc từng dòng dữ liệu trước khi nhóm, trong khi HAVING áp dụng để lọc kết quả sau khi đã tổng hợp dữ liệu. Hiểu rõ sự khác biệt giữa hai mệnh đề này sẽ giúp bạn tối ưu hóa truy vấn SQL và nâng cao độ chính xác trong phân tích dữ liệu.

Xem thêm:

Khóa học Ứng dụng SQL trong xử lý dữ liệu

Xử lý các giá trị NULL với ISNULL và COALESCE trong SQL

SQL được ứng dụng trong các lĩnh vực nào?

 

Bài viết liên quan
Khám phá hàm Lag và Lead trong SQL

Trong phân tích dữ liệu, hàm LAG() và LEAD() sẽ là công cụ hỗ trợ đắc lực cho việc so sánh giá trị hiện tại với giá trị liền trước hoặc liền

Xem thêm
[RECAP] Training Top 20 – myInsight – MDS Datathon Challenge 2025 – CLB Toán ứng dụng & Khoa học dữ liệu (MDS) – Đại học Ngoại Thương CSII TP. HCM (FTU2)

Tối ngày 18/05/2025, buổi training dành riêng cho Top 20 đội thi xuất sắc nhất cuộc thi myInsight – MDS Datathon Challenge 2025 đã diễn ra vô cùng thành công thông

Xem thêm
Khám Phá Tính Năng Nhóm và Phân Nhóm Dữ Liệu trong Power BI

Trong quá trình xây dựng biểu đồ, Power BI Desktop sẽ tự động tổng hợp dữ liệu thành các nhóm dựa trên các giá trị có trong tập dữ liệu gốc.

Xem thêm
[RECAP] Chuỗi Workshop MARKET-A – CLB Chứng khoán SCUE – Đại học Kinh tế TP. HCM (UEH)

Chiều ngày 15/05/2025 vừa rồi, UniTrain đã hân hạnh có mặt với vai trò là Nhà tài trợ Bạc tại buổi Workshop 2: OPTIVEST thuộc chuỗi chương trình Workshop MARKET-A do

Xem thêm