MySQL Truy Vấn Thống Kê
Truy vấn thống kê trong MySQL là một phần quan trọng giúp chúng ta phân tích và hiểu rõ hơn về dữ liệu. Việc sử dụng các câu lệnh SQL như COUNT()
, SUM()
, AVG()
, MAX()
, MIN()
, GROUP BY
và HAVING
sẽ giúp lấy thông tin tổng hợp từ cơ sở dữ liệu một cách hiệu quả. Trong bài viết này, chúng ta sẽ tìm hiểu về các kỹ thuật truy vấn thống kê với 10 ví dụ cụ thể.
Tạo bảng dữ liệu
Câu lệnh tạo bảng customers
CREATE TABLE customers (
customer_id INT PRIMARY KEY,
name VARCHAR(255) NOT NULL
);
Câu lệnh tạo bảng orders
CREATE TABLE orders (
order_id INT PRIMARY KEY,
customer_id INT,
order_date DATE,
total_amount DECIMAL(10,2),
FOREIGN KEY (customer_id) REFERENCES customers(customer_id)
);
Câu lệnh tạo bảng order_details
CREATE TABLE order_details (
detail_id INT PRIMARY KEY,
order_id INT,
product_id INT,
quantity INT,
FOREIGN KEY (order_id) REFERENCES orders(order_id)
);
Bảng dữ liệu mẫu
Bảng customers
customer_id | name |
---|---|
1 | Nguyễn Văn A |
2 | Trần Thị B |
3 | Lê Văn C |
Câu lệnh INSERT cho bảng customers
INSERT INTO customers (customer_id, name) VALUES
(1, 'Nguyễn Văn A'),
(2, 'Trần Thị B'),
(3, 'Lê Văn C');
Bảng orders
order_id | customer_id | order_date | total_amount |
---|---|---|---|
1 | 1 | 2024-01-10 | 500000 |
2 | 2 | 2024-02-15 | 750000 |
3 | 1 | 2024-03-20 | 300000 |
4 | 3 | 2024-04-25 | 650000 |
5 | 2 | 2024-05-30 | 850000 |
Câu lệnh INSERT cho bảng orders
INSERT INTO orders (order_id, customer_id, order_date, total_amount) VALUES
(1, 1, '2024-01-10', 500000),
(2, 2, '2024-02-15', 750000),
(3, 1, '2024-03-20', 300000),
(4, 3, '2024-04-25', 650000),
(5, 2, '2024-05-30', 850000);
Bảng order_details
detail_id | order_id | product_id | quantity |
---|---|---|---|
1 | 1 | 101 | 2 |
2 | 1 | 102 | 1 |
3 | 2 | 103 | 3 |
4 | 3 | 101 | 1 |
5 | 4 | 104 | 2 |
6 | 5 | 103 | 4 |
Câu lệnh INSERT cho bảng order_details
INSERT INTO order_details (detail_id, order_id, product_id, quantity) VALUES
(1, 1, 101, 2),
(2, 1, 102, 1),
(3, 2, 103, 3),
(4, 3, 101, 1),
(5, 4, 104, 2),
(6, 5, 103, 4);
1. Đếm số lượng bản ghi (COUNT
)
Ví dụ 1: Đếm tổng số khách hàng
SELECT COUNT(*) AS total_customers FROM customers; // Output 10
Giải thích:
-
COUNT(*)
đếm tất cả các dòng trong bảngcustomers
. -
AS total_customers
đặt tên cột kết quả.

