0

我正在尝试使用 MySQL/SQL 查询和复杂查询的学习教程。

下面是一个运行良好的查询,但结果集无法理解。

查询从每个部门检索“2”个最高薪员工。

SELECT deptno, empno, sal
FROM emp e
WHERE
2 > ( SELECT COUNT(e1.sal)
      FROM emp e1
      WHERE e.deptno = e1.deptno AND e.sal < e1.sal )
ORDER BY 1,3 DESC; 

但是我无法理解这个2 >Order by 1,3在查询中的作用。?

为了理解查询,我分别运行了 WHERE Cause Query,如下所示:

SELECT COUNT(e1.sal)
          FROM emp e1
          WHERE e.deptno = '1';

上面的查询向我返回了值为“1”的 deptno 计数。

所以这意味着每个部门都会被计算在内!!

我不确定到底发生了什么e.sal < e1.sal它是递归运行的吗?计算最高薪员工??

有人可以帮助我理解查询!

如果我能理解上面的逻辑,我就能理解下面查询的逻辑:

4th Top Salary of all the employees:

SELECT DEPTNO, ENAME, SAL
FROM EMP A
WHERE
3 = (SELECT COUNT(B.SAL) FROM EMP B
WHERE A.SAL < B.SAL) ORDER BY SAL DESC;

很抱歉没有提供小提琴..

4

1 回答 1

1

这是一个带有相关子查询的查询。

为了更好地理解子查询在做什么,您可以将其移动到外部选择并查看它返回的内容

SELECT deptno, empno, sal,
      ( SELECT COUNT(e1.sal)
          FROM emp e1
         WHERE e.deptno = e1.deptno AND e.sal < e1.sal ) rank
FROM emp e

样本输出:

| 部门 | EMPNO | 萨尔 | 排名 |
-------------------------------------------
| 1 | 103 | 30 | 0 |
| 1 | 102 | 20 | 1 |
| 1 | 101 | 10 | 2 |
| 2 | 201 | 100 | 0 |
| 2 | 203 | 50 | 1 |
| 2 | 202 | 40 | 2 |

这是SQLFiddle演示

它做什么它返回(对于外部选择中的每条记录)具有相同部门的许多行,其中薪水小于在外部选择中检索的行的薪水,因此根据薪水对每个部门的记录进行排名。

现在WHERE 2 > (subquery)这与WHERE (subquery) < 2过滤掉排名更高然后1有效执行TOP 2规则的行相同。

ORDER BY 1, 3 DESC是一样的ORDER BY deptno, sal DESC。1 和 3 是 select 子句中的位置deptnosal列。

于 2013-07-25T10:15:30.970 回答