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

Tim*_*tle 23 mysql sql aggregate-functions

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

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

SELECT MIN(e.salary), e.* FROM employee e GROUP BY department
Run Code Online (Sandbox Code Playgroud)

显然,我会得到两个好的专栏,最低薪水和部门.员工姓名(以及任何其他员工字段)是否来自同一行?即MIN(薪水)行?

我知道很可能有两名员工的工资相同(和最低),但我(现在)所关心的只是获得(或单一)最便宜员工的所有信息.

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

SELECT min(salary), e.* FROM employee e WHERE department = 'sales'
Run Code Online (Sandbox Code Playgroud)

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

如果数据库很重要,我正在使用MySql.

Tom*_*m H 22

如果你想在每个部门找到"最便宜"的员工,你会有两个选择:

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
Run Code Online (Sandbox Code Playgroud)

或者您可以使用:

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
Run Code Online (Sandbox Code Playgroud)

第二个声明有效地说,向我展示你在同一个部门找不到另一个薪水较低的员工的所有员工.

在这两种情况下,如果两个或更多员工的工资相等,那么他们(两者都是)都可以获得相同的工资.