首页 > 解决方案 > SQL 不懂 IN 子句的算法

问题描述

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

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

我们为什么使用

WHERE (Employee.DepartmentId, Salary) IN
FROM Employee

怎么翻译成通俗的?

那么为什么我们不只是在 select 语句的开头使用 max(salary) 呢?最后写 group by 和 order by 而不是写 IN 子句?

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
    )

标签: mysql

解决方案


如果您将其与其他 2 个值进行比较,则类似的表达式WHERE (x,y) IN是有意义的,例如:

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

等于真的。

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

所以你的例子

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

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

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

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

另一个原因可能是查询速度有多快。你可以自己测量这个。某些查询比其他查询更容易被 mysql 优化。很长一段时间以来,所有 MySQL 子查询都非常慢。


推荐阅读