求助一个SQL语句 望指点

priest111 2012-04-25 04:53:55
看数据库习题遇到一个题

表数据如下:
员工信息
员工号 工资 部门号
------ -------- ------
1001 1000 1
1002 1100 1
2001 1300 2
2002 800 2
3001 1300 3
4001 800 4

求各部门工资最高的员工号

使用SQL:
select 员工号 from 员工信息 a where 工资=(select max(工资) from 员工信息 b where a.部门号=b.部门号)

结果:
员工号
------
1002
2001
3001
4002

我不能理解这个SQL语句的执行逻辑和执行顺序,这个算哪种嵌套吗?
为什么 (select max(工资) from 员工信息 b where a.部门号=b.部门号) 能达到group by的效果

求高手讲解一下 感谢。



...全文
94 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
priest111 2012-04-25
  • 打赏
  • 举报
回复
感谢ACMAIN_CHM 我明白了.原来没这么用过, 感觉有一点绕,不知道以后能不能运用好.

[Quote=引用 5 楼 的回复:]

(select max(工资) from 员工信息 b where a.部门号=b.部门号)

这一句是针对select 员工号 from 员工信息 a中的每一条记录都会去执行一次where 工资=(select max(工资) from 员工信息 b where a.部门号=b.部门号)

在执行的时候,当前记录中的 a.部门号是已知值,用这个已知值去执行 (select max(……
[/Quote]
ACMAIN_CHM 2012-04-25
  • 打赏
  • 举报
回复
(select max(工资) from 员工信息 b where a.部门号=b.部门号)

这一句是针对select 员工号 from 员工信息 a中的每一条记录都会去执行一次where 工资=(select max(工资) from 员工信息 b where a.部门号=b.部门号)

在执行的时候,当前记录中的 a.部门号是已知值,用这个已知值去执行 (select max(工资) from 员工信息 b where a.部门号=b.部门号) 比如第一条记录时候 a.部门号= 1, 这样执行的就是 (select max(工资) from 员工信息 b where 1=b.部门号)
priest111 2012-04-25
  • 打赏
  • 举报
回复
不好意思 我比较笨

像你说的 部门号等于1的时候有2条 部门号等于2的时候也是2条
可MAX(工资)为什么不是在1-4都连接后取所有集合中最大的一个呢 而是1,2,3,4部门分段取了?

我开始就是把句子理解为
select 员工号 from xuye a where 工资=(select max(工资) from xuye b where b.部门号 in (select 部门号 from xuye))
这种 max(工资)=1300

而原语句结果是
1100
1300
1300
1200



[Quote=引用 3 楼 的回复:]

仔细 看看

(select max(工资) from 员工信息 b where a.部门号=b.部门号)

假设第1条记录,部门号=1


where a.部门号=b.部门号 有2条记录

员工号 工资 部门号
------ -------- ------
1001 1000 1
1002 1100 1

再取MAX 工资=1100
[/Quote]
WWWWA 2012-04-25
  • 打赏
  • 举报
回复
仔细 看看

(select max(工资) from 员工信息 b where a.部门号=b.部门号)

假设第1条记录,部门号=1


where a.部门号=b.部门号 有2条记录

员工号 工资 部门号
------ -------- ------
1001 1000 1
1002 1100 1

再取MAX 工资=1100
priest111 2012-04-25
  • 打赏
  • 举报
回复
首先感谢答复
你说的这个我理解做了个自连接 但是关键是 MAX(工资)的结果为什么能按部门group by了(得到4条结果) 而不是部门1-4所有自连接结果的MAX值呢 (1条)
麻烦能再解释一下吗 这个SQL执行顺序是怎么样的。

[Quote=引用 1 楼 的回复:]

(select max(工资) from 员工信息 b where a.部门号=b.部门号)

假设第1条记录,部门号=1


where a.部门号=b.部门号 有2条记录

员工号 工资 部门号
------ -------- ------
1001 1000 1
1002 1100 1

再取MAX 工资=1100
明白了?

也可以

……
[/Quote]
WWWWA 2012-04-25
  • 打赏
  • 举报
回复
(select max(工资) from 员工信息 b where a.部门号=b.部门号)

假设第1条记录,部门号=1


where a.部门号=b.部门号 有2条记录

员工号 工资 部门号
------ -------- ------
1001 1000 1
1002 1100 1

再取MAX 工资=1100
明白了?

也可以

select 部门,max(工资) from 员工信息 group by 部门号
再连接

2,596

社区成员

发帖
与我相关
我的任务
社区描述
Sybase相关技术讨论区
社区管理员
  • Sybase社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