SQL - Group By 与 Order By 对比
你好,有抱负的SQL爱好者们!今天,我们将深入了解SQL中的两个基本子句:Group By 和 Order By。作为你友好邻里的计算机老师,我很高兴引导你们理解这些概念。如果你是编程新手,不用担心——我们将从基础开始,逐步学习。那么,拿起一杯咖啡(或者茶,如果你喜欢的话),让我们开始SQL冒险之旅!
SQL Group By 子句
什么是 Group By?
Group By 子句就像是你数据的贴心组织者。想象一下你的衣橱乱糟糟的,满是衣服。Group By 帮助你根据某些特性——比如颜色或衣服类型——将这些衣服整理成整洁的一堆。
在SQL术语中,Group By 允许你根据一个或多个列将数据分组。这在你想对这些组进行计算或汇总时特别有用。
基本语法
以下是 Group By 子句的基本结构:
SELECT column1, column2, aggregate_function(column3)
FROM table_name
GROUP BY column1, column2;
让我们分解一下:
- 我们 SELECT 我们希望在结果中看到的列。
- 我们指定我们从哪个表中获取数据。
- GROUP BY 部分告诉SQL哪些列用于分组。
示例 1:按产品分组销售
想象我们有一个名为 sales
的表,包含列:product_name
、quantity_sold
和 sale_date
。让我们按产品分组销售:
SELECT product_name, SUM(quantity_sold) as total_sold
FROM sales
GROUP BY product_name;
这个查询将向我们展示每个产品的总销售数量。这是怎么回事:
- 我们 SELECT
product_name
和quantity_sold
的 SUM。 - 我们从
sales
表中获取这些数据。 - 我们 GROUP BY
product_name
,所以SQL将为每个独特的产品创建一个组。
结果可能看起来像这样:
product_name | total_sold |
---|---|
Apple | 150 |
Banana | 200 |
Orange | 175 |
示例 2:多列分组
我们也可以通过多列进行分组。假设我们想按产品和日期分组销售:
SELECT product_name, sale_date, SUM(quantity_sold) as daily_total
FROM sales
GROUP BY product_name, sale_date;
这个查询按产品和日期分组我们的销售,向我们展示每个产品的每日总数。
SQL Order By 子句
什么是 Order By?
如果 Group By 是我们的衣橱组织者,那么 Order By 就像是我们把衣服按颜色深浅或长短顺序排列。它完全关于按特定顺序排序我们的数据。
基本语法
Order By 子句的基本结构是:
SELECT column1, column2
FROM table_name
ORDER BY column1 [ASC|DESC], column2 [ASC|DESC];
- ASC 表示升序(从小到大,或从A到Z)。
- DESC 表示降序(从大到小,或从Z到A)。
- 如果你不指定,SQL 默认为 ASC。
示例 3:按销售排序产品
让我们按他们的总销售额对产品进行排序:
SELECT product_name, SUM(quantity_sold) as total_sold
FROM sales
GROUP BY product_name
ORDER BY total_sold DESC;
这个查询执行以下操作:
- 按产品分组销售。
- 计算每个产品的总销售数量。
- 从高到低排序结果。
结果可能如下:
product_name | total_sold |
---|---|
Banana | 200 |
Orange | 175 |
Apple | 150 |
示例 4:多列排序
我们也可以按多列排序:
SELECT product_name, sale_date, SUM(quantity_sold) as daily_total
FROM sales
GROUP BY product_name, sale_date
ORDER BY product_name ASC, daily_total DESC;
这个查询:
- 按产品和日期分组销售。
- 首先按产品名称(字母顺序)排序。
- 然后在每个产品组内按每日总数(从高到低)排序。
Group By 与 Order By 对比
现在我们已经看到了 Group By 和 Order By 的实际应用,让我们比较一下它们:
特性 | Group By | Order By |
---|---|---|
目的 | 将数据组织成组 | 按特定顺序排序数据 |
使用 | 与聚合函数一起使用 | 可以与聚合函数一起或不一起使用 |
结果 | 减少行数(汇总) | 不改变行数 |
位置 | 在查询中位于 ORDER BY 之前 | 如果有 GROUP BY,则在 GROUP BY 之后 |
功能性 | 为聚合计算创建组 | 确定输出行的顺序 |
何时使用 Group By
当你想:
- 汇总数据(如为每个组获取总计或平均值)。
- 对数据组进行计算。
- 减少结果集中的行数。
何时使用 Order By
当你想:
- 按特定顺序对结果进行排序。
- 以更可读或逻辑顺序展示数据。
- 在数据集中找到最高或最低的值。
示例 5:结合 Group By 和 Order By
让我们用一个最终的示例来整合所有内容。假设我们想找到每个月销售前三的产品:
SELECT
EXTRACT(MONTH FROM sale_date) as month,
product_name,
SUM(quantity_sold) as total_sold
FROM
sales
GROUP BY
EXTRACT(MONTH FROM sale_date), product_name
ORDER BY
month ASC, total_sold DESC
LIMIT 3;
这个查询:
- 按月份和产品分组销售。
- 计算每个月每个产品的总销售额。
- 按月份(升序)和总销售额(降序)排序结果。
- 限制输出为每个月的前三个产品。
就这样!我们已经穿越了 Group By 和 Order By 的领域。记住,熟能生巧,所以不要害怕在你自己的查询中尝试这些子句。快乐编码,愿你的数据总是井井有条、排列得当!
Credits: Image by storyset