Skip to content

sql-group-by-vs-order-by

SQL:使用 GROUP BY 聚合 vs. 使用 ORDER BY 排序

Section titled “SQL:使用 GROUP BY 聚合 vs. 使用 ORDER BY 排序”

Two of the most fundamental clauses in SQL for data analysis are GROUP BY and ORDER BY. While they both help organize your results, they serve very different purposes. GROUP BY aggregates rows into summaries, while ORDER BY sorts the final output.

我们将使用一个 Sales 表作为示例。

CREATE TABLE Sales (
sale_id SERIAL PRIMARY KEY,
product_category VARCHAR(50),
region VARCHAR(50),
sale_amount NUMERIC(10, 2),
sale_date DATE
);
INSERT INTO Sales (product_category, region, sale_amount, sale_date) VALUES
('Electronics', 'North', 1200.00, '2023-10-01'),
('Books', 'South', 75.50, '2023-10-02'),
('Electronics', 'North', 850.00, '2023-10-03'),
('Clothing', 'West', 250.00, '2023-10-03'),
('Books', 'North', 120.00, '2023-10-04'),
('Electronics', 'South', 1500.00, '2023-10-05);

GROUP BY 子句用于将相同的数据排列成组。其主要目的是与聚合函数(如 COUNT()、SUM()、AVG())一起使用,以便对每个组执行计算。

GROUP BY 的黄金法则:在使用 GROUP BY 时,你的 SELECT 语句中的任何列都必须是 GROUP BY 子句的一部分,或者被用在聚合函数内部。

让我们按 product_category 对行进行分组,并计算每个类别的总销售额。

SELECT
product_category,
SUM(sale_amount) AS total_sales
FROM Sales
GROUP BY product_category;

GROUP BY 将“Electronics”和“Books”的多行数据合并为单个摘要行:

product_categorytotal_sales
Clothing250.00
Books195.50
Electronics3550.00

ORDER BY 子句用于对查询的最终结果集进行排序。它不会改变数据或返回的行数;它只影响呈现顺序。你可以按升序(ASC,默认)或降序(DESC)排序。

要列出所有单笔销售,从大到小排列:

SELECT product_category, region, sale_amount
FROM Sales
ORDER BY sale_amount DESC;

这会重新排列表中的所有六行,而不对其进行分组。

你可以而且通常会同时在单个查询中使用这两个子句。GROUP BY 首先执行聚合,然后 ORDER BY 对生成的摘要行进行排序。查询的逻辑执行顺序是:FROM -> WHERE -> GROUP BY -> HAVING -> SELECT -> ORDER BY。

示例:按总销售额对类别进行排名

Section titled “示例:按总销售额对类别进行排名”

让我们找出每个类别的总销售额,然后按利润从高到低列出这些类别。

SELECT
product_category,
SUM(sale_amount) AS total_sales
FROM Sales
GROUP BY product_category
ORDER BY total_sales DESC;

查询首先进行分组并计算总和,然后对这些结果进行排序:

product_categorytotal_sales
Electronics3550.00
Clothing250.00
Books195.50

关于 HAVING 的简要说明:WHERE 在分组 之前 筛选行,而 HAVING 在组创建 之后 筛选组。例如,要仅查看总销售额超过 $1000 的类别:

SELECT
product_category,
SUM(sale_amount) AS total_sales
FROM Sales
GROUP BY product_category
HAVING SUM(sale_amount) > 1000;
方面GROUP BYORDER BY
目的将行聚合成组以进行汇总计算。对最终结果集进行排序以供展示。
对行的影响减少返回的行数。重新排序行,但不改变行数。
与函数结合使用与聚合函数(SUM、COUNT 等)一起使用。不需要聚合函数。
在查询中的位置出现在 HAVING 和 ORDER BY 之前。几乎总是查询中的最后一个子句。
筛选使用 HAVING 子句筛选组。使用 WHERE 子句(排序前)筛选单个行。