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

时间:2017-03-22 14:41:15

标签: sql

Select sal
from emp e 
where 3 >= (select count (sal) 
            from emp a
            where a.sal <= e.sal)
order by sal;

它将按照升序顺序返回Emp Table中最低的三个薪水

示例:Emp

Sal (Column/Attribute)
50
40
10
20
30

结果:

10
20
30

有人给出了上述答案。但是,在比较我获得top3工资。我到底哪里错了?我不明白。

3 个答案:

答案 0 :(得分:0)

<ul class="nav navbar-nav navbar-right">
<li class="dropdown">
                    <a href="#" class="dropdown-toggle profile-image" data-toggle="dropdown">
                        <img id="clip" src="https://www.habbo.com.br/habbo-imaging/avatarimage?hb=img&figure=hr-828-52.hd-180-1.lg-280-1422.ch-3032-66-1408&action=wav&direction=2&head_direction=3&gesture=sml&size=m" />
 &nbsp;&nbsp;Adam Sandler <b class="caret"></b></a>
                    <ul class="dropdown-menu">
                        <li><a href="#"><i class="fa fa-cog"></i> Account</a></li>
                                                <li class="divider"></li>
                        <li><a href="#"><i class="fa fa-sign-out"></i> Sign-out</a></li>
                    </ul>
                </li>
                </ul>

这会从上一级选择向您返回salaty大于select count (sal) from emp a where a.sal<=e.sal 的行数;例如,对于最低e.sal,它将返回所有行的数量;

sel

此返回给您的行只有 where 3>= (...) 行,而3行比给定的更多。

sal

这仅按order by sal

订购

抱歉我的英文。

答案 1 :(得分:0)

如果您的数据集(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

答案 2 :(得分:0)

该查询确实返回了最低的三个工资(尽管有更好的方法可以做到这一点)。我不确定你是如何获得前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&gt; = "# of sal <="的行,您将看到它是前3行(10,20和30)。

您确定没有意外混淆<>吗?