Mysql 返回空值的简单SQL查询

Mysql 返回空值的简单SQL查询,mysql,sql,database,Mysql,Sql,Database,我刚开始研究SQL查询。 我正在这个网站上练习: 我想找到: 每个部门工资最高的员工的姓名 我的问题是: SELECT first_name, max(salary) FROM employees, departments WHERE departments.dept_id=employees.dept_id GROUP BY employees.dept_id 我的名字是空值: 我知道这个问题是由group by表达式造成的。但我怎么才能解决这个问题呢 表: 您也可以像下面这样使用行号,除

我刚开始研究SQL查询。 我正在这个网站上练习:

我想找到:

每个部门工资最高的员工的姓名

我的问题是:

SELECT first_name, max(salary) FROM employees, departments 
WHERE departments.dept_id=employees.dept_id
GROUP BY employees.dept_id
我的名字是空值: 我知道这个问题是由group by表达式造成的。但我怎么才能解决这个问题呢

表:

您也可以像下面这样使用行号,除非您需要显示部门名称,否则不需要加入部门表:

Select e.*
from employees e
INNER JOIN
(
   SELECT e.id, e.dept_id. e.first_name, 
          rn=row_number() over (partition by e.dept_id order by e.salary desc)
   FROM employees e 
) x ON x.id = e.id
where x.rn = 1
编辑

由于OP不想使用row_number函数,结果查询将在mysql中使用,而不是在sql server中使用->您可以尝试以下操作吗:

select em.*
from employees em, (
    Select dept_id, max(salary) salary
    from employees e
    group by dept_id
) x on x.dept_id=em.dept_id and x.salary = em.salary
这应该是可行的,但据我所知,在线编译器不接受带有子查询的join。在这种情况下,我能想到的最简单的解决方案是:

select em.*
from employees em
where salary = (select max(salary) from employees em2 where em.dept_id = em2.dept_id)
您也可以使用如下所示的行号,除非您需要显示部门名称,否则不需要加入到部门表:

Select e.*
from employees e
INNER JOIN
(
   SELECT e.id, e.dept_id. e.first_name, 
          rn=row_number() over (partition by e.dept_id order by e.salary desc)
   FROM employees e 
) x ON x.id = e.id
where x.rn = 1
编辑

由于OP不想使用row_number函数,结果查询将在mysql中使用,而不是在sql server中使用->您可以尝试以下操作吗:

select em.*
from employees em, (
    Select dept_id, max(salary) salary
    from employees e
    group by dept_id
) x on x.dept_id=em.dept_id and x.salary = em.salary
这应该是可行的,但据我所知,在线编译器不接受带有子查询的join。在这种情况下,我能想到的最简单的解决方案是:

select em.*
from employees em
where salary = (select max(salary) from employees em2 where em.dept_id = em2.dept_id)
试试这个:

select first_name, b.dept_id, salary  from employees a,
(
SELECT employees.dept_id, max(salary) as salary FROM employees, departments 
WHERE departments.dept_id=employees.dept_id
GROUP BY employees.dept_id
 )b where a.salary = b.salary and a.dept_id= b.dept_id
试试这个:

select first_name, b.dept_id, salary  from employees a,
(
SELECT employees.dept_id, max(salary) as salary FROM employees, departments 
WHERE departments.dept_id=employees.dept_id
GROUP BY employees.dept_id
 )b where a.salary = b.salary and a.dept_id= b.dept_id
试试这个:

select em.*
from employees em, (
    Select dept_id, max(salary) salary
    from employees e
    group by dept_id
) x on x.dept_id=em.dept_id and x.salary = em.salary
SELECT e.first_name, e.salary FROM employees as e
INNER JOIN departments as d ON d.dept_id=e.dept_id
WHERE e.salary IN (SELECT max(salary) FROM employees GROUP BY dept_id)
试试这个:

select em.*
from employees em, (
    Select dept_id, max(salary) salary
    from employees e
    group by dept_id
) x on x.dept_id=em.dept_id and x.salary = em.salary
SELECT e.first_name, e.salary FROM employees as e
INNER JOIN departments as d ON d.dept_id=e.dept_id
WHERE e.salary IN (SELECT max(salary) FROM employees GROUP BY dept_id)


您是否在employees表中为所有记录设置了first_名称?我们需要查看这两个表的结构,以便进一步提供帮助。是的,我有。如果需要,可以检查第一个链接中的表数据。或者我可以帮你贴好的,我贴两张桌子。ThanksI发布了这些表。您是否在employees表中为所有记录设置了名字?我们需要查看这两个表的结构以进一步提供帮助。是的,我有。如果需要,可以检查第一个链接中的表数据。或者我可以帮你贴好的,我贴两张桌子。谢谢我贴了表格。这是每个部门的最高工资。。。这只返回最大值salary@zip如果不同部门的不同人员有相同的工资,会发生什么?这是每个部门的最高工资。。。这只返回最大值salary@zip如果不同部门的不同人员有相同的工资,会发生什么情况?对不起,我没有在帖子中写道:我只想使用SELECT、WHERE、JOIN、groupby、have。。。谢谢更新了我的答案@l000000lI也尝试过这个,作为mysql查询,但它不起作用。我在这个网站上练习,我想我需要更简单的表达来工作。对不起,我没有在帖子中写:我只想使用SELECT,WHERE,JOIN,groupby,have。。。谢谢更新了我的答案@l000000lI也尝试过这个,作为mysql查询,但它不起作用。我正在这个网站上练习,我想我需要更简单的表达式来工作。你能提供更多信息而不是只使用代码的答案吗?@chevybow first_name已被选中,但未包含在Group by子句中,因此我将其添加到Group by中,并按max salary排序。不知怎的,我认为在线编译器没有显示错误,而是显示空。你能提供更多信息,而不是只提供代码的答案吗?@chevybow first_name已被选中,但未包含在Group by子句中,因此我将其添加到Group by中,并按max salary排序。我认为在线编译器并没有显示错误,而是显示null。