Giới thiệu
Sử dụng GROUP BY theo ProductId và HAVING AVG(ProductPrice) < 35 để chỉ giữ các nhóm sản phẩm có giá trung bình nhỏ hơn 35.
Ví dụ thực hành
1. Tạo bảng DemoTable848
mysql> CREATE TABLE DemoTable848 (
ProductId INT,
ProductPrice INT
);
2. Chèn dữ liệu (ProductId 100 có 3 giá: 30,40,20 → TB=30; ProductId 101 có 2 giá: 50,25 → TB=37.5)
mysql> INSERT INTO DemoTable848 VALUES
(100,30),(101,50),(100,40),(101,25),(100,20);
3. Truy vấn: ProductId có AVG(ProductPrice) < 35
mysql> SELECT ProductId, AVG(ProductPrice)
FROM DemoTable848
GROUP BY ProductId
HAVING AVG(ProductPrice) < 35;
4. Kết quả
+-----------+-------------------+
| ProductId | avg(ProductPrice) |
+-----------+-------------------+
| 100 | 30.0000 |
+-----------+-------------------+
Giải thích WHERE vs HAVING
| Đặc điểm | WHERE | HAVING |
|---|---|---|
| Lọc | Hàng đơn lẻ (trước GROUP BY) | Nhóm (sau GROUP BY) |
| Dùng hàm tổng hợp | Không | Có (SUM, AVG, COUNT...) |
| Ví dụ | WHERE Price > 10 | HAVING AVG(Price) > 10 |
Mở rộng
-- Lấy cả số lượng bản ghi mỗi sản phẩm
SELECT ProductId, COUNT(*) AS cnt, AVG(ProductPrice) AS avg_price
FROM DemoTable848
GROUP BY ProductId
HAVING AVG(ProductPrice) < 35
ORDER BY avg_price DESC;
Lưu ý
HAVINGcó thể dùng alias:HAVING avg_price < 35(MySQL hỗ trợ).- Index trên
ProductIdgiúpGROUP BYnhanh. - Kiểu dữ liệu
INTcho giá → trung bình có thể là decimal. DùngDECIMAL(10,2)cho tiền tệ thực tế.