我正在尝试使用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>和1,3排序在查询中的作用。

为了理解查询,我分别如下运行了WHERE原因查询:

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;


很抱歉没有提供小提琴。

最佳答案

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

为了更好地了解子查询在做什么,您可以将其移至外部select并查看其返回的内容

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


样本输出:

| DEPTNO | EMPNO | SAL |排名|
-------------------------------
| 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 DESCORDER BY deptno, sal DESC相同。 1和3是select子句中deptnosal列的位置。

关于mysql - MySql/SQL排序条件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17854475/

10-10 16:49