BÓC TÁCH CÁC HÀM AGGREGATION: VŨ KHÍ TỔNG HỢP DỮ LIỆU TRONG DATABASE
1. Bản Chất Của Hàm Aggregation Là Gì? (The What)
"Aggregate" trong tiếng Anh có nghĩa là tập hợp, gộp lại. Trong Database, hàm Aggregation là những hàm nhận đầu vào là nhiều dòng (rows) dữ liệu, thực hiện một phép tính toán logic, và trả về một kết quả (single value) duy nhất.
Thay vì lấy ra danh sách 1000 đơn hàng, hàm Aggregation giúp bạn trả lời nhanh câu hỏi: "Tổng doanh thu của 1000 đơn hàng đó là bao nhiêu?"
2. "Ngũ Hổ Tướng" Trong Làng Aggregation (The Core Functions)
Bất kể bạn dùng MySQL, PostgreSQL hay SQL Server, 5 hàm cơ bản sau đây luôn là xương sống của mọi hệ thống báo cáo:
COUNT()- Đếm số lượng:COUNT(*): Đếm tất cả các dòng trong bảng (kể cả dòng chứa giá trịNULL).COUNT(column_name): Chỉ đếm những dòng mà cột đó có dữ liệu (bỏ quaNULL).
SUM()- Tính tổng: Cộng gộp tất cả các giá trị số trong một cột (ví dụ: tính tổng tiền đơn hàng).AVG()- Tính trung bình cộng: Trả về giá trị trung bình (ví dụ: giá trị đơn hàng trung bình của một user).MAX()- Tìm đỉnh: Lấy ra giá trị lớn nhất trong một tập hợp (ví dụ: tìm sản phẩm có giá đắt nhất).MIN()- Tìm đáy: Lấy ra giá trị nhỏ nhất (ví dụ: tìm thời gian login sớm nhất).
3. Sức Mạnh Thực Sự: Kết Hợp Cùng GROUP BY Và HAVING
Nếu chỉ gọi hàm Aggregation đứng một mình, nó sẽ tính toán trên toàn bộ bảng. Sức mạnh thực sự của chúng chỉ bùng nổ khi đi kèm với mệnh đề GROUP BY.
GROUP BY giúp chia dữ liệu thành các "thùng" (buckets) nhỏ theo một tiêu chí nào đó, sau đó hàm Aggregation sẽ chạy độc lập trên từng "thùng".
Ví dụ thực tế:
Bạn muốn biết: Mỗi một người dùng (user_id) đã chi tổng cộng bao nhiêu tiền, và chỉ lấy những người chi trên 1.000.000 VNĐ?
SELECT user_id, SUM(total_price) as total_spent
FROM orders
GROUP BY user_id
HAVING total_spent > 1000000;
Nguyên tắc cốt lõi: Bạn KHÔNG THỂ dùng mệnh đề
WHEREđể lọc kết quả của hàm Aggregation (vìWHEREchạy trước khi gom nhóm). Để lọc kết quả sau khi đã tính tổng/đếm, bắt buộc phải dùngHAVING.
4. Góc Nhìn Kỹ Sư Hệ Thống (Performance Warning)
Dưới góc nhìn của một người làm Backend và thiết kế hệ thống, các hàm Aggregation là con dao hai lưỡi:
- Sát thủ CPU: Các hàm như
SUM()hayAVG()trên một bảng có hàng chục triệu record sẽ quét toàn bộ dữ liệu (Table Scan) nếu không được đánh Index đúng cách, làm CPU của Database Server tăng vọt lên 100% và gây sập hệ thống (Downtime). - Row-level Locking: Khi chạy các query thống kê nặng vào giờ cao điểm, nó có thể khóa (lock) các row khiến các thao tác
INSERT/UPDATEcủa user khác bị treo.
Giải pháp thường dùng trong kiến trúc High-Concurrency:
Không ai chạy hàm Aggregation trực tiếp trên Database chính (Master DB) vào lúc hệ thống đang đông người. Người ta thường:
- Đồng bộ dữ liệu sang một Database chuyên đọc (Read Replica) hoặc Data Warehouse (như Elasticsearch) rồi mới chạy Aggregation.
- Lưu trước các con số tổng này vào bộ nhớ đệm (Redis) hoặc dùng Materialized Views trong PostgreSQL để update định kỳ.
💡 Lời Kết
Các hàm Aggregation là công cụ không thể thiếu để biến những dòng dữ liệu thô (Raw Data) thành những thông tin kinh doanh có giá trị (Insights). Hiểu rõ cách chúng hoạt động cũng như vòng đời thực thi (WHERE -> GROUP BY -> Aggregation -> HAVING) sẽ giúp bạn viết ra những câu query sắc bén và tối ưu nhất.
All rights reserved