MySQL Các hàm tổng hợp: SUM, COUNT, AVG & TỐI ĐA

⚡ Tóm tắt thông minh

Hàm tổng hợp trong MySQL Thực hiện phép tính trên nhiều hàng của một cột duy nhất và trả về một giá trị tổng hợp. Năm hàm tiêu chuẩn ISO — COUNT, SUM, AVG, MIN và MAX — là những hàm có chức năng cốt lõi trong hầu hết mọi báo cáo mà cơ sở dữ liệu tạo ra.

  • 🔢 Hành vi ĐẾM: COUNT(column) bỏ qua các giá trị NULL, trong khi COUNT(*) đếm mọi hàng trong bảng, bao gồm cả các hàng trùng lặp và NULL.
  • 🚫 Từ khóa DISTINCT: Tùy chọn DISTINCT loại bỏ các giá trị trùng lặp trước khi thực hiện phép tính; ALL là tùy chọn mặc định và giữ nguyên các giá trị trùng lặp.
  • 📉 Giá trị nhỏ nhất và lớn nhất: Hàm MIN trả về giá trị nhỏ nhất trong một cột và hàm MAX trả về giá trị lớn nhất, áp dụng cho cả kiểu dữ liệu số, chuỗi và ngày tháng.
  • TỔNG và AVG: Cả hai phương pháp đều chỉ hoạt động trên các cột số và đều loại trừ các hàng NULL khỏi kết quả trả về.
  • 📊 NHÓM THEO Ghép cặp: Việc thêm mệnh đề GROUP BY sẽ biến một số liệu tóm tắt duy nhất thành một hàng tóm tắt cho mỗi nhóm.
  • ⚠️ Bẫy NULL: AVG Phép chia chỉ dựa trên số lượng hàng không phải là NULL, do đó các giá trị thiếu sẽ âm thầm làm tăng giá trị trung bình.

Hàm tổng hợp là gì trong MySQL?

An chức năng tổng hợp Đọc nhiều hàng của một cột duy nhất và gộp chúng thành một giá trị. Hàm tổng hợp chủ yếu là về:

  • Thực hiện phép tính trên nhiều hàng
  • Của một cột duy nhất của bảng
  • Và trả về một giá trị duy nhất.

Tiêu chuẩn ISO định nghĩa năm (5) chức năng tổng hợp, cụ thể là:

  1. ĐẾM
  2. TÓM TẮT
  3. AVG
  4. MIN
  5. MAX

Một quy tắc áp dụng cho cả năm quy tắc: Các hàm tổng hợp bỏ qua giá trị NULL. COUNT(*) là trường hợp ngoại lệ duy nhất, và chúng ta sẽ xem xét lý do bên dưới.

Tại sao nên sử dụng hàm tổng hợp

Các cấp bậc trong tổ chức có nhu cầu thông tin khác nhau. Các nhà quản lý cấp cao thường quan tâm đến số liệu tổng thể, chứ không phải các chi tiết riêng lẻ.

Các hàm tổng hợp cho phép chúng ta dễ dàng tạo ra dữ liệu tóm tắt từ cơ sở dữ liệu của mình.

Ví dụ, từ cơ sở dữ liệu myflix của chúng tôi, ban quản lý có thể yêu cầu các báo cáo sau:

  • Phim được thuê ít nhất
  • Phim được thuê nhiều nhất
  • Số lần trung bình mỗi bộ phim được thuê trong một tháng.

Tất cả các báo cáo trên đều được tạo ra từ các hàm tổng hợp. Chúng ta hãy cùng xem xét chi tiết từng hàm.

COUNT hàm

Hàm COUNT trả về tổng số giá trị trong trường được chỉ định, áp dụng cho cả kiểu dữ liệu số và phi số. Giống như mọi hàm tổng hợp khác, COUNT(column) loại trừ các giá trị NULL.

COUNT(*) là một dạng đặc biệt trả về số lượng tất cả các hàng trong một bảng. Nó cũng đếm NULL và trùng lặp, vì nó đếm số hàng chứ không phải giá trị.

Bảng movierentals chứa dữ liệu này:

số tham chiếu Ngày Giao dịch ngày trở lại số thành viên_ id phim phim_ đã quay lại
11 20-06-2012 NULL 1 1 0
12 22-06-2012 25-06-2012 1 2 0
13 22-06-2012 25-06-2012 3 2 0
14 21-06-2012 24-06-2012 2 2 0
15 23-06-2012 NULL 3 3 0

Giả sử chúng ta muốn tìm số lần bộ phim có ID 2 đã được thuê.

SELECT COUNT(`movie_id`) FROM `movierentals` WHERE `movie_id` = 2;

Thực hiện điều này trong MySQL Workbench Khi so sánh với myflixdb, kết quả trả về là 3, vì có ba hàng có movie_id là 2.

