查找该部门教师的最高薪水
Find the highest salary of instructors in that department
SQL查询:对于每个部门,求该部门教师的最高工资。
讲师模式:讲师(ID , name, dept_name, salary) Id 主键,dept_name 外键引用部门。
部门(dept_name、建筑、预算)
讲师 table 值:
ID Iname dept_name salary
10101 Srinivasan Comp. Sci. 65000
12121 Wu Finance 90000
15151 Mozart Music 40000
22222 Einstein Physics 95000
32343 El Said History 60000
33456 Gold Physics 87000
45565 Katz Comp. Sci. 75000
58583 Califieri History 62000
76543 Singh Finance 80000
76766 Crick Biology 72000
83821 Brandt Comp. Sci. 92000
98345 Kim Elec. Eng. 80000
如果我们尝试手动找出最高薪水,
Brandt Comp. Sci
Wu Finance
Mozart Music
Einstein Physics
Califieri History
Crick Biology
Kim Elec. Eng.
现在我运行这个查询,
select distinct
T.Iname,
T.dept_name
from instructor as T,
instructor as S
where T.salary > S.salary
group by T.dept_name;
我得到了
Kim Elec. Eng.
Brandt Comp. Sci.
Crick Biology
Singh Finance
Gold Physics
Califieri History
我得到的金融和物理结果不正确,甚至没有包括音乐。
我找不到我的错误。我想知道哪里需要修改?
谢谢。
在 MySQL 8+ 上,使用 RANK
:
很容易解决这个问题
WITH cte AS (
SELECT *, RANK() OVER (PARTITION BY dept_name ORDER BY salary DESC) rnk
FROM department
)
SELECT Iname, dept_name, salary
FROM cte
WHERE rnk = 1;
请注意,如果出现平局,以上将报告给定部门内两名或更多教师的薪水最高。
使用 EXISTS
select T.Iname,
T.dept_name
from instructor as T
where not exists (select 1
from instructor as S
where S.dept_name = T.dept_name
and T.salary < S.salary);
我认为以下 SQL 可行。
select Iname, dept_name from instructor as t1 where t1.salary=(select max(salary) from instructor as t2 where t1.dept_name = t2.dept_name);
或
select t1.Iname, t1.dept_name from instructor as t1 left join instructor as t2 on t1.dept_name = t2.dept_name and t1.salary < t2.salary where t2.dept_name is NULL;
另一种方法是在子查询 td_1 中找到部门的最大薪水,然后使用薪水和部门
将其与数据 table 连接起来
select td.Iname, td.dept_name, td.salary
from test_data td
join (select max(salary) salary, dept_name
from test_data td
where td.dept_name = dept_name
group by dept_name) td_1
on td_1.dept_name = td.dept_name
and td_1.salary = td.salary
试试这个:
SELECT ID, Iname, dept_name, salary
FROM instructors
GROUP BY Iname,dept_name
ORDER BY salary DESC ;
SQL查询:对于每个部门,求该部门教师的最高工资。
讲师模式:讲师(ID , name, dept_name, salary) Id 主键,dept_name 外键引用部门。
部门(dept_name、建筑、预算)
讲师 table 值:
ID Iname dept_name salary
10101 Srinivasan Comp. Sci. 65000
12121 Wu Finance 90000
15151 Mozart Music 40000
22222 Einstein Physics 95000
32343 El Said History 60000
33456 Gold Physics 87000
45565 Katz Comp. Sci. 75000
58583 Califieri History 62000
76543 Singh Finance 80000
76766 Crick Biology 72000
83821 Brandt Comp. Sci. 92000
98345 Kim Elec. Eng. 80000
如果我们尝试手动找出最高薪水,
Brandt Comp. Sci
Wu Finance
Mozart Music
Einstein Physics
Califieri History
Crick Biology
Kim Elec. Eng.
现在我运行这个查询,
select distinct
T.Iname,
T.dept_name
from instructor as T,
instructor as S
where T.salary > S.salary
group by T.dept_name;
我得到了
Kim Elec. Eng.
Brandt Comp. Sci.
Crick Biology
Singh Finance
Gold Physics
Califieri History
我得到的金融和物理结果不正确,甚至没有包括音乐。
我找不到我的错误。我想知道哪里需要修改?
谢谢。
在 MySQL 8+ 上,使用 RANK
:
WITH cte AS (
SELECT *, RANK() OVER (PARTITION BY dept_name ORDER BY salary DESC) rnk
FROM department
)
SELECT Iname, dept_name, salary
FROM cte
WHERE rnk = 1;
请注意,如果出现平局,以上将报告给定部门内两名或更多教师的薪水最高。
使用 EXISTS
select T.Iname,
T.dept_name
from instructor as T
where not exists (select 1
from instructor as S
where S.dept_name = T.dept_name
and T.salary < S.salary);
我认为以下 SQL 可行。
select Iname, dept_name from instructor as t1 where t1.salary=(select max(salary) from instructor as t2 where t1.dept_name = t2.dept_name);
或
select t1.Iname, t1.dept_name from instructor as t1 left join instructor as t2 on t1.dept_name = t2.dept_name and t1.salary < t2.salary where t2.dept_name is NULL;
另一种方法是在子查询 td_1 中找到部门的最大薪水,然后使用薪水和部门
将其与数据 table 连接起来select td.Iname, td.dept_name, td.salary
from test_data td
join (select max(salary) salary, dept_name
from test_data td
where td.dept_name = dept_name
group by dept_name) td_1
on td_1.dept_name = td.dept_name
and td_1.salary = td.salary
试试这个:
SELECT ID, Iname, dept_name, salary
FROM instructors
GROUP BY Iname,dept_name
ORDER BY salary DESC ;