SQL中碰到的坑之GROUP BY

原创 victory54610 Python SQL审天下 2024-01-22 05:24 发表于陕西

在MySQL数据库中,GROUP BY是一个强大的工具,用于对查询结果进行分组。然而,在使用GROUP BY时,有一些常见的坑可能会导致结果不符合预期。在本文中,我们将探讨一些常见的GROUP BY陷阱,并提供相应的解决方法。

测试数据:

图片

坑之一:选择列表中的非聚合列

在使用GROUP BY时,SELECT语句中的列必须要么是聚合函数的结果,要么在GROUP BY子句中列出。如果选择了不在这两者之一的列,MySQL将无法确定应该返回哪个值,可能会返回随机的值或者是第一个匹配的值。

图片

在上面的例子中,employee_name列没有被包含在聚合函数中,也没有在GROUP BY子句中列出,导致返回的employee_name并非每个部门的最大工资对应的员工。如本例中捕快部工资最高的员工应该是“无情”,侠客部工资最高的员工应该是“李擎天”。

要解决这个问题,确保SELECT语句中的列要么是聚合函数的结果,要么在GROUP BY子句中列出。如果需要获取最大工资对应的员工,可以使用子查询或者窗口函数。

坑之二:HAVING子句使用错误

HAVING子句用于在GROUP BY之后过滤结果,类似于WHERE子句。然而,由于其位置在GROUP BY之后,需要注意它对聚合结果的过滤。

图片

在上面的例子中,尽管看起来似乎可以使用HAVING子句过滤工资大于16000的部门,但实际上这是错误的。HAVING子句中应使用聚合函数。

图片

坑之三:GROUP BY的列顺序问题

在GROUP BY子句中,列的顺序并不重要,但在SELECT语句中,列的顺序会影响结果的显示顺序。如果不注意这一点,会导致结果与预期不符。

图片

在上面的例子中,实际上有两个坑,一个是坑一中所说的,另外由于SELECT语句中列的顺序与GROUP BY子句中的不同,导致结果与预期不一致。

因此为避免这个问题发生,应确保SELECT语句中的列顺序与GROUP BY子句中的列顺序一致,或者使用列的别名来明确指定显示顺序。

今天的分享就到这儿啦,非常感谢您对“Python SQL审天下”公众号的关注和点赞。如果您觉得我的公众号能给您带来一丝丝的收获,请多多转发给您的朋友圈,让更多的人看到并了解。也许您不经意间的点赞和转发,会给他人带来独特的体验和感受。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值