0

我使用 MySQL 8.0 版和 popSQL 作为编辑器。

桌子:

create table account (no int, salary int);


insert into account values
(901,25000),
(902,30000),
(903,21000),
(904,40000),
(905,27000);

现在,我想要薪水最高的人的薪水和薪水。最高工资是 40000,对应的工资是 904。但是,这个查询给了我不同的输出。

-- no and salary of max salary
select no, max(salary)
from account ;

输出为: no max(salary) 901 40000

它正在打印第一个编号和最高薪水。即不同行的数据显示在同一行中。如何解决这个问题???

我的下一个查询的相同类型的问题。

-- no and salary of second highest salary.
select no, max(salary)
from account
where salary not in
(select max(salary) from account);

输出为: no max(salary) 901 30000

而预期是902,30000。

我在堆栈溢出中搜索了不同行的数据显示在一个但没有得到任何帮助的问题。

提前谢谢你。

4

3 回答 3

2

我想要最高薪的人的没有和薪水

您不需要为此进行聚合。您可以按以下顺序订购并限制:

select no, salary
from account
order by salary desc
limit 1
于 2020-02-18T14:44:11.227 回答
1

MySQL 5.7.5 及更早版本因接受格式错误的 SQL 查询而臭名昭著。

在没有子句的标准 SQLGROUP BY中,所有列都必须聚合或不聚合。但是,您选择聚合一个,而不是另一个。这在 SQL 中是非法的,并且可能导致不确定的结果。但是... MySQL 接受它。

需要您自担风险使用它。

注意:出于兼容性原因,可以在未来版本的 MySQL 中启用这种不良行为。我会鼓励你不要做这样的事情。

于 2020-02-18T14:45:27.343 回答
0

最高薪水

select no, salary from (
    select no, salary, ROW_NUMBER() OVER (partition by salary order by salary desc) as rn
    from account
) as a
where rn = 1 limit 1

对于第二高的薪水

select no, salary from (
    select no, salary, ROW_NUMBER() OVER (partition by salary order by salary desc) as rn
    from account
) as a
where rn = 2 limit 1
于 2020-02-19T07:36:32.333 回答