SQL分组查询实战 SQL GROUP BY用法详解

嘿嘿,和你聊SQL分组,真的不只是纸上谈兵。
去年我在杭州做项目的时候,数据量增大了,不用分组就可以直接查,差点把服务器搞崩溃了。

首先我们来说一下GROUP BY的最基本的用法。
我有一个客户表,有几百条数据。
我想按城市分组计算每个城市的订单总数。
直接上代码: sql 选择城市,COUNT() AS 订单 来自客户 GROUP BY city;
这行代码将同一个城市的客户分为一个组,然后统计每个组的人数。
容易,对吧?
但是后来我遇到了一个陷阱,即使用 HAVING 过滤。
一位老板要求我们只看订单量超过5 0个的城市。
如果你写WHERE,这是错误的。
分组前进行 WHERE 过滤。
您必须使用 HAVING: sql 选择城市,COUNT() AS 订单 来自客户 按城市分组 HAVING COUNT() > 5 0;
这次就是这样,通过分组过滤。

让我告诉你我陷入的另一个陷阱。
有一次我在写SQL的时候,选择了多个字段,但是没有把所有的非聚合字段都放到GROUP BY中。
结果是一条错误消息,指出“SELECT 列表包含未分组的列”。
我花了两个小时才找到它,真是哭笑不得。
请记住,每当您想查看 SELECT 中的特定字段时,除非它是聚合函数,否则它必须与 GROUP BY 中的字段一一匹配。

还有另一种情况涉及 NULL 值。
有一个表的客户ID为NULL。
分组时,NULL单独分组。
如果要排除NULL,则需要添加WHERE: sql SELECT customer_id, COUNT() AS 订单 来自订单 其中 customer_id 不为空 GROUP BY customer_id;
尝试不写WHERE,看看结果是否混乱怎么样?
在优化方面,我给大家讲一个真实的案例。
有一张表,有几百万条数据,老板想计算每个月的销售额。
我最初写道: sql SELECT YEAR(order_date) AS 年,MONTH(order_date) AS 月,SUM(金额) 来自订单 GROUP BY 年,月;
结果是执行了很长一段时间没有结果。
后来我发现 order_date 列没有索引。
已添加索引: sql CREATE INDEX idx_order_date ONorders(order_date);
再次运行,结果将很快出现。
因此,最好在GROUP BY列上添加索引。

让我向您介绍另一种高级技术:多级摘要。
去年有一个项目是按部门计算工资,然后按职位计算工资。
直接上代码: sql 选择部门、职位、COUNT() AS 员工、AVG(Salary) AS avg_salary 来自员工 GROUP BY 部门、职务;
这允许您按部门进行计算,然后按部门内的职位进行细分。
如果使用 ROLLUP,还可以自动添加总计: sql 选择部门、职位、COUNT() AS 员工、AVG(Salary) AS avg_salary 来自员工 GROUP BY ROLLUP(department, job_title);
这次结果中会多出一行“Total”,这是所有部门的汇总。

最后分享一下我最近用过的东西。
有一个包含数千列的表,按城市分组,然后按年龄组分组。
直接的GROUP BY 城市、年龄组、SQL 太长。
后来我使用了 GROUPINGSETS,它是在一行中创建的: sql 选择城市、年龄组、COUNT() AS 客户 来自客户 GROUP BY GROUPINGSETS((city,age_group), (city), (age_group));
这使您可以通过一行代码一次性获取城市分组、年龄分组、城市分组、年龄分组和所有摘要。

你看,如果你经常使用 SQL 分组,你就可以处理它。
一开始可能看起来很简单,但越复杂,就越复杂。
多练习,多思考业务场景,你就会逐渐熟练。

SQL 分组查询如何实现多列分组?

多列分组是按字段顺序分层的。

主要著作: SELECT 列 1 , 列 2 , SUM(列 3 ) FROM 表名 GROUP BY 列 1 , 列 2 ;
要点: 非聚合列必须是 GROUP BY。

组的顺序很重要。
按地区、类别分组 首先按地区划分,然后按类别划分。

选择一个聚合函数来计算统计数据。
SUM(amount) 计算总计。

示例: SELECT 地区、类别、SUM(金额) AS 总金额 FROM sales GROUP BY 地区、类别; 首先按地区分组,然后按类别分组。

常见用例: 1 、年、月统计订单量: SELECT 年、月、COUNT() AS order_count FROM order GROUP BY 年、月;
2 .计算部门内各职位的平均工资。
SELECT 部门、职位名称、AVG(salary) AS avg_salary FROM 员工 GROUP BY 部门、职位名称;
3 .活跃用户数按照用户级别区域计算。
SELECT 用户级别、区域、COUNT(DISTINCT 用户 ID) AS active_users FROM 用户活动 GROUP BY 用户级别、区域;
注意: 分组顺序会影响结果。
必须包含非聚合列。
调整字段顺序会更改分组级别。

使用索引可以提高效率。
首先,这个。

SQL 分组查询如何使用 HAVING 条件?

sql中group by的用法 快速掌握分组查询技巧

等等,还有一件事。
上次我帮助老板创建月度报告时,我很喜欢使用 GROUP BY。
记得那是2 02 3 年1 0月2 6 日下午,在公司茶室磨咖啡的时候,我突然想到用GROUP BY来对用户行为数据进行分类。
这样一来,双方的关系就更加清晰了。
具体数字是,把原来的8 0行数据分组后,我只需要看2 0组关键指标。
老板还夸我办事效率高。
但突然我想到:是不是每个部件都太厚了?说得详细一点不是更好吗?