2013-07-25 48 views
0

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

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

该查询从每个部门检索“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'; 

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

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

我不确定在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; 

对不起,不提供小提琴..

回答

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 

输出示例:

 
| DEPTNO | EMPNO | SAL | RANK | 
------------------------------- 
|  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列的位置。

+0

子查询会递归吗?在e.sal TomPHP

+0

这个工资怎么比较在同一张表之间.. – TomPHP

+1

不,不是递归的。外部选择需要一行。然后使用外部选择的值(e.deptno,e.sal)执行内部选择,并将它们用作内部选择的where子句中的参数。并为emp表中的每一行执行此操作。 – peterm