Select sal
from emp e
where 3 >= (select count (sal)
from emp a
where a.sal <= e.sal)
order by sal;
它将按升序返回 Emp 表中最低的三个工资
例 : Emp
表
Sal (Column/Attribute)
50
40
10
20
30
结果:
10
20
30
有人给出了上面的答案。但是在比较时,我得到了前三名的薪水。我到底哪里出错了?我不明白。
select count (sal) from emp a where a.sal<=e.sal
这将返回上层选择中具有大于 e.sal
的行数;例如,对于最低sel
它将返回所有行数;
where 3>= (...)
这返回给您的行,只有3
行比给定的sal
更大。
order by sal
这只能按sal
订购
对不起我的英语。
该查询确实返回了最低的三个薪水(尽管有更好的方法可以做到这一点(。 我不确定你是如何获得前 3 名薪水的。
对于emp
表中的每一行,WHERE
子句中的子查询将返回小于或等于当前工资的工资数。 结果是这样的:
+-----+-------------------------+
| sal | # of sal <= |
+-----+-------------------------+
| 10 | 1 (10) |
| 20 | 2 (10, 20) |
| 30 | 3 (10, 20, 30) |
| 40 | 4 (10, 20, 30, 40) |
| 50 | 5 (10, 20, 30, 40, 50) |
+-----+-------------------------+
现在查看这些结果并找到 3> = "# of sal <="
的行,您将看到它是前 3 行(10、20 和 30(。
确定你没有不小心把<
和>
弄混了?
如果您的数据集 (e.sal( 由 (50, 40, 10, 20, 30( 组成,则遍历您的数据:
where 3 >=
(select count (sal)
from emp a
where a.sal <= e.sal)
您的结果:
For e.sal = 50: Count = 5 [50, 40, 10, 20, 30] FALSE
For e.sal = 40: Count = 4 [40, 10, 20, 30] FALSE
For e.sal = 10: Count = 1 [10] TRUE
For e.Sal = 20: Count = 2 [10, 20] TRUE
For e.Sal = 30: Count = 3 [10, 20 30] TRUE
因此,您的 WHERE 子句将您限制为 10、20、30,然后按升序排列:10、20、30