So sánh mệnh đề where và mệnh đề having năm 2024
Mệnh đề HAVING trong SQL có thể được xem là một sự thay thế cho WHERE. Nguyên nhân vì sao? Ý nghĩa và cú pháp sử dụng của HAVING như thế nào? Hãy xem tiếp ngay dưới đây. Show
1. Ý nghĩa của GROUP BYMệnh đề HAVING được thêm vào SQL bởi vì từ khóa WHERE không thể được sử dụng với các hàm tổng hợp.
SELECT tên cột FROM tên bảng WHERE điều kiện GROUP BY tên cột HAVING điều kiện ORDER BY tên cột; 2. Ví dụ HAVINGĐể thực hiện ví dụ này, bạn cần nhập cơ sở dữ liệu mẫu Northwind vào SQL Server Management Studio. Hãy xem bài viết hướng dẫn ngay dưới đây: Tham khảo: Hướng dẫn tải và cài đặt dữ liệu mẫu Northwind trong SQL Server Management Studio Câu lệnh SQL dưới đây sẽ liệt kê nếu nhân viên có tên “Davolio” hoặc “Fuller” có nhiều hơn 25 đơn đặt hàng: Câu hỏi Câu trả lời Cả hai đều chỉ định điều kiện tìm kiếm nhưng ... Bạn cần đăng nhập để xem Gợi ý câu hỏi Tìm các giá trị trùng lặp trong bảng SQL?
Sự khác biệt giữa một
WHERE là điều kiện lọc sơ bộ ban đầu. Các Column trong WHERE phải có trong bảng TblA, không thể WHERE Tan_Xuat > 1 HAVING là điều kiện lọc trên bảng ảo sau khi nhóm lệnh SELECT Stt ...GROUP BY Stt được thực hiện. Sau khi GROUP BY thì mới có cột Tan_Xuat, lúc đó muốn lọc tiếp với điều kiện Stt xuất hiện trên 1 lần thì HAVING Tan_Xuat > 1 GROUP BY thì gộp các dòng có chung một giá trị nào đó (VD: Stt) lại thành 1 dòng. Với các cột không có trong GROUP BY thì phải dùng SUM, AVG, MIN, MAX để xử lý. Khi group lại thì cột Dien_Giai ko phải kiểu số nên không thể dùng SUM vì cộng lại thì chả có ý nghĩa gì nên có thể dùng MIX, MIN để chọn một giá trị đứng đầu or cuối theo sắp xếp GROUP BY luôn đứng sau WHERE (nếu có), còn HAVING luôn đứng sau GROUP BY (Theo kinh nghiệm của tôi thì thế thôi, chưa đọc qua giáo trình nào nên cũng không rõ có gì hiểu sai hay thiếu ko) Mệnh đề HAVING trong SQL được sử dụng để lọc các bản ghi và chỉ lấy những bản ghi phù hợp với yêu cầu hoặc thực sự cần thiết tương tự như mệnh đề WHERE. Tuy nhiên:
Vì vậy mà sau GROUP BY thì sẽ chỉ dùng được HAVING còn WHERE không dùng được sau GROUP BY. Cú pháp sử dụng HAVING trong SQLVị trí của mệnh đề HAVING trong một truy vấn SQL như sau:
Lưu ý: Mệnh đề HAVING phải theo sau mệnh đề GROUP BY trong một truy vấn và đặt trước mệnh đề ORDER BY nếu được sử dụng. Dưới đây là cú pháp của lệnh SELECT bao gồm mệnh đề HAVING:
Ví dụ về HAVING trong SQLGiả sử bảng NHANVIEN có các bản ghi như sau: ++--+-+---+--+
Để hiển thị bản ghi có độ tuổi xuất hiện lớn hơn hoặc bằng 2 lần, ta chạy lệnh như sau:
Kết quả trả về là: ++--+-+---+--+
Trong phần tiếp theo, chúng ta sẽ tìm hiểu về Transaction trong SQL, các bạn nhớ theo dõi nhé. Bài trước: Khung nhìn VIEW trong SQL Bài tiếp: TRANSACTION trong SQL GROUP BY được sử dụng để nhóm các dòng dữ liệu dựa trên giá trị của một hoặc nhiều cột. Mục đích chính của GROUP BY là thực hiện các phép tổng hợp hoặc hàm tính toán trên các nhóm dữ liệu. Sau đây là cách GROUP BY được thực thi trong câu lệnh. ![A diagram of a split and combine Description automatically generated](https://datapot.vn/wp-content/uploads/2023/12/a-diagram-of-a-split-and-combine-description-auto.png) Cú pháp của GROUP BY:
Các hàm tính toán phổ biến ![A diagram of a diagram Description automatically generated](https://datapot.vn/wp-content/uploads/2023/12/a-diagram-of-a-diagram-description-automatically.png) Ví dụ: Từ bảng Product thuộc bộ dữ liệu adventureworks, truy vấn các cột sau: ProductCategoryID, tổng giá tiền của sản phẩm, giá tiền trung bình, đếm số ProductID, số ProductID riêng biệt, giá tiền tối đa, giá tiền tối thiểu của giá tiền từng sản phẩm. Nhóm các trường có chung ProductIDCategoryID thành các nhóm riêng biệt. ![A screenshot of a computer Description automatically generated](https://datapot.vn/wp-content/uploads/2023/12/a-screenshot-of-a-computer-description-automatica-23.png) Giải thích câu lệnh truy vấn:
Chỉ định điều kiện các nhóm bằng mệnh đề HAVINGHAVING là một điều kiện được sử dụng trong SQL sau mệnh đề GROUP BY. Nó được sử dụng để lọc các nhóm dữ liệu dựa trên hàm tính toán (aggregate function). Mục đích chính của HAVING là lọc các nhóm dữ liệu sau khi đã thực hiện tính toán. Cú pháp của HAVING:
Ví dụ: Từ bảng Product thuộc bộ dữ liệu adventureworks, truy vấn các cột sau: ProductCategoryID, cân nặng trung bình của sản phẩm được lưu dưới tên avg_weight, giá trung bình của sản phẩm được lưu dưới tên avg_list_price. Chỉ hiển thị ProductCategoryID thoả mãn cân nặng trung bình lớn hơn 1000. Giải thích câu lệnh truy vấn:
WHERE và HAVING khác nhau ở đâu?WHERE sử dụng để lọc các hàng của dữ liệu gốc trong khi HAVING sử dụng để lọc các hàng của kết quả sau GROUP BY. Các hàm tính toán (Aggregate Functions) ví dụ: SUM, AVG, MIN, MAX, … chỉ có thể được sử dụng trong câu lệnh HAVING. Ví dụ: Từ bảng thuộc SalesOrderDetail, truy vấn các cột sau SalesOrderID, tổng số đơn hàng, tổng doanh thu và doanh thu trung bình. Lọc điều kiện thoả mãn UnitPriceDiscount = 0 và tổng số đơn hàng lớn hơn bằng 100. Không sử dụng được hàm tính toán (Aggregate Function) trong câu lệnh WHERE nên khi thực hiện truy vấn câu lệnh sẽ báo lỗi. ![A screenshot of a computer Description automatically generated](https://datapot.vn/wp-content/uploads/2023/12/a-screenshot-of-a-computer-description-automatica-24.png) Vì vậy ta phải sử dụng từ khóa (Keyword) HAVING để thực hiện truy vấn. ![A screenshot of a computer Description automatically generated](https://datapot.vn/wp-content/uploads/2023/12/a-screenshot-of-a-computer-description-automatica-25.png) Giải thích câu lệnh truy vấn:
Hàm cửa sổ (Window Functions)Hàm cửa sổ (Window Functions) trong SQL được sử dụng để thực hiện các phép tính toán các dòng có liên quan đến dòng hiện tại. Lệnh truy vấn:
Các hàm cửa sổ phổ biến: ![A diagram of a work flow Description automatically generated](https://datapot.vn/wp-content/uploads/2023/12/a-diagram-of-a-work-flow-description-automaticall.png) Trong phạm vi tài liệu này, chúng ta sẽ tập trung giới thiệu về Ranking Function, hai nhóm hàm còn lại là Aggregate Function và Analytic Function được đưa ra để tham khảo thêm. Hàm xếp hạng (Ranking Functions)Một số hàm xếp hạng phổ biến thường được thấy như:
Dùng để xếp hạng các dòng dữ liệu, nhưng không quan tâm đến giá trị giống nhau. ![A screenshot of a computer Description automatically generated](https://datapot.vn/wp-content/uploads/2023/12/a-screenshot-of-a-computer-description-automatica-26.png) Ví dụ: Từ bảng Product thuộc bộ dữ liệu adventurewoks, truy vấn tên và đánh số thứ tự theo StandardCost. ![A screenshot of a computer Description automatically generated](https://datapot.vn/wp-content/uploads/2023/12/a-screenshot-of-a-computer-description-automatica-27.png) Ví dụ: Từ bảng Product thuộc bộ dữ liệu adventurewoks, truy vấn tên, gom nhóm theo màu sắc và đánh số thứ tự, sắp xếp thứ tự theo StandardCost. ![A screenshot of a computer Description automatically generated](https://datapot.vn/wp-content/uploads/2023/12/a-screenshot-of-a-computer-description-automatica-28.png) Giải thích câu lệnh truy vấn:
Thường được sử dụng để xếp hạng các dòng dữ liệu dựa trên một hoặc nhiều cột. Cú pháp của hàm RANK():
(PARTITION BY) là không bắt buộc.
Ví dụ: Từ bảng dữ liệu Product thuộc bộ dữ liệu Product. Truy vấn Name, StandardCost và xếp hạng dựa trên StandardCost. ![A screenshot of a computer Description automatically generated](https://datapot.vn/wp-content/uploads/2023/12/a-screenshot-of-a-computer-description-automatica-29.png) Giải thích câu lệnh truy vấn:
Đối với các sản phẩm Touring Tire Tube, Mountain Tire Tube, Water Bottle cùng chung 1 xếp hạng là 3 do có chung cùng một mức StandardCost là 1.8863. Khác với Row_Number sẽ đánh lần thứ tự bất kể StandardCost có chung giá trị.
Hàm DENSE_RANK xếp hạng các dòng dữ liệu, nhưng không bỏ qua thứ hạng nếu có các giá trị giống nhau. Ví dụ: Nếu có 2 giá trị lớn nhất, cả hai được xếp hạng là 1 và giá trị tiếp theo xếp hạng thứ 2. Cú pháp của hàm DENSE_RANK:
(PARTITION BY) là không bắt buộc.
Ví dụ: Từ bảng dữ liệu Product thuộc bộ dữ liệu Product. Truy vấn Name, StandardCost và xếp hạng dựa trên StandardCost. ![A screenshot of a computer Description automatically generated](https://datapot.vn/wp-content/uploads/2023/12/a-screenshot-of-a-computer-description-automatica-30.png) Giải thích câu lệnh truy vấn:
Đối với các sản phẩm Touring Tire Tube, Mountain Tire Tube, Water Bottle cùng chung 1 xếp hạng là 3 do có chung cùng một mức StandardCost là 1.8863 và xếp hạng được đánh tiếp theo sẽ là 4 thay vì bị bỏ qua như ROW_NUMBER. Tương tự như ROW_NUMBER thì DENSE_RANK cũng có thể sử dụng kèm với PARTITION BY để phân nhóm dữ liệu và đánh thứ hạng trong từng nhóm. So sánh 3 hàm RANK, DENSE_RANK và ROW_NUMBER.Để phân biệt rõ ràng hơn, ta cùng xem ví dụ sau: Từ bảng SalesLT.Product thuộc bộ dữ liệu adventureworks, truy vấn các cột Name, StandardCost, xếp hạng thứ tự theo hàm RANK, DENSE_RANK và ROW_NUMBER. ![A screenshot of a computer Description automatically generated](https://datapot.vn/wp-content/uploads/2023/12/a-screenshot-of-a-computer-description-automatica-31.png) Giải thích câu lệnh truy vấn:
Bạn có thể tham khảo các hàm xếp hạng khác tại Microsoft Document. Một số hàm tính toán trong hàm cửa sổ (Window Functions) khácHàm tính toán (Aggregate Functions)
Hàm SUM được sử dụng để tính tổng của một cột. Cú pháp của hàm SUM():
Ví dụ: Từ bảng dữ liệu dbo.FactInternetSales và dbo.DimSalesTerritory thuộc bộ dữ liệu AdventureWorksDW2019, kết hợp chung bảng FactInternetSales và DimSalesTerritory. Truy vấn ProductKey, SalesTerritoryCountry, OrderQuantity. Tạo hàm cửa sổ để tính tổng OrderQuantity, sắp xếp theo thứ tự giảm dần của ProductKey. ![A screenshot of a computer Description automatically generated](https://datapot.vn/wp-content/uploads/2023/12/a-screenshot-of-a-computer-description-automatica-32.png) Giải thích câu lệnh truy vấn:
Hàm thống kê (Analytic Functions)Hàm thống kê (Analytic Functions) thường thấy phổ biến như:
Ví dụ: Từ bảng SalesOrderHeader thuộc bộ dữ liệu AdventureWork, truy vấn ngày Order trước và sau của từng đơn hàng so với ngày hạn Khi nào dùng HAVING khi nào dùng WHERE?Sự khác biệt giữa mệnh đề WHERE và mệnh đề HAVing trong SQL Server. Trong câu lệnh SELECT từ khóa HAVING là gì?Mệnh đề HAVING trong Access xác định những bản ghi đã nhóm được hiển thị trong câu lệnh SELECT bằng mệnh đề GROUP BY. Sau khi mệnh đề GROUP BY kết hợp các bản ghi, mệnh đề HAVING sẽ hiển thị mọi bản ghi được nhóm bởi mệnh đề GROUP BY trong đó có thỏa mãn các điều kiện của mệnh đề HAVING. Hầm HAVING là gì?HAVING là một điều kiện được sử dụng trong SQL sau mệnh đề GROUP BY. Nó được sử dụng để lọc các nhóm dữ liệu dựa trên hàm tính toán (aggregate function). Mục đích chính của HAVING là lọc các nhóm dữ liệu sau khi đã thực hiện tính toán. Col_1, Col_2: Cột truy vấn, cột được gộp từ mệnh đề GROUP BY. Câu hỏi truy vấn SQL là gì?Câu lệnh SQL, hoặc truy vấn SQL, là các lệnh hướng dẫn hợp lệ mà hệ thống quản lý cơ sở dữ liệu quan hệ hiểu được. Nhà phát triển phần mềm xây dựng các câu lệnh SQL bằng nhiều phần tử ngôn ngữ SQL khác nhau. |