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
Hàm TRIMRANGE() – Hàm xóa giá trị trống “đỉnh” hơn cả TRIM.

Như bạn đã biết hàm TRIM() trong Excel giúp loại bỏ các ký tự trống (khoảng trắng). Tương tự vậy hàm TRIMRANGE() được sử dụng để xóa các giá trị trống khỏi một phạm vi

Xem thêm
[HOẠT ĐỘNG CỘNG ĐỒNG] Cuộc thi Financial Student Contest (FSC) mùa 13 – CLB Tài chính – Chứng khoán (SeSC) – Đại học Ngoại Thương CSII TP. HCM (FTU2)

Chiều tối ngày 13/06/2025, Chung kết cuộc thi Financial Student Contest (FSC) mùa 13 do CLB Tài chính – Chứng khoán (SeSC) thuộc Đại học Ngoại Thương CSII TP. HCM (FTU2)

Xem thêm
[HOẠT ĐỘNG CỘNG ĐỒNG] Cuộc thi myInsight – MDS Datathon Challenge 2025 – CLB Toán ứng dụng & Khoa học dữ liệu (MDS) – CSII Đại học Ngoại Thương TP. HCM (FTU2)

Chiều ngày 08/06/2025 vừa qua, cuộc thi myInsight – MDS Datarthon Challenge 2025 đã chính thức tiến đến vòng chung kết dưới sự góp mặt của top 5 đội thi xuất

Xem thêm
Cảm nhận học viên khóa Excel for Analysts

“Mình rất hài lòng về tính ứng dụng thực tế và khả năng nâng cao hiệu quả công việc của khóa học.” Anh Nguyễn Trung Hòa – nhân sự ngành Kế

Xem thêm