你能解释一下这个SQL查询的作用吗?


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

最新更新