假设您有一个雇员表和一个部门表,并且需要找到每个部门的最高薪水。
我知道什么是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
)
答案 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