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
Ưu đãi tháng 05/2025

Chào đón tháng 5 rực rỡ, UniTrain mang đến ưu đãi kép cho học viên: Giảm ngay 155.000đ trên mức ưu đãi đóng sớm khi học viên đăng ký bất kỳ

Xem thêm
[RECAP] Training 4: How to Write M&A Buy-Sell Recommendations – Cuộc thi Sinh viên với Tài chính mùa 13 (FSC13) – CLB Tài chính – Chứng khoán SeSC – Trường Đại học Ngoại Thương CSII TP. HCM (FTU2)

Chiều ngày 28/04/2025, buổi Training 4 dành cho Top 8 đội thi xuất sắc nhất cuộc thi Sinh viên với Tài chính mùa 13 (FSC13) đã diễn ra trực tiếp tại

Xem thêm
Phân biệt hàm SUM, SUMX và CALCULATE trong Power BI

1. Giới thiệu Trong Power BI, DAX (Data Analysis Expressions) cung cấp nhiều hàm để tổng hợp và phân tích dữ liệu. Ba trong số các hàm quan trọng nhất là

Xem thêm
[RECAP] Buổi Training vòng 2: IFRS 15 – Revenue from contracts with customers – Cuộc thi The Audit Proud 2025 – CLB Kế toán – Kiểm toán FAC – Trường Đại học Ngoại Thương CSII TP. HCM

Chiều tối ngày 24/04/2025, buổi Training Vòng 2 của cuộc thi The Audit Proud 2025 với chủ đề “IFRS 15 – Revenue from Contracts with Customers” đã diễn ra thành công

Xem thêm