无法理解相关查询

时间:2017-08-25 15:45:19

标签: mysql sql subquery correlated-subquery

有人可以帮助我理解相关的查询。以下是我想要了解但不能从中获取任何内容的以下查询。请帮助。谢谢。

--Step 1
    select e1.Name as 'Employee', e1.Salary
    from Employee e1
    where 3 >
    (
        select count(distinct e2.Salary)
        from Employee e2
        where e2.Salary > e1.Salary
    )
    ;




--Step 2 
SELECT
    d.Name AS 'Department', e1.Name AS 'Employee', e1.Salary
FROM
    Employee e1
        JOIN
    Department d ON e1.DepartmentId = d.Id
WHERE
    3 > (SELECT
            COUNT(DISTINCT e2.Salary)
        FROM
            Employee e2
        WHERE
            e2.Salary > e1.Salary
                AND e1.DepartmentId = e2.DepartmentId
        )
;

3 个答案:

答案 0 :(得分:0)

在第一个查询中,您将返回所有e1.Name和e1.Salary,其中员工有2个或更少的记录,其薪水大于e1。

第二个查询执行相同的操作,但仅限于员工未更改部门时。

答案 1 :(得分:0)

查找前3名员工的合法查询可能如下:

 SELECT x.* 
   FROM employee x 
 HAVING FIND_IN_SET(salary,(SELECT GROUP_CONCAT(DISTINCT salary ORDER BY salary DESC) FROM employee)) <= 3;

注意:如果员工拥有相同的薪水,这可能会返回超过3名员工

答案 2 :(得分:0)

让我们分解它们:

步骤1 - 退还所有薪水前2名工资(3> x)的员工。

  • (SELECT)返回所有员工的姓名及其薪水
  • (FROM)员工表
  • (WHERE)排除前2名中没有薪水的员工。子查询只计算大于当前评估记录的薪水数。如果该数字大于2,则此人在前3名中没有薪水.3&gt; 4 = 3将&gt; 3错误,记录被排除在外。

SELECT e1.Name as 'Employee', e1.Salary
FROM Employee e1
WHERE 3 > (SELECT count(distinct e2.Salary)
           FROM Employee e2
           WHERE e2.Salary > e1.Salary);

编写此查询的另一种方法是

SELECT * 
FROM Employee E1
WHERE EXISTS (SELECT * 
              FROM Employee E2
              WHERE E1.Salary = E2.Salary
              ORDER By salary Desc 
              LIMIT 2)

以上基本上都说返回前2名工资和有这些工资的员工。

步骤2类似于步骤1;但由于相关性也在部门,因此结果不同。对于每个员工,它确定薪水是否是该部门的前2名之一。如果是记录被包括在内。这意味着前2名工资由部门而非公司范围评估,如第1步。

然而,第2步也可以重写,

在除mySQL之外的语言中,可以用以下语言表示:

  1. 使用窗口/分析函数Dense_rank()和按部门划分;然后将记录限制为等级为2或更低的记录
  2. 使用交叉申请和按工资描述排序的前2名。
  3. 在mySQL中列出的方法是使用用户变量的最简单的方法。模拟窗口函数或交叉应用上面。