COUNT(`movie_id`)
3

Từ khóa DISTINCT

Câu hỏi COUNT trả lời "có bao nhiêu?". Câu hỏi tiếp theo thường là "có bao nhiêu?". khác nhau "những cái", và đó là mục đích của DISTINCT.

Từ khóa DISTINCT

Từ khóa DISTINCT loại bỏ các kết quả trùng lặp bằng cách nhóm chúng lại.ping Các giá trị giống hệt nhau được đặt cạnh nhau, chính xác như hình minh họa ở trên.

Trước tiên, hãy thực hiện một truy vấn đơn giản.

SELECT `movie_id` FROM `movierentals`;
id phim
1
2
2
2
3

Bây giờ, hãy thử truy vấn tương tự với từ khóa DISTINCT:

SELECT DISTINCT `movie_id` FROM `movierentals`;

Lệnh DISTINCT loại bỏ các bản ghi trùng lặp:

id phim
1
2
3

COUNT so với COUNT(*) so với COUNT(DISTINCT): Bạn nên sử dụng cái nào?

DISTINCT cũng có thể được đặt trong một hàm tổng hợp, và đây là điểm mà hầu hết người mới bắt đầu đều mắc sai lầm. tracTrong đó, k hàng thực sự được đếm. Bốn biểu mẫu bên dưới đều chạy trên cùng một bảng cho thuê phim gồm năm hàng được hiển thị trước đó, nhưng chúng không trả về cùng một số. Sự khác biệt nằm ở hai câu hỏi: biểu mẫu đếm hàng hay giá trị, và nó có giữ lại các giá trị trùng lặp không?

Mẫu Điều quan trọng là gì Kết quả tìm kiếm trên movierentals
ĐẾM(*) Mọi hàng, bao gồm cả các hàng trùng lặp và các hàng hoàn toàn là NULL. 5
COUNT(`movie_id`) Mọi giá trị không phải NULL trong cột, bao gồm cả các giá trị trùng lặp. 5
COUNT(`return_date`) Chỉ chấp nhận các giá trị không phải NULL — hai ngày trả về giá trị NULL sẽ bị bỏ qua. 3
ĐẾM(DISTINCT `movie_id`) Chỉ các giá trị duy nhất không phải NULL 3
SELECT COUNT(*) AS `all_rows`,
       COUNT(`return_date`) AS `returned_rows`,
       COUNT(DISTINCT `movie_id`) AS `unique_movies`
FROM `movierentals`;

💡 Mẹo: Sử dụng COUNT(*) để đếm số hàng, COUNT(column) khi NULL có nghĩa là "không áp dụng", và COUNT(DISTINCT column) cho các giá trị duy nhất. Ngược lại với DISTINCT là ALL — mặc định, và do đó hiếm khi được viết ra.

Hàm MIN

Hàm MIN trả về giá trị nhỏ nhất trong trường bảng đã chỉ định.

Giả sử chúng ta muốn tìm năm phát hành của bộ phim cũ nhất trong thư viện của mình. MySQLHàm MIN của 's cung cấp cho chúng ta điều đó.

SELECT MIN(`year_released`) FROM `movies`;

Kết quả:

MIN(`năm_phát_hành`)
2005

Hàm MAX

Đúng như tên gọi, hàm MAX ngược lại với hàm MIN. Nó trả về giá trị lớn nhất từ ​​trường bảng đã chỉ định.

Giả sử chúng ta muốn tìm năm phát hành của bộ phim mới nhất trong cơ sở dữ liệu. Ví dụ sau sẽ trả về thông tin đó.

SELECT MAX(`year_released`) FROM `movies`;

Kết quả:

MAX(`year_released`)
2012

Hàm SUM

MIN và MAX chọn một giá trị hiện có từ một cột. SUM và AVG Tính toán một số mới từ toàn bộ cột.

Giả sử chúng ta muốn biết tổng số tiền đã thanh toán cho đến nay. MySQL TÓM TẮT chức năng Trả về tổng của tất cả các giá trị trong cột được chỉ định.. SUM chỉ hoạt động trên các trường sốCác giá trị NULL sẽ bị loại trừ khỏi kết quả..

Bảng sau đây hiển thị dữ liệu trong bảng thanh toán.

id thanh toán số thành viên_ ngày thanh toán Mô tả số tiền_ đã trả bên ngoài_ số _tham chiếu
1 1 23-07-2012 Thanh toán tiền thuê phim 2500 11
2 1 25-07-2012 Thanh toán tiền thuê phim 2000 12
3 3 30-07-2012 Thanh toán tiền thuê phim 6000 NULL

