源表如下:
例如现在需要显示每个岗位中工资排名前10位的员工信息,并显示排名应该要怎么做呢?
Prompt: 有一个某公司职员表,表名为Bank_emp,empno为员工编号,ename为员工姓名,JOB为员工岗位,sal为工资,dept为部门,
请写出一个SQL语句来查询每个岗位下工资排名前10位的员工信息,显示员工编号,姓名,岗位,工资,部门,排名?
这个问题同样可以使用窗口函数ROW_NUMBER()
或RANK()
或DENSE_RANK()
来解决。以下是使用ROW_NUMBER()
的SQL语句:
sql复制代码
WITH ranked_employees AS ( SELECT empno, ename, JOB, sal, dept, ROW_NUMBER() OVER(PARTITION BY JOB ORDER BY sal DESC) as rank FROM Bank_emp ) SELECT empno, ename, JOB, sal, dept, rank FROM ranked_employees WHERE rank <= 10;
在这个查询中,我们先在ranked_employees
的CTE中,为每个岗位的每个员工分配一个基于其工资降序排列的排名。然后,在主查询中,我们只选择每个岗位的排名在前10位的员工。
注意,如果你想在同一岗位、同一工资下有多个员工共享同一排名,可以使用RANK()
或DENSE_RANK()
代替ROW_NUMBER()
。
将SQL复制到Navicat中进行测试;
将每个部门每个岗位下前10名的员工信息显示出来了。
接下来我们继续完成其它需求
例如 : 要显示工资大于整个人力资源部门的员工信息,要怎么实现呢?
Prompt : 有一个某公司职员表,表名为Bank_emp,empno为员工编号,ename为员工姓名,JOB为员工岗位,sal为工资,dept为部门,
请写出一个SQL语句来查询工资大于所有人力资源部的员工信息,显示员工编号,姓名,岗位,工资,部门?
要查询工资大于所有人力资源部员工的员工信息,您可以使用下列SQL语句。它首先在子查询中找到人力资源部的最高工资,然后在主查询中查找工资高于这个值的所有员工。
sql复制代码
SELECT empno, ename, JOB, sal, dept FROM Bank_emp WHERE sal > ( SELECT MAX(sal) FROM Bank_emp WHERE dept = '人力资源部' );
在这个查询中,“SELECT MAX(sal) FROM Bank_emp WHERE dept = '人力资源部'”是一个子查询,它会返回人力资源部的最高工资。然后,主查询将找出工资大于这个值的所有员工。请注意,这个语句假设'dept'列包含部门名称,如'人力资源部'。如果您的表结构不同,可能需要稍微修改这个查询以适应您的需求。
将SQL复制到Navicat中进行测试;
接下来我们完成下一个实例:
例如要显示每个岗位中工资最高的员工信息
Prompt: 有一个某公司职员表,表名为 Bank_emp,empno 为员工编号,ename为员工姓名,JOB为员工岗位,sal为工资,dept为部门,
请写出一个SQL语句来查询每个岗位下工资最高的员工信息,显示员工编号,姓名,岗位,工资,部门?
要查询每个岗位下工资最高的员工信息,可以使用窗口函数ROW_NUMBER()
配合OVER()
子句。假设同一岗位、同一工资下只有一个员工,SQL语句如下:
sql复制代码
WITH ranked_employees AS ( SELECT empno, ename, JOB, sal, dept, ROW_NUMBER() OVER(PARTITION BY JOB ORDER BY sal DESC) as rank FROM Bank_emp ) SELECT empno, ename, JOB, sal, dept FROM ranked_employees WHERE rank = 1;
这个查询首先在ranked_employees
的CTE (Common Table Expressions,即公用表表达式) 中,为每个岗位的每个员工分配一个基于其工资降序排列的排名。然后,在主查询中,我们只选择每个岗位的排名为1(即工资最高)的员工。
如果同一岗位、同一工资下可能有多个员工,可以使用RANK()
或DENSE_RANK()
代替ROW_NUMBER()
,这样会为具有相同工资的员工分配相同的排名。
将SQL复制到Navicat中进行测试;
每个岗位工资最高的员工信息显示出来了。
更多精彩内容: