admin

使用SQL MIN()和GROUP BY的额外字段

sql

当使用SQL MIN()函数以及GROUP BY时,是否有任何其他列(不是MIN列或GROUP BY列之一)与匹配的MIN行中的数据匹配?

例如,给定一个包含部门名称,员工名称和薪水的表:

SELECT MIN(e.salary), e.* FROM employee e GROUP BY department

显然,我会得到两个不错的专栏,最低工资和部门。员工名称(和其他任何员工字段)是否来自同一行?即带有MIN(salary)的行?

我知道有可能很可能是两个员工具有相同(最低)的薪水,但我很担心(现在)是让所有的(或信息 )最廉价的员工。

这会选择最便宜的推销员吗?

SELECT min(salary), e.* FROM employee e WHERE department = 'sales'

本质上,我可以确定与MIN()函数一起返回的数据将与具有该最小值的(或 单个 )记录匹配吗?

如果数据库很重要,那么我正在使用MySql。


阅读 193

收藏
2021-05-10

共1个答案

admin

如果您想获得每个部门中最“便宜”的员工,那么您将有两种选择:

SELECT
     E.*     -- Don't actually use *, list out all of your columns
FROM
     Employees E
INNER JOIN
     (
          SELECT
               department,
               MIN(salary) AS min_salary
          FROM
               Employees
          GROUP BY
               department
     ) AS SQ ON
     SQ.department = E.department AND
     SQ.min_salary = E.salary

或者您可以使用:

SELECT
     E.*
FROM
     Employees E1
LEFT OUTER JOIN Employees E2 ON
     E2.department = E1.department AND
     E2.salary < E1.salary
WHERE
     E2.employee_id IS NULL -- You can use any NOT NULL column here

第二个声明的工作原理是有效地告诉我,向所有雇员展示您在同一部门找不到其他较低薪水的雇员。

在这两种情况下,如果两个或两个以上雇员的工资相等,并且最低,您将同时获得这两个雇员(全部)。

2021-05-10