牛客SQL题目
题目链接:https://www.nowcoder.com/ta/sql
-
查找最晚入职员工的所有信息
select * from employees where hire_date = (select max(hire_date) from employees);
-
查找入职员工时间排名倒数第3的员工所有信息
select * from employees order by hire_date desc --降序 limit 2,1;--从3项,偏移1项,即第3项
-
查找各个部门当前(to_date='9999-01-01')的领导的当前薪水详情以及其对应部门编号dept_no
select s.*,d.dept_no from salaries as s join dept_manager as d on d.emp_no=s.emp_no where s.to_date='9999-01-01' and d.to_date='9999-01-01';
-
查找所有已经分配部门的员工的last_name和first_name
select e.last_name,e.first_name,d.dept_no from employees as e join dept_emp as d on e.emp_no = d.emp_no;
-
查找所有员工的last_name和first_name以及对应部门编号dept_no,也包括展示没有分配具体部门的员工
select e.last_name,e.first_name,d.dept_no from employees as e left join dept_emp as d--坐表为主,右表补充,为空补NULL on e.emp_no = d.emp_no;
-
查找所有员工入职时候的薪水情况,给出emp_no以及salary, 并按照emp_no进行逆序
select e.emp_no,s.salary from salaries as s join employees as e where e.emp_no = s.emp_no and e.hire_date = s.from_date order by e.emp_no desc;
-
查找薪水涨幅超过15次的员工号emp_no以及其对应的涨幅次数t
count( ):统计记录的条数
还需要group by emp_no将每个员工的记录显示在一条记录中
select emp_no,count(emp_no) as t from salaries group by emp_no having t > 15;
-
找出所有员工当前(to_date='9999-01-01')具体的薪水salary情况,对于相同的薪水只显示一次,并按照逆序显示
distinct:去除重复
select distinct salary-- 去除重复 from salaries where to_date = '9999-01-01' order by salary desc;
-
获取所有部门当前manager的当前薪水情况,给出dept_no, emp_no以及salary,当前表示to_date='9999-01-01'
select d.dept_no,d.emp_no,s.salary from dept_manager as d join salaries as s on d.emp_no=s.emp_no where d.to_date='9999-01-01' and s.to_date='9999-01-01';
-
获取所有非manager的员工emp_no
select emp_no from employees where emp_no not in (select emp_no from dept_manager);
-
获取所有员工当前的manager,如果当前的manager是自己的话结果不显示,当前表示to_date='9999-01-01'。
select e.emp_no,m.emp_no as manager_no from dept_emp as e join dept_manager as m on e.dept_no=m.dept_no where e.emp_no <> m.emp_no -- 当前manager是自己不显示,<>不等于 and e.to_date='9999-01-01' and m.to_date='9999-01-01';
-
获取所有部门中当前员工薪水最高的相关信息,给出dept_no, emp_no以及其对应的salary
select d.dept_no,d.emp_no,max(s.salary) from dept_emp as d join salaries as s on d.emp_no = s.emp_no group by d.dept_no;
-
从titles表获取按照title进行分组,每组个数大于等于2,给出title以及对应的数目t。
select title,count(title) as t from titles group by title having t >= 2;
-
查找employees表所有emp_no为奇数,且last_name不为Mary的员工信息,并按照hire_date逆序排列
select * from employees where emp_no%2 =1 and last_name <> 'Mary' order by hire_date desc;
-
统计出当前各个title类型对应的员工当前(to_date='9999-01-01')薪水对应的平均工资。结果给出title以及平均工资avg。
select t.title,avg(s.salary) from titles as t join salaries as s on t.emp_no = s.emp_no where s.to_date='9999-01-01' and t.to_date='9999-01-01' group by t.title;
-
获取当前(to_date='9999-01-01')薪水第二多的员工的emp_no以及其对应的薪水salary
select emp_no,salary from salaries where to_date='9999-01-01' order by salary desc limit 1,1; -- 降序,取第二个
-
查找当前薪水(to_date='9999-01-01')排名第二多的员工编号emp_no、薪水salary、last_name以及first_name,不准使用order by
select e.emp_no,s.salary,e.last_name,e.first_name from employees as e join salaries as s on e.emp_no=s.emp_no where s.to_date='9999-01-01' order by s.salary desc limit 1,1;
不使用order by:需要用嵌套select和max结合
select e.emp_no,max(salary) ,e.last_name,e.first_name --这里用max(salary) from salaries as s,employees as e where s.emp_no = e.emp_no and salary< -- 小于最大薪水中的最大,就是第二大 ( select max(salary) from salaries where to_date = '9999-01-01' );
-
查找所有员工的last_name和first_name以及对应的dept_name,也包括暂时没有分配部门的员工
双左连接
select e.last_name,e.first_name,de.dept_name from employees as e left join dept_emp as d on e.emp_no=d.emp_no left join departments as de on d.dept_no=de.dept_no;
-
查找员工编号emp_no为10001其自入职以来的薪水salary涨幅值growth
通过入职时间来排序查询:
如果直接用薪水最大值-最小值,有可能最后一次是降薪。
SELECT ( (SELECT salary FROM salaries WHERE emp_no = 10001 ORDER BY to_date DESC LIMIT 1) - (SELECT salary FROM salaries WHERE emp_no = 10001 ORDER BY to_date ASC LIMIT 1) ) AS growth
-
查找所有员工自入职以来的薪水涨幅情况,给出员工编号emp_no以及其对应的薪水涨幅growth,并按照growth进行升序
--将两个查询的结果,当成两个表,进行join select S2.emp_no, (S2.salary-S1.salary) as growth from (select e.emp_no,s.salary from employees as e join salaries as s on e.emp_no=s.emp_no and e.hire_date=s.from_date) as S1 --所有员工的入职工资 join (select e.emp_no,s.salary from employees as e join salaries as s on e.emp_no=s.emp_no and s.to_date='9999-01-01') as S2 --所有员工的当前工资 on S1.emp_no = S2.emp_no order by growth;
-