Tìm Hiểu Về Mệnh đề GROUP BY Và HAVING Trong MySQL
Có thể bạn quan tâm
Khi tiến hành truy vấn hay tính toán trên SQL, sẽ có những lúc chúng ta muốn nhóm các hàng trong một tập kết quả dựa trên một cột hoặc nhiều cột. Lúc này, chúng ta sẽ sử dụng câu lệnh GROUP BY trong SQL.
Vậy định nghĩa, cách dùng và ứng dụng của GROUP BY trong thực tế như thế nào? Cùng Gitiho tìm hiểu trong bài viết ngày hôm nay nhé!
XEM NHANH BÀI VIẾT
- 1 Mệnh đề GROUP BY trong SQL là gì?
- 2 Ví dụ về mệnh đề GROUP BY trong SQL
- 3 Kết luận
Mệnh đề GROUP BY trong SQL là gì?
Mệnh đề GROUP BY là một lệnh SQL được sử dụng để nhóm các hàng có cùng một bản ghi thuộc một trường nhất định nào đó.
GROUP BY là mệnh đề tùy chọn và thường được sử dụng cùng với các hàm tổng hợp với mục đích tạo các báo cáo tóm tắt từ cơ sở dữ liệu như hàm MAX, MIN, hàm SUM, AVG, COUNT trong SQL. Nó thường được sử dụng với câu lệnh SELECT trong SQL.
Các câu truy vấn có chứa mệnh đề GROUP BY được gọi là các truy vấn nhóm và chỉ trả về một hàng cho mỗi mục được nhóm.
Cú pháp GROUP BY trong SQL:
SELECT column1, column2,... FROM table_name WHERE condition GROUP BY column1, column2,... HAVING condition ORDER BY column1, column2,...Trong đó:
- SELECT column1, column2: Chọn các cột bạn muốn hiển thị trong bảng dữ liệu.
- FROM table_name: Chỉ định bảng mà bạn muốn truy vấn dữ liệu trong database.
- WHERE condition: Lọc dữ liệu trước khi thực hiện việc nhóm (không bắt buộc).
- GROUP BY column1, column2: Nhóm các hàng có cùng giá trị trong column1, column2 lại với nhau. Bạn có thể nhóm theo một hoặc nhiều cột.
- HAVING condition: Áp dụng điều kiện để lọc các nhóm sau khi đã được nhóm lại (không bắt buộc). Khác với WHERE trong SQL, HAVING trong SQL được sử dụng sau khi dữ liệu đã được nhóm để giới hạn kết quả truy vấn.
- ORDER BY column1, column2: Sắp xếp kết quả truy vấn theo các cột đã chỉ định (không bắt buộc).
Ví dụ về mệnh đề GROUP BY trong SQL
Mệnh đề GROUP BY với hàm SUM
Yêu cầu 1: Tính tổng doanh thu và chi phí theo từng số đơn hàng của trường SalesOrderNumber. Dữ liệu được lấy từ bảng sales trong database.
Ta có công thức sau:
select SUM(sales), SUM(cost) from sales GROUP BY SalesOrderNumberKhi chạy công thức trên, bạn sẽ thu được hơn 900 bản ghi trong 2 cột. Một cột là tổng doanh thu, một cột là tổng chi phí theo Số đơn đặt hàng.
Tuy nhiên, khi nhìn vào kết quả thì chúng ta khó có thể phân biệt đâu là cột doanh thu, đâu là cột chi phí. Đó, bạn sẽ đặt tên cho cột ở phần công thức như sau:
select SUM(sales) as total_sales, SUM(cost) as total_costs from sales GROUP BY SalesOrderNumberKhi chạy công thức, chúng ta đã có 2 cột tương ứng với tổng doanh thu và tổng chi phí theo từng SalesOrderNumber.
Trong trường hợp, bạn muốn nhìn thấy chi tiết từng SalesOrderNumber có tổng doanh thu và chi phí như nào thì chúng ta sẽ thêm trường SalesOrderNumber vào câu lệnh Select như sau:
select SalesOrderNumber, SUM(sales) as total_sales, SUM(cost) as total_costs from sales GROUP BY SalesOrderNumberBây giờ kết quả đã hiển thị rõ từng SalesOrderNumber để bạn tiện theo dõi và phân tích số liệu như sau:
Yêu cầu 2: Tính tổng doanh thu và chi phí theo từng Customer_ID (theo tên là total_sales và total_costs). Sau đó sắp xếp cột Customer_ID theo thứ tự giảm dần.
Với yêu cầu này, chúng ta sẽ sử dụng kết hợp toán tử ORDER BY trong SQL để sắp xếp dữ liệu như mong muốn. Công thức như sau:
select CustomerID, SUM(sales) as total_sales, SUM(cost) as total_costs from sales GROUP BY CustomerID ORDER BY CustomerID DESCCho chạy công thức, chúng ta sẽ nhận được kết quả hơn 1000 bản ghi chứa Customer_ID tương ứng với tổng doanh thu và chi phí bên cạnh.
Yêu cầu 3: Tính tổng doanh thu và chi phí theo từng tháng (month) và sắp xếp theo thứ tự tăng dần.
Chúng ta sẽ thực hiện nhóm và tính toán theo từng tháng trước:
select Month, SUM(sales) as total_sales, SUM(cost) as total_costs from sales GROUP BY Month ORDER BY Month ASCChạy công thức, chúng ta sẽ thấy được tổng doanh thu và chi phí theo từng tháng như sau:
Mệnh đề GROUP BY với hàm COUNT
Yêu cầu 4: Đếm tất cả khách hàng theo từng Geographykey trong bảng dữ liệu Customer_Info.
select Geographykey, count(CustomerID) as number_of_customers from Customer_Info GROUP BY GeographykeyCho chạy công thức, chúng ta sẽ thấy được tổng số khách hàng theo từng khu vực địa lý (Geographykey) như sau:
Để hiểu rõ hơn về GROUP BY và những cú pháp, câu lệnh hay hàm khác trong SQL, bạn hãy nhanh tay đăng ký khóa học SQL sau của Gitiho:
SQLG01 - Truy vấn dữ liệu với SQL
Nimbus Academy 399,000đ 1,499,000đ Đăng ký Học thử
Mệnh đề GROUP BY với hàm AVG
Yêu cầu 5: Tính trung bình số trẻ em, số ô tô sở hữu và thu nhập hàng năm của từng trường Geographykey trong bảng Customer_Info.
Bạn viết công thức sau:
select Geographykey, AVG(TotalChildren) as avg_of_children, AVG(NumberCarsOwned) as avg_of_cars, AVG(YearlyIncome) as avg_of_income from Customer_Info GROUP BY Geographykey ORDER BY GeographykeyChạy công thức này, bạn sẽ tính được trung bình số trẻ em, ô tô sở hữu, và thu nhập hàng năm theo từng vùng địa lý.
Yêu cầu 6: Hiển thị Tên thành phố trong bảng dữ liệu Geographic, tên Geographykey và thu nhập bình quân hàng năm của từng Geographykey trong bảng dữ liệu Customer_info.
Vì tên thành phố City và thu nhập bình quân năm theo từng Geographykey không thuộc cùng một bảng dữ liệu. Do đó, chúng ta cần phải tham chiếu các Geographykey tương ứng với từng tên thành phố City trong bảng Geographic. Để làm được, chúng ta sẽ sử dụng kết hợp câu lệnh LEFT JOIN trong SQL.
With avg_income as (select Geographykey, AVG(YearlyIncome) as avg_of_income from Customer_Info GROUP BY Geographykey) select Geographic.City, avg_income.GeographyKey, avg_income.avg_of_income FROM avg_income LEFT JOIN Geographic ON avg_income.GeographyKey=Geographic.GeographyKeyTrong đó:
- WITH avg_income AS ...: là câu lệnh để tạo một bảng tạm (CTE) tên là avg_income chứa kết quả của một truy vấn (thu nhập trung bình của từng Geographykey)..
- select Geographic.City, avg_income.GeographyKey, avg_income.avg_of_income FROM avg_income: câu lệnh gọi trường dữ liệu City từ bảng Geographic, GeographyKey từ bảng tạm avg_income và avg_of_income từ avg_income.
- LEFT JOIN Geographic ON avg_income.GeographyKey = Geographic.GeographyKey: Kết hợp bảng tạm avg_income với bảng Geographic để lấy thông tin chi tiết về vùng, ngay cả khi không có kết quả khớp trong Geographic.
Chạy công thức chúng ta sẽ thu được các bản ghi như mong muốn:
Kết luận
Qua hướng dẫn trên, chúng ta đã biết mệnh đề GROUP BY trong SQL được sử dụng để nhóm các hàng có cùng một giá trị. Cùng Gitiho thực hành thêm để hiểu rõ hơn về cách sử dụng câu lệnh này trong thực tế nha. Chúc bạn thành công!
Xem thêm:
Hướng dẫn câu lệnh UPDATE trong MySQL và các ví dụ
Từ khóa » Câu Lệnh Group By Trong Mysql
-
Mệnh đề GROUP BY Trong MySQL - Học MySQL Online - VietTuts
-
Group By Trong MySQL
-
GROUP BY Trong MySQL | Nhóm Các Hàng Có Cùng Giá Trị Lại Với Nhau
-
GROUP BY Trong MySQL - Học PHP - CodeGym
-
Mệnh đề GROUP BY Trong MySQL - Hoclaptrinh
-
[MySQL 12] MySQL GROUP BY Và HAVING - Code Lean
-
Lệnh GROUP BY Trong SQL
-
Mệnh đề GROUP BY Trong MySQL
-
Mệnh đề GROUP BY Và HAVING Trong SQL Với Các Ví Dụ - SoftGeek
-
[Web] Tìm Dữ Liệu Trùng Lặp Trong MySQL
-
Mệnh đề GROUP BY Trong MySQL
-
MySQL Từ đơn Giản đến Phức Tạp - Viblo
-
Hàm SUM Trong MySQL - Vi
-
Sửa Các Câu Lệnh SQL để Tinh Chỉnh Kết Quả Truy Vấn