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à WHERE và HAVING, 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 có thể sử dụng WHERE IN, ví 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.
Ví dụ đối với bảng Sales.Invoices như trên Tìm top 10 khách hàng có 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ả WHERE và HAVING đề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?