牛客网-SQL题库笔记
牛客网-SQL题库笔记
- 01.最晚入职员工的所有信息
- 02.查找入职员工时间排名倒数第三的员工所有信息
- 03.查找各个部门当前领导当前薪水详情以及其对应部门编号
- 04.查找所有已经分配部门的员工的last_name和first_name以及dept_no
- 05.查找所有员工的last_name和first_name以及对应部门编号dept_no
- 06.查找所有员工入职时候的薪水情况,给出emp_no以及salary
- 07.查找薪水变动超过15次的员工号emp_no以及其对应的变动次数t
- 08.找出所有员工当前具体的薪水salary情况
- 09.获取所有部门当前manager的当前的薪水情况,给出dept_no, emp_no以及salary
- 10.获取所有非manager的员工emp_no
- 11.获取所有员工当前的manager,如果员工是manager的话不显示
- 12.获取当前(to_date='9999-01-01')薪水第二多的员工的emp_no以及其对应的薪水salary
- 13.查找当前薪水(to_date='9999-01-01')排名第二多的员工编号emp_no、薪水salary、last_name以及first_name,你可以不使用order by完成吗
- 14.查找所有员工的last_name和first_name以及对应的dept_name,也包括暂时没有分配部门的员工
- 174.简单.第二高的薪水
- 175.简单.组合两个表
01.最晚入职员工的所有信息
表.employees
emp_no | birth_date | first_name | last_name | gender | hire_date |
---|---|---|---|---|---|
10008 | 1958-02-19 | Saniya | Kalloufi | M | 1994-09-15 |
反思:拿到题目的第一反应是升序然后取最后一位,但是结果显示报错。
仔细看这个hire_date是年月日,而很有可能有员工在同一天入职。故答案不对。
换一个思路:由于在时间上我们要返回最晚入职的,所以可以考虑用max()函数选取最晚时间,此时若存在多个同一天入职的员工也进行返回。
select * from employees
where hire_date=(select max(hire_date) from employees);
02.查找入职员工时间排名倒数第三的员工所有信息
继续上表:
select * from employees
order by hire_date desc limit 1 offset 2;
03.查找各个部门当前领导当前薪水详情以及其对应部门编号
查找各个部门当前(dept_manager.to_date=‘9999-01-01’)领导当前(salaries.to_date=‘9999-01-01’)薪水详情以及其对应部门编号dept_no
(注:请以salaries表为主表进行查询,输出结果以salaries.emp_no升序排序,并且请注意输出结果里面dept_no列是最后一列)
表.salaries
emp_no | salary | from_date | to_date | dept_no |
---|---|---|---|---|
10002 | 72527 | 2001-08-02 | 9999-01-01 | d001 |
10004 | 74057 | 2001-11-27 | 9999-01-01 | d004 |
10005 | 94692 | 2001-09-09 | 9999-01-01 | d003 |
10006 | 43311 | 2001-08-02 | 9999-01-01 | d002 |
10010 | 94409 | 2001-11-23 | 9999-01-01 | d006 |
select s.* ,d.dept_no from salaries as s
inner join dept_manager as d on s.emp_no=d.emp_no
where s.to_date='9999-01-01' and d.to_date='9999-01-01'
order by s.emp_no;
题中dept_manager表有dept_no,emp_no 和 to_date 这三个字段,由于若不用员工编号进行联结可能会导致部分员工工资数据丢失,故用emp_no作为连接字段。
04.查找所有已经分配部门的员工的last_name和first_name以及dept_no
表.dept_emp
last_name | first_name | dept_no |
---|---|---|
Facello | Georgi | d001 |
省略 | 省略 | 省略 |
Piveteau | Duangkaew | d006 |
select e.last_name,e.first_name,d.dept_no
from employees as e
inner join dept_emp as d
on e.emp_no=d.emp_no
05.查找所有员工的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
on e.emp_no=d.emp_no
06.查找所有员工入职时候的薪水情况,给出emp_no以及salary
select e.emp_no,s.salary from employees as e
inner join salaries as s
on e.emp_no=s.emp_no and e.hire_date=s.from_date
order by e.emp_no desc
本题要点输出入职时salary的唯一值,即需满足e.hire_date=s.from_date!!!
看到一个更好的表述,完全不需要employees表:
select emp_no,salary from salaries
group by emp_no
having min(from_date)
order by emp_no DESC
07.查找薪水变动超过15次的员工号emp_no以及其对应的变动次数t
思路分解:
1.查找emp_no,薪水变动次数t
2.条件:薪水变动超过15次
3.变动即出现不同值(我没理解出来是涨还是降,一个意思吧,降也就是负增长,所以只要不同就算变动)
select emp_no,count(distinct salary) as t
from salaries
group by emp_no having t>15
08.找出所有员工当前具体的薪水salary情况
思路分解:
1.查找所有员工的当前薪水
2.去重
3.薪水逆序排列
select distinct salary from salaries
where to_date='9999-01-01'
order by salary desc
其中评论有一种说法是,对于大表一般用distinct效率不高,大数据量的时候都禁止用distinct,建议用group by解决重复问题,对应的代码如下:
select salary from salaries
where to_date='9999-01-01'
group by salary
order by salary desc
09.获取所有部门当前manager的当前的薪水情况,给出dept_no, emp_no以及salary
思路分解:
1.筛选dept_no,emp_no,salary
2.所有部门,故左联结部门表
3.两个表的当前时间
select d.dept_no,d.emp_no,s.salary from dept_manager as d
left 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'
group by s.salary
10.获取所有非manager的员工emp_no
select e.emp_no from employees as e
left join dept_manager as d
on e.emp_no=d.emp_no
where d.emp_no is null
11.获取所有员工当前的manager,如果员工是manager的话不显示
12.获取当前(to_date=‘9999-01-01’)薪水第二多的员工的emp_no以及其对应的薪水salary
1 select emp_no,salary from salary where to_date='9999-01-01 order by salary limit 1,1
2 select emp_no,max(salary) from salaries where to_date='9999-01-01' and salary<(select max(salary) from salaries where to_date='9999-01-01')
13.查找当前薪水(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
and s.to_date='9999-01-01'
and s.salary = (select s1.salary from salaries s1 join salaries s2
on s1.salary<=s2.salary and s1.to_date='9999-01-01'
and s2.to_date='9999-01-01' group by s1.salary
having count(distinct s2.salary)=2 )
14.查找所有员工的last_name和first_name以及对应的dept_name,也包括暂时没有分配部门的员工
select e.last_name,e.first_name,d.dept_name from employees e
left join (select de.emp_no,dp.dept_name from dept_emp de left join departments dp on de.dept_no=dp.dept_no) d
on e.emp_no=d.emp_no
或者
select e.last_name,e.first_name,d.dept_name from employees e
left join (select de.emp_no,dp.dept_name from dept_emp de,departments dp where de.dept_no=dp.dept_no) d
on e.emp_no=d.emp_no
174.简单.第二高的薪水
select (select distinct Salary from Employeeorder by Salary desc limit 1 offset 1)as SecondHighestSalary;
题目要求筛选出第二高的,没有则输出null,这说明要求salary是唯一值,所以想到先用distinct去重筛选,再用select选择一下
但是个人觉得评论区用ifnull语句的更符合题意
select ifnull((select distinct Salaryfrom Employeeorder by Salary desclimit 1,1),null
)as 'SecondHighestSalary'
175.简单.组合两个表
select P.FirstName,P.LastName,A.City,A.State
from Person as P left join Address as A
on P.PersonId=A.PersonId;
牛客网-SQL题库笔记相关推荐
- 牛客网sql题库(1-30题)—— 个人答案与过程解析
本篇博客分享一下我在牛客网sql题库刷题时,自己敲出来的结果.结果均通过了牛客网的结果验证. 具体的题目就不放在博客中了,感兴趣可以自行去搜索牛客网,找到sql题库在线编程 每道题下面都有我自己写的题 ...
- 牛客网数据开发题库_牛客网SQL题库NO.32~40
不要问为什么没有31题,大概被牛客吞掉了吧,哈哈哈哈 SQL 32[简单] 将employees表的所有员工的last_name和first_name拼接起来作为Name,中间以一个空格区分 CREA ...
- 牛客网sql题详解41-50
41.删除emp_no重复的记录,只保留最小的id对应的记录. CREATE TABLE IF NOT EXISTS titles_test ( id int(11) not null primary ...
- python爬取学校题库_如何使用 Python 爬虫爬取牛客网 Java 题库?
[原文链接]http://www.changxuan.top/?p=146 由于"打怪"失败,最近一直在牛客网上刷题复习备战春招.其中有个 Java专题复习题库,我刷着刷着就想把它 ...
- 如何使用 Python 爬虫爬取牛客网 Java 题库?
[原文链接]http://www.changxuan.top/?p=146 由于"打怪"失败,最近一直在牛客网上刷题复习备战春招.其中有个 Java专题复习题库,我刷着刷着就想把它 ...
- Python每日一练——第7天:从入门到实践四十招(牛客网新题库)
文章目录 1. 单词造句 2. 重复出现的字符串 3. 幸运数字大小 4. 九九乘法表 5. 判断素数 6. 拯救被污染的字符串 7. 程序员节 8. 密码游戏 9. 牛牛学字母 10. 如何让刷题更 ...
- 牛客网sql题详解11-20
11.获取所有员工当前的manager,如果当前的manager是自己的话结果不显示,当前表示to_date='9999-01-01'. 结果第一列给出当前员工的emp_no,第二列给出其manage ...
- 牛客网sql题详解31-40
31.将employees表的所有员工的last_name和first_name拼接起来作为Name,中间以一个空格区分 CREATE TABLE employees ( emp_no int(11) ...
- 牛客网---Java题库(21~30)
21.lterator和Listlterator的区别是什么? literator可用来遍历Set和List集合,但是Listlterator只能用来遍历List. Iterator对集合只能是前向遍 ...
最新文章
- 民用报警服务技术浅谈
- 细数Android 7.0“牛轧糖”的五大缺陷:不支持悬浮窗口
- 微型计算机与维修自测,微机系统及维护第三章自测.doc
- php钩子函数示例,PHP中钩子函数的实现与认识
- .net EF监控 MiniProfiler
- python跟踪脚本进度(类似bash-x)
- 【学习笔记】有向无环图上的DP
- ubuntu中make头文件找不到_和平精英:游戏中找不到人怎么办?这些技巧帮你练出“火眼金睛”...
- promise的状态以及api介绍_前端 api 请求缓存
- java实用教程——常用实用类——String类(字符串类)
- 印刷点阵字体_印刷术如何确定可读性:衬线与无衬线,以及如何组合字体。
- w7提示无法关闭计算机,win7关不了机怎么回事?老司机教你怎么解决电脑关不了机...
- 如何处理苹果Mac冻结和无响应的应用程序?
- ZR18提高5解题报告
- 大话西游版《我叫小沈阳》
- 图像Randon变换含Matlab源码
- 云计算时代,NGINX将是你的“必杀技”
- 计算机进入不了管理器,电脑没有桌面且任务管理器打不开怎么办
- 如何做一份详细的百度推广投放方案
- 如何让品牌进入元宇宙