2. Tính tổng (SUM
)
Ví dụ 2: Tổng doanh thu từ đơn hàng
SELECT SUM(total_amount) AS total_revenue FROM orders; // Output 3050000.0
Giải thích:
-
SUM(total_amount)
tính tổng giá trị cộttotal_amount
trong bảngorders
.
3. Tính trung bình (AVG
)
Ví dụ 3: Trung bình số tiền đơn hàng
SELECT AVG(total_amount) AS average_order FROM orders; // Output 610000.0
Giải thích:
-
AVG(total_amount)
tính giá trị trung bình củatotal_amount
.
4. Tìm giá trị lớn nhất (MAX
)
Ví dụ 4: Đơn hàng có giá trị cao nhất
SELECT MAX(total_amount) AS max_order FROM orders; // Output 850000.0
Giải thích:
-
MAX(total_amount)
trả về giá trị lớn nhất trong cộttotal_amount
.
5. Tìm giá trị nhỏ nhất (MIN
)
Ví dụ 5: Đơn hàng có giá trị thấp nhất
SELECT MIN(total_amount) AS min_order FROM orders; // Output 300000.0
Giải thích:
-
MIN(total_amount)
trả về giá trị nhỏ nhất trong cộttotal_amount
.
6. Thống kê theo nhóm (GROUP BY
)
Ví dụ 6: Số đơn hàng theo khách hàng
SELECT customer_id, COUNT(*) AS order_count FROM orders GROUP BY customer_id;
// Output kết quả:

Giải thích:
-
GROUP BY customer_id
nhóm dữ liệu theo khách hàng. -
COUNT(*)
đếm số đơn hàng cho từng khách hàng.
7. Sử dụng điều kiện trong thống kê (HAVING
)
Ví dụ 7: Tìm khách hàng có trên 5 đơn hàng
SELECT customer_id, COUNT(*) AS order_count
FROM orders GROUP BY customer_id HAVING COUNT(*) > 5;
Giải thích:
-
HAVING COUNT(*) > 5
lọc chỉ các khách hàng có hơn 5 đơn hàng.
8. Thống kê doanh thu theo tháng
Ví dụ 8: Tổng doanh thu theo tháng
SELECT MONTH(order_date) AS month, SUM(total_amount) AS total_revenue
FROM orders GROUP BY MONTH(order_date);
// Output kết quả truy vấn doanh thu theo tháng

Giải thích:
-
MONTH(order_date)
trích xuất tháng từorder_date
. -
SUM(total_amount)
tính tổng doanh thu theo tháng.
9. Tìm sản phẩm bán chạy nhất
Ví dụ 9: Sản phẩm có số lượng bán nhiều nhất
SELECT product_id, SUM(quantity) AS total_sold
FROM order_details
GROUP BY product_id ORDER BY total_sold DESC LIMIT 1;
// Ouput
product_id = 103
total_sold = 7
Giải thích:
-
SUM(quantity)
tính tổng số lượng bán cho từng sản phẩm. -
ORDER BY total_sold DESC
sắp xếp giảm dần. -
LIMIT 1
lấy sản phẩm bán chạy nhất.
10. Tính phần trăm đóng góp của từng sản phẩm
Ví dụ 10: Tỷ lệ % doanh thu từng sản phẩm
SELECT od.product_id, SUM(o.total_amount) / (SELECT SUM(total_amount) FROM orders) * 100 AS revenue_percentage
FROM orders o
JOIN order_details od ON o.order_id = od.order_id
GROUP BY od.product_id;
// Output kế quả truy vấn tính tỷ lệ % doanh thu từng sản phẩm

Giải thích:
-
JOIN order_details od ON o.order_id = od.order_id
kết hợp bảngorders
vàorder_details
. -
SUM(o.total_amount) / (SELECT SUM(total_amount) FROM orders) * 100
tính phần trăm doanh thu của từng sản phẩm. -
GROUP BY od.product_id
nhóm theoproduct_id
để tính doanh thu cho từng sản phẩm.
KẾT LUẬN
Truy vấn thống kê giúp phân tích dữ liệu trong MySQL một cách hiệu quả. Các kỹ thuật quan trọng bao gồm:
-
Đếm số lượng (
COUNT
) để biết tổng số bản ghi. -
Tính tổng (
SUM
) để xác định doanh thu. -
Tính trung bình (
AVG
) để xem xu hướng dữ liệu. -
Tìm giá trị lớn nhất/nhỏ nhất (
MAX/MIN
) để xác định mức cao/thấp. -
Nhóm dữ liệu (
GROUP BY
) để phân loại dữ liệu. -
Lọc dữ liệu thống kê (
HAVING
) để áp dụng điều kiện.
Bằng cách kết hợp các kỹ thuật này, bạn có thể xây dựng các báo cáo phân tích dữ liệu mạnh mẽ trong MySQL.