求教:查询第4高薪资教师姓名的SQL子句逻辑解析
解析查询第4高薪资教师的SQL子查询逻辑
这段SQL的核心逻辑是通过统计「比当前教师薪资高的不同薪资数量」,来定位第4高的薪资,拆解来看:
子查询的作用
外层查询会遍历teacher表的每一行(别名T1),对每一行的T1.salary,子查询做的是:
SELECT COUNT(DISTINCT T2.salary) FROM teacher as T2 WHERE T2.salary > T1.salary
它会统计所有薪资比T1当前行薪资高的、不同薪资值的数量。
为什么=3对应第4高?
我们按薪资从高到低排等级:
- 第1高薪资:没有比它更高的薪资,统计结果是
0 - 第2高薪资:只有1个比它高的薪资等级,统计结果是
1 - 第3高薪资:有2个比它高的薪资等级,统计结果是
2 - 第4高薪资:正好有3个比它高的薪资等级,统计结果是
3
所以当子查询的统计结果等于3时,对应的T1行就是拿第4高薪资的教师。
为什么要用COUNT(DISTINCT ...)?
如果不用DISTINCT,统计的是「比当前薪资高的人数」,但如果有多个教师拿同一高薪,会重复计数。比如两个教师拿10000(最高薪),那对拿9000的教师来说,COUNT(T2.salary)会返回2,但实际只有1个更高的薪资等级。用DISTINCT就能避免这种情况,确保统计的是不同的高薪等级数,让排名更准确。
完整SQL语句:
SELECT name FROM teacher as T1 WHERE ( SELECT COUNT (DISTINCT T2.salary) FROM teacher as T2 WHERE T2.salary > T1.salary ) = 3;
内容的提问来源于stack exchange,提问作者v_head
相关产品推荐
相关产品推荐

