Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MySQL

Truy vấn MySQL: Lọc sản phẩm có giá trung bình < giá trị cho trước (HAVING AVG)

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ểmWHEREHAVING
LọcHàng đơn lẻ (trước GROUP BY)Nhóm (sau GROUP BY)
Dùng hàm tổng hợpKhôngCó (SUM, AVG, COUNT...)
Ví dụWHERE Price > 10HAVING 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 ý

  • HAVING có thể dùng alias: HAVING avg_price < 35 (MySQL hỗ trợ).
  • Index trên ProductId giúp GROUP BY nhanh.
  • Kiểu dữ liệu INT cho giá → trung bình có thể là decimal. Dùng DECIMAL(10,2) cho tiền tệ thực tế.