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

为何IN子句关联分组结果的SQL返回3条数据,另一分组查询仅返回2条?

两个SQL查询结果差异的原因解释

背景数据

现有Employee表数据如下:

Employee
id  name    salary  departmentid
1   joe     70000   1
2   jim     90000   1
3   henry   80000   2
5   max     90000   1

两个查询及对应结果

  1. 第一个查询:
SELECT name, Salary
FROM Employee
WHERE (DepartmentId, Salary) IN (SELECT DepartmentId, MAX(Salary)
                                 FROM Employee
                                 GROUP BY DepartmentId);

返回结果:共3条数据,分别是jim、henry、max的薪资记录。

  1. 第二个查询:
SELECT name,DepartmentId, MAX(Salary) FROM Employee GROUP BY DepartmentId 

返回结果:仅jim和henry两条记录。

差异原因拆解

第一个查询的执行逻辑

子查询SELECT DepartmentId, MAX(Salary) FROM Employee GROUP BY DepartmentId会先按部门分组,计算出每个部门的最高薪资:

  • 部门1的最高薪资为90000
  • 部门2的最高薪资为80000

主查询会匹配所有符合「部门ID+薪资」等于子查询结果的员工记录。部门1里jim和max的薪资都是90000,都满足匹配条件,因此两条记录都会被返回,再加上部门2的henry,最终得到3条结果。

第二个查询的执行逻辑

这个查询违反了标准SQL的分组聚合规则——SELECT子句中的非聚合列必须出现在GROUP BY子句中。但部分数据库(比如MySQL的非严格模式)允许这种写法,此时数据库会从每个分组的行里随机选取一个非聚合列的值(这里就是name字段)。

在你的案例中,部门1分组包含joe、jim、max三条记录,数据库随机选中了jim的name,所以只返回jim这条;部门2分组只有henry,正常返回,最终得到两条结果。需要注意的是,这种结果没有确定性,换个数据顺序或数据库环境,部门1可能返回max的name。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 09:42:18