牛客网-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题库笔记相关推荐

  1. 牛客网sql题库(1-30题)—— 个人答案与过程解析

    本篇博客分享一下我在牛客网sql题库刷题时,自己敲出来的结果.结果均通过了牛客网的结果验证. 具体的题目就不放在博客中了,感兴趣可以自行去搜索牛客网,找到sql题库在线编程 每道题下面都有我自己写的题 ...

  2. 牛客网数据开发题库_牛客网SQL题库NO.32~40

    不要问为什么没有31题,大概被牛客吞掉了吧,哈哈哈哈 SQL 32[简单] 将employees表的所有员工的last_name和first_name拼接起来作为Name,中间以一个空格区分 CREA ...

  3. 牛客网sql题详解41-50

    41.删除emp_no重复的记录,只保留最小的id对应的记录. CREATE TABLE IF NOT EXISTS titles_test ( id int(11) not null primary ...

  4. python爬取学校题库_如何使用 Python 爬虫爬取牛客网 Java 题库?

    [原文链接]http://www.changxuan.top/?p=146 由于"打怪"失败,最近一直在牛客网上刷题复习备战春招.其中有个 Java专题复习题库,我刷着刷着就想把它 ...

  5. 如何使用 Python 爬虫爬取牛客网 Java 题库?

    [原文链接]http://www.changxuan.top/?p=146 由于"打怪"失败,最近一直在牛客网上刷题复习备战春招.其中有个 Java专题复习题库,我刷着刷着就想把它 ...

  6. Python每日一练——第7天:从入门到实践四十招(牛客网新题库)

    文章目录 1. 单词造句 2. 重复出现的字符串 3. 幸运数字大小 4. 九九乘法表 5. 判断素数 6. 拯救被污染的字符串 7. 程序员节 8. 密码游戏 9. 牛牛学字母 10. 如何让刷题更 ...

  7. 牛客网sql题详解11-20

    11.获取所有员工当前的manager,如果当前的manager是自己的话结果不显示,当前表示to_date='9999-01-01'. 结果第一列给出当前员工的emp_no,第二列给出其manage ...

  8. 牛客网sql题详解31-40

    31.将employees表的所有员工的last_name和first_name拼接起来作为Name,中间以一个空格区分 CREATE TABLE employees ( emp_no int(11) ...

  9. 牛客网---Java题库(21~30)

    21.lterator和Listlterator的区别是什么? literator可用来遍历Set和List集合,但是Listlterator只能用来遍历List. Iterator对集合只能是前向遍 ...

最新文章

  1. 民用报警服务技术浅谈
  2. 细数Android 7.0“牛轧糖”的五大缺陷:不支持悬浮窗口
  3. 微型计算机与维修自测,微机系统及维护第三章自测.doc
  4. php钩子函数示例,PHP中钩子函数的实现与认识
  5. .net EF监控 MiniProfiler
  6. python跟踪脚本进度(类似bash-x)
  7. 【学习笔记】有向无环图上的DP
  8. ubuntu中make头文件找不到_和平精英:游戏中找不到人怎么办?这些技巧帮你练出“火眼金睛”...
  9. promise的状态以及api介绍_前端 api 请求缓存
  10. java实用教程——常用实用类——String类(字符串类)
  11. 印刷点阵字体_印刷术如何确定可读性:衬线与无衬线,以及如何组合字体。
  12. w7提示无法关闭计算机,win7关不了机怎么回事?老司机教你怎么解决电脑关不了机...
  13. 如何处理苹果Mac冻结和无响应的应用程序?
  14. ZR18提高5解题报告
  15. 大话西游版《我叫小沈阳》
  16. 图像Randon变换含Matlab源码
  17. 云计算时代,NGINX将是你的“必杀技”
  18. 计算机进入不了管理器,电脑没有桌面且任务管理器打不开怎么办
  19. 如何做一份详细的百度推广投放方案
  20. 如何让品牌进入元宇宙

热门文章

  1. C++算法——DFS(图解)
  2. OTA 电控信息安全
  3. arcgis九段线、南海诸岛
  4. Jexus for linux 安装说明
  5. 02-ROS的工程结构
  6. RFID技术在固定资产管理中的作用
  7. CF915C Permute Digits(搜索+剪枝)
  8. 自定义函数(创建函数)
  9. python 模块 导入机制 模块搜索 Python包 发布python模块或程序
  10. Log4j使用方式详解