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
Mừng ngày Giỗ Tổ – Bùng nổi ưu đãi

Nhân ngày Giỗ Tổ Hùng Vương, UniTrain giảm thêm 130.000đ trên ưu đãi đóng sớm khi đăng ký tất cả các khóa học ở UniTrain. MỘT SỐ CÁC KHÓA HỌC LẺ

Xem thêm
Khám phá tính năng Text Slicer trong Power BI

Bộ lọc văn bản (Text Slicer) là một công cụ lọc nâng cấp, được thiết kế đặc biệt để hoạt động với các trường văn bản. Khác với bộ lọc truyền

Xem thêm
Ưu đãi tháng 03/2025

08/03 NÂNG TẦM KỸ NĂNG – RINH QUÀ NGỌT NGÀO Nhân ngày Quốc tế Phụ nữ 08/03, UniTrain gửi tặng quý học viên CẶP VÉ XEM PHIM CGV 🎟️ khi đăng

Xem thêm
Bắt đầu với Pandas: Cách tạo Series và DataFrame một cách dễ dàng

Pandas là một thư viện phổ biến trong Python, chuyên dùng để phân tích và xử lý dữ liệu. Thư viện này cung cấp hai cấu trúc dữ liệu chính: Series

Xem thêm