You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL查询中仅GROUP BY主键是否足够?需额外分组非主键字段吗?

问题解答:GROUP BY主键是否足够?

数据库表结构

Customer
--------
ID (primary key)
FirstName
LastName


Billing
-------
ID (primary key)
Customer_ID (foreign key to Customer.ID)
Date

课程中的查询语句

-- "For each customer, get the number of invoices they have submitted"
SELECT
  Customer.ID,
  Customer.FirstName,
  Customer.LastName,
  COUNT(Billing.ID)
FROM
  Customer
  INNER JOIN Billing ON Customer.ID = Billing.Customer_ID
GROUP BY
  Customer.ID,
  Customer.FirstName,
  Customer.LastName
ORDER BY COUNT(Billing.ID) DESC;

用户疑问

该查询是否必须GROUP BY Customer.ID、Customer.FirstName、Customer.LastName?仅GROUP BY Customer.ID是否足够?老师称仅GROUP BY主键可行是因为SQL优化器会自动补充非主键字段,但本人认为主键已能唯一标识客户,对此存疑。

解答

仅GROUP BY Customer.ID完全足够,核心原因是**Customer.ID作为主键,本身就能唯一标识每一条客户记录**。也就是说,同一个ID对应的FirstName和LastName是固定且唯一的——不可能存在两个不同的姓名对应同一个客户ID的情况。

从SQL语法规则来看,在MySQL(尤其是开启ONLY_FULL_GROUP_BY模式的场景下),SELECT子句里的非聚合字段要么出现在GROUP BY中,要么能被GROUP BY的字段唯一确定。而主键恰好满足“唯一确定其他非主键字段”的条件,所以只GROUP BY主键是合法且逻辑正确的。

老师提到的“SQL优化器自动补充非主键字段”,其实是对这个逻辑的通俗解释:优化器知道主键能唯一关联对应的非主键字段,所以即使只写GROUP BY主键,它也能准确匹配到对应客户的姓名,不会出现分组混乱的问题。

举个实际例子:假设客户ID=1对应姓名“张三-李四”,不管这条客户关联多少条账单记录,分组后ID=1对应的姓名只会是“张三-李四”,不会有其他值。因此,把FirstName和LastName加到GROUP BY里属于冗余写法,虽然不影响结果,但完全没必要。

内容的提问来源于stack exchange,提问作者user1658543

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 04:00:57