MySQL 如何在一个MySQL查询中使用GROUP BY、HAVING和ORDER BY显示和特定范围之间的总和记录?
在MySQL中,使用GROUP BY、HAVING和ORDER BY可以对查询结果进行分组、筛选和排序。有时我们需要在一个查询中同时使用这三个操作,例如在一个商品销售数据表中,查询每个销售员销售额在1000到5000之间的商品销售记录,并按销售员和销售额进行升序排序。本文将介绍如何在MySQL中使用GROUP BY、HAVING和ORDER BY实现这个目标。
阅读更多:MySQL 教程
数据准备
我们假设有一个商品销售数据表sales,其中包含以下字段:销售ID(sale_id,主键)、销售员ID(salesperson_id)、销售金额(amount)。我们先创建并插入一些测试数据:
CREATE TABLE sales (
sale_id INT AUTO_INCREMENT PRIMARY KEY,
salesperson_id INT,
amount DECIMAL(8,2)
);
INSERT INTO sales (salesperson_id, amount) VALUES
(1, 1000.00), (1, 2000.00), (2, 3000.00), (3, 4000.00), (4, 5000.00),
(3, 6000.00), (4, 7000.00), (4, 8000.00), (5, 9000.00), (5, 10000.00);
查询分析
我们需要查询每个销售员销售额在1000到5000之间的商品销售记录,并按销售员和销售额进行升序排序。
首先,我们需要对销售记录进行分组,以便统计每个销售员的销售额。GROUP BY语句可以实现这个功能,我们选择以salesperson_id为分组字段:
SELECT salesperson_id, SUM(amount) AS total_amount
FROM sales
GROUP BY salesperson_id;
执行以上语句,我们可以得到以下结果:
salesperson_id | total_amount |
---|---|
1 | 3000.00 |
2 | 3000.00 |
3 | 10000.00 |
4 | 20000.00 |
5 | 19000.00 |
接下来,我们需要筛选出销售额在1000到5000之间的记录。由于HAVING语句可以对分组后的结果进行筛选,我们可以在GROUP BY语句之后添加HAVING语句来实现:
SELECT salesperson_id, SUM(amount) AS total_amount
FROM sales
GROUP BY salesperson_id
HAVING total_amount BETWEEN 1000 AND 5000;
执行以上语句,我们可以得到以下结果:
salesperson_id | total_amount |
---|---|
1 | 3000.00 |
2 | 3000.00 |
最后,我们需要按销售员和销售额进行升序排序。ORDER BY语句可以实现这个功能,我们选择按salesperson_id和total_amount字段升序排序:
SELECT salesperson_id, SUM(amount) AS total_amount
FROM sales
GROUP BY salesperson_id
HAVING total_amount BETWEEN 1000 AND 5000
ORDER BY salesperson_id, total_amount ASC;
执行以上语句,我们可以得到以下结果:
salesperson_id | total_amount |
---|---|
1 | 3000.00 |
2 | 3000.00 |
结论
在MySQL中,使用GROUP BY、HAVING和ORDER BY可以对查询结果进行分组、筛选和排序。在查询时,可以先使用GROUP BY语句对数据进行分组,然后再使用HAVING语句对分组后的结果进行筛选,最后使用ORDER BY语句对结果进行排序。通过以上示例,我们可以清晰地了解这三个关键字的使用方法。