介绍
在 SQL 查询语言中,GROUP BY 子句可用于将行分组为汇总行,它将针对每个组执行聚合函数,并可选择为每个组添加一个摘要行。当然, GROUP BY 子句可以与 ORDER BY 子句结合使用,以按升序或降序对组条目进行排序。在本文中,我们将讨论 GROUP BY 子句,明确其列表中的列名和 WITH ROLLUP 修饰符的排序顺序(ASC 或 DESC)如何影响其摘要输出。
什么是 GROUP BY?
在 SQL 中,GROUP BY 子句是按照列名或表达式创建汇总行的子句。可以在通过选择列中的唯一值,或者在通过使用操作符,表达式或函数从列中派生不同的值的情况下创建这些汇总行。可以使用各种聚合函数(如 SUM,COUNT,AVG)在列上运行,以汇总组或结果集的值。
为了理解 GROUP BY,我们可以看一下下面的示例:
假设我们有一个客户订单表。 该表列出了日期,产品,订单数量,单价和订单总价。
以下是数据的示例表:
CREATE TABLE orders (
order_date DATE,
product VARCHAR(100),
quantity INT,
price DECIMAL(5,2),
total DECIMAL(8,2)
);
INSERT INTO orders (order_date, product, quantity, price, total) VALUES
('2020-01-01', 'product A', 5, 10.00, 50.00),
('2020-01-02', 'product B', 3, 15.00, 45.00),
('2020-01-03', 'product C', 2, 20.00, 40.00),
('2020-01-03', 'product A', 6, 10.00, 60.00),
('2020-01-04', 'product B', 1, 15.00, 15.00),
('2020-01-05', 'product B', 4, 15.00, 60.00);
现在我们想要根据日期对数据进行汇总。 我们可以使用以下查询:
SELECT order_date, SUM(quantity), SUM(total)
FROM orders
GROUP BY order_date;
这将返回以下结果:
+------------+--------------+--------------+
| order_date | SUM(quantity)| SUM(total) |
+------------+--------------+--------------+
| 2020-01-01 | 5 | 50.00 |
| 2020-01-02 | 3 | 45.00 |
| 2020-01-03 | 8 | 100.00 |
| 2020-01-04 | 1 | 15.00 |
| 2020-01-05 | 4 | 60.00 |
+------------+--------------+--------------+
如您所见,这个查询按照日期对订单表进行了分组,并对每个组中的总数量和总金额进行了汇总。
这是一个简单的示例。 实际使用中,可以创建包含多个表和列的查询,如 JOIN,WHERE,HAVING等。
使用 ORDER BY 子句
ORDER BY 子句用于按指定方式对查询结果进行排序。 它支持升序和降序排序,并且可用于任何 SELECT 查询。 我们可以将其与 GROUP BY 子句结合使用,以按升序或降序对组条目进行排序。
以下是用于按 order_date 汇总和排序的查询:
SELECT order_date, SUM(quantity), SUM(total)
FROM orders
GROUP BY order_date
ORDER BY order_date DESC;
此查询返回以下结果:
+------------+--------------+--------------+
| order_date | SUM(quantity)| SUM(total) |
+------------+--------------+--------------+
| 2020-01-05 | 4 | 60.00 |
| 2020-01-04 | 1 | 15.00 |
| 2020-01-03 | 8 | 100.00 |
| 2020-01-02 | 3 | 45.00 |
| 2020-01-01 | 5 | 50.00 |
+------------+--------------+--------------+
在上面的查询中,使用了 ORDER BY 子句来按照 order_date 列的降序对结果进行排序。 这样,从最近的日期到最早的日期对结果进行排序。
使用 WITH ROLLUP 子句
WITH ROLLUP 用于扩展 GROUP BY 查询并添加总行。 它默认在查询的末尾执行汇总,并将在每个组的末尾添加一个总行。
以下是示例查询:
SELECT order_date, product, SUM(quantity), SUM(total)
FROM orders
GROUP BY order_date, product
WITH ROLLUP;
此查询将返回以下结果:
+------------+-------------+--------------+--------------+
| order_date | product | qty_sum | total_sum |
+------------+-------------+--------------+--------------+
| 2020-01-01 | product A | 5 | 50.00 |
| 2020-01-02 | product B | 3 | 45.00 |
| 2020-01-03 | product C | 2 | 40.00 |
| 2020-01-03 | product A | 6 | 60.00 |
| 2020-01-04 | product B | 1 | 15.00 |
| 2020-01-05 | product B | 4 | 60.00 |
| NULL | NULL | 21 | 270.00 |
+------------+-------------+--------------+--------------+
在上面的查询中,使用 GROUP BY 向查询添加了两个列,以按日期和产品进行分组,并根据这些组中的订单数量和总金额汇总了查询结果。 使用 WITH ROLLUP 向结果添加了一个汇总行,其中包含所有分组的总计。
使用 ORDER BY 和 WITH ROLLUP
现在,我们来看看在 GROUP BY 列表中的列名和 WITH ROLLUP 修饰符的排序顺序如何影响其摘要输出。
以下是示例查询:
SELECT order_date, product, SUM(quantity), SUM(total)
FROM orders
GROUP BY order_date, product
WITH ROLLUP
ORDER BY order_date DESC, product ASC;
此查询将返回以下结果:
+------------+-------------+--------------+--------------+
| order_date | product | qty_sum | total_sum |
+------------+-------------+--------------+--------------+
| 2020-01-05 | product B | 4 | 60.00 |
| 2020-01-04 | product B | 1 | 15.00 |
| 2020-01-03 | product A | 6 | 60.00 |
| 2020-01-03 | product C | 2 | 40.00 |
| 2020-01-02 | product B | 3 | 45.00 |
| 2020-01-01 | product A | 5 | 50.00 |
| NULL | NULL | 21 | 270.00 |
+------------+-------------+--------------+--------------+
在上面的查询中,ORDER BY 子句按照 order_date 逆序排序,然后按照 product 字母顺序排序。 GROUP BY 子句按照 order_date 和 product 列分组,使用 ROLLUP 汇总,在每个组的结尾附加一个总行。
需要注意的是,当使用 WITH ROLLUP 时,ORDER BY 子句的顺序很重要。 它将影响最终的摘要行。
总结
在 SQL 查询语言中,GROUP BY 子句可用于将行分组为汇总行,它将针对每个组执行聚合函数,并可选择为每个组添加一个摘要行。可以将 ORDER BY 子句与 GROUP BY 子句结合使用以按升序或降序对组条目进行排序。使用 WITH ROLLUP 修饰符可向结果添加一个汇总行,其中包含所有分组的总计。在使用 ORDER BY 和 WITH ROLLUP 时,子句的顺序很重要,这将影响最终的摘要输出。
最后,我们提醒使用者,了解 GROUP BY 子句及其使用方式,有助于 SQL 查询和数据分析,从而为数据处理提供更大的灵活性和控制。