Truy vấn dưới đây lấy tất cả các khoản thanh toán đã thực hiện và cộng chúng lại thành một kết quả duy nhất: 2500 + 2000 + 6000 = 10500.

SELECT SUM(`amount_paid`) FROM `payments`;

Kết quả:

Tổng (số tiền đã thanh toán)
10500

AVG chức năng

MySQL AVG chức năng trả về giá trị trung bình của các giá trị trong một cột được chỉ định. Cũng giống như hàm SUM, nó chỉ hoạt động trên các kiểu dữ liệu số.

Giả sử chúng ta muốn tìm số tiền trung bình đã thanh toán. Chúng ta có thể sử dụng truy vấn sau, chia tổng số 10500 cho ba dòng thanh toán không phải NULL.

SELECT AVG(`amount_paid`) FROM `payments`;

Kết quả:

AVG(`amount_paid`)
3500

⚠️ Cảnh báo: AVG Phép tính này chia cho số hàng không phải NULL, chứ không phải cho tổng số hàng của bảng. Giá trị NULL sẽ được bỏ qua thay vì tính là 0, điều này âm thầm đẩy giá trị trung bình lên. Hãy sử dụng... AVG(IFNULL(`amount_paid`, 0)) khi giá trị bị thiếu có nghĩa là bằng không.

Ví dụ thực tế: Kết hợp các hàm tổng hợp với mệnh đề GROUP BY

Mỗi hàm trên đều trả về một con số cho toàn bộ bảng. Thêm một NHÓM THEO mệnh đề trả về một con số mỗi nhóm Thay vào đó — và đó mới là cách mà những báo cáo thực sự được xây dựng.

Ví dụ sau đây nhóm các thành viên theo tên, sau đó đếm tổng số lần thanh toán, số tiền thanh toán trung bình và tổng số tiền thanh toán cho mỗi thành viên.

SELECT m.`full_names`,
       COUNT(p.`payment_id`) AS `paymentscount`,
       AVG(p.`amount_paid`) AS `averagepaymentamount`,
       SUM(p.`amount_paid`) AS `totalpayments`
FROM members m, payments p
WHERE m.`membership_number` = p.`membership_number`
GROUP BY m.`full_names`;

Thực hiện ví dụ trên trong MySQL Workbench cho chúng ta các kết quả sau.

AVG Hàm được sử dụng với GROUP BY

Truy vấn kết hợp hai bảng trong mệnh đề WHERE — kiểu kết hợp bằng dấu phẩy cũ. Mã hiện đại viết cùng logic đó dưới dạng một truy vấn tường minh. INNER JOIN … ONCũng cần lưu ý rằng mọi cột không được tổng hợp trong danh sách SELECT phải xuất hiện trong mệnh đề GROUP BY, hoặc MySQL Từ phiên bản 5.7 trở lên, truy vấn sẽ bị từ chối nếu sử dụng ONLY_FULL_GROUP_BY. Xem thêm chính thức MySQL tham chiếu hàm tổng hợp.

Câu Hỏi Thường Gặp

Mệnh đề WHERE Lệnh HAVING lọc các hàng riêng lẻ trước khi tính toán tổng hợp. Lệnh HAVING lọc các kết quả được nhóm sau đó, vì vậy chỉ HAVING mới có thể tham chiếu đến một hàm tổng hợp như COUNT(*) hoặc SUM(amount_paid).

Đúng vậy. Nếu không có mệnh đề GROUP BY, hàm tổng hợp sẽ coi toàn bộ tập kết quả là một nhóm và trả về chính xác một hàng. Việc thêm mệnh đề GROUP BY sẽ chia kết quả đó thành một hàng cho mỗi giá trị nhóm riêng biệt.

Đúng vậy. Không giống như SUM và AVGCác hàm MIN và MAX hoạt động trên mọi kiểu dữ liệu tương đương. Trên cột văn bản, chúng trả về giá trị đầu tiên và cuối cùng theo thứ tự bảng chữ cái, còn trên cột ngày tháng, chúng trả về ngày sớm nhất và muộn nhất.

Đúng vậy. Các công cụ chuyển văn bản thành SQL sẽ dịch các câu hỏi như “mức thanh toán trung bình mỗi thành viên” thành truy vấn GROUP BY. Hãy chạy câu lệnh SQL được tạo ra trong... MySQL Workbench và hãy kiểm tra số lượng hàng trước khi tin tưởng vào các con số.

Nguyên nhân thường gặp là do xử lý giá trị NULL và các hàng kết nối trùng lặp. Mô hình AI có thể chọn COUNT(*) trong khi cần COUNT(column), hoặc kết nối một bảng hai lần, dẫn đến việc tăng giá trị của mỗi phép tính SUM. Luôn luôn kiểm tra lại với một số liệu đã biết.

Tóm tắt bài viết này với: