SQL不能理解IN子句的算法

时间:2018-12-28 21:33:50

标签: mysql

假设您有一个雇员表和一个部门表,并且需要找到每个部门的最高薪水。

我知道什么是IN子句,但不知道此特定代码。

我们为什么使用

WHERE (Employee.DepartmentId, Salary) IN
FROM Employee

您如何简单地翻译?

  • 从这两个表中列出每个部门中薪水最高的部门,雇员,薪水? (因为正在使用分组依据?)

那为什么我们不仅仅在select语句的开头使用max(salary)?最后写成group by and order by,而不是写IN Clause?

SELECT
    Department.name AS 'Department',
    Employee.name AS 'Employee',
    Salary
FROM
    Employee
        JOIN
    Department ON Employee.DepartmentId = Department.Id
WHERE
    (Employee.DepartmentId , Salary) IN
    (   SELECT
            DepartmentId, MAX(Salary)
        FROM
            Employee
        GROUP BY DepartmentId
    )

2 个答案:

答案 0 :(得分:1)

WHERE (x,y) IN之类的表达式与其他两个值进行比较是有意义的,例如:

WHERE (x, y) IN ((a,b), (x,y))

等于true。

IN子句的右侧可以替换为子查询。

所以你的例子

(Employee.DepartmentId , Salary) IN
( SELECT DepartmentId, MAX(Salary) FROM Employee GROUP BY DepartmentId )

意味着如果员工的薪水与员工所在部门的最高薪水完全匹配,这将匹配。基本上意味着此查询将选择每个部门中所有收入最高的人。

您是对的,可以将其重写为“字段”子句中的子查询,甚至可以重写为联接(我的偏好)。

关于利弊。这在很大程度上与习惯和风格有关。人们倾向于重用他们惯用的模式,也许作者认为这是最清晰的解决方案。

另一个原因可能是查询有多快。您可以自己测量。某些查询比其他查询更容易通过mysql优化。长期以来,所有MySQL子查询都很慢。

答案 1 :(得分:1)

使用嵌套查询更简单:

SELECT 
  MAX(Salary), Department 
  FROM(
    SELECT 
      Department.name AS 'Department', 
      Employee.name AS 'Employee', Salary 
    FROM Employee 
    JOIN Department 
    ON Employee.DepartmentId = mentId
  ) 
  AS table
  GROUP BY Employee.DepartmentId