我正在尝试使用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 DESC
与ORDER BY deptno, sal DESC
相同。 1和3是select子句中deptno
和sal
列的位置。关于mysql - MySql/SQL排序条件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17854475/