您好!欢迎访问家园网-www.jy.wang!

家园网

成对比较的多列子查询和非成对比较的多列子查询有什么不同吗

网络 作者:本站 点击:

请讲一下下面两组sql代码有什么不同?成对比较的多列子查询和非成对比较的多列子查询有什么不同吗?怎么感觉这两组代码没多大区别啊?

第一组:

SELECT ename, job, sal 
FROM emp
WHERE (sal,job) in(SELECT MAX(sal), job FROM emp GROUP BY job);

第二组:

SELECT ename, job, sal 
FROM emp
WHERE sal in(SELECT MAX(sal) FROM emp GROUP BY job)
AND
job IN(SELECT  distinct job FROM emp);

两组代码的核心区别

对比项第一组(成对比较)第二组(非成对比较)
比较方式同时比较 (sal, job) 这个组合分别比较 sal 和 job
逻辑关系AND(组合条件)AND(独立条件)
结果含义找出每个职位中工资最高的员工找出工资是某个职位最高工资的员工(可能跨职位)



跨职位例子:让两组结果不同


一、数据

姓名职位工资
张三经理9000
李四经理7000
王五销售8000
赵六销售5000

每个职位的最高工资

  • 经理最高 = 9000(张三)

  • 销售最高 = 8000(王五)


二、现在加入一个跨职位的人

姓名

职位

工资


张三

经理

9000


李四

经理

7000


王五

销售

8000


赵六

销售

5000


孙七

销售

9000

← 销售员,工资9000


三、关键问题:销售的最高工资是多少?

销售员工资
王五8000
赵六5000
孙七9000

销售的最高工资 = 9000(孙七)!不是8000。

孙七自己就是销售的最高,这又变成了自己职位的最高。


四、正确构造:让某人工资等于其他职位的最高,但不是自己职位的最高

这需要:自己职位有人的工资比他高

姓名

职位

工资


张三

经理

9000


李四

经理

7000


王五

销售

10000

← 销售最高10000

赵六

销售

6000


孙七

销售

9000

← 销售员,工资9000,低于王五的10000


五、检查

每个职位的最高工资

  • 经理最高 = 9000(张三)

  • 销售最高 = 10000(王五)

孙七的情况

  • 职位 = 销售

  • 工资 = 9000

  • 销售的最高是10000,所以孙七不是销售的最高

  • 但9000等于经理的最高(张三的9000)

六、运行两组查询

第一组(成对比较)

子查询结果:(9000, 经理) 和 (10000, 销售)

姓名

(sal, job)

匹配?

结果

张三

(9000, 经理)

选中

王五

(10000, 销售)

选中

孙七

(9000, 销售)

❌(没有(9000,销售))

不选


结果:张三、王五 → 2人

第二组(非成对比较)

最高工资列表:{9000, 10000}

姓名

sal

在列表中?

结果

张三

9000

选中

王五

10000

选中

孙七

9000

选中


结果:张三、王五、孙七 → 3人

七、区别一目了然!

比较方式孙七(销售,9000)被选中了吗?
成对比较❌ 不选(他不是销售的最高)
非成对比较✅ 选中(他的工资9000等于经理的最高)

八、总结

比较方式判断标准孙七的结果
成对比较工资是自己职位的最高吗?❌ 不是(销售最高是10000)
非成对比较工资是任意职位的最高吗?✅ 是(9000是经理的最高)

一句话总结:孙七是销售员,工资9000。销售的最高工资是10000(王五),所以他不是自己职位的最高;但9000是经理的最高工资。因此成对比较不选他,非成对比较选他——这就是两组代码的区别


核心一句话记忆

比较方式本质问题
成对比较“你的工资是你自己职位里的最高吗?”
非成对比较“你的工资是任意职位里的最高吗?”

数据回顾(正确版)

姓名职位工资
张三经理9000
李四经理7000
王五销售10000
赵六销售6000
孙七销售9000

各职位最高工资

  • 经理最高:9000(张三)

  • 销售最高:10000(王五)

两组结果对比

员工

成对比较

非成对比较

原因

张三

9000是经理最高

王五

10000是销售最高

孙七

9000不是销售最高(10000才是),但它是经理最高


一句话总结

成对比较:只认“自己职位的第一名”
非成对比较:认“所有职位的第一名”

孙七虽然是销售,但他的工资是“经理的第一名”,所以:

  • 成对比较 ❌ 不要他

  • 非成对比较 ✅ 要他

这就是两组代码的根本区别。


标签: