牛客网数据库SQL实战详细剖析(11-20)

简介: 牛客网数据库SQL实战详细剖析(11-20)

这是一个系列文章,总共61题,分6期,有答案以及解题思路,并附上解题的一个思考过程。


具体题目可参考牛客网的SQL实战模块:

https://www.nowcoder.com/ta/sql?page=0



一、牛客网数据库SQL实战详细剖析(1-10)

第十一题:获取所有员工当前的manager,如果当前的manager是自己的话结果不显示,当前表示to_date='9999-01-01'。结果第一列给出当前员工的emp_no,第二列给出其manager对应的manager_no。



SELECT  de.emp_no,  dm.emp_no AS manager_no FROM  dept_emp deLEFT JOIN dept_manager dm ON de.dept_no = dm.dept_no WHERE  de.to_date = '9999-01-01'AND dm.to_date = '9999-01-01'AND de.emp_no <> dm.emp_no;


解题思路:重点要理解两表之间的逻辑关系和题目要求。有三个关键点:


①每个部门都有一个manager 每个人都有自己所在的部门。所以用部门号dept_no作为联结条件,左联结和内联结都可以;②如果员工当前的manager是自己的话结果不显


示,这就要求dept_emp表的员工编号emp_no和dept_manager的员工编号不相等;③题目要求当前的manager,所以最后的经理表dept_manager的时间为to_date='9999-01-01',严谨起见,员工表dept_emp的时间也应该是to_date='9999-01-01'。 


第十二题:获取所有部门中当前员工薪水最高的相关信息,给出dept_no, emp_no以及其对应的salary


SELECT  d.dept_no,  s.emp_no,max( s.salary ) AS salary FROM  salaries sLEFT JOIN dept_emp d ON s.emp_no = d.emp_no WHERE  s.to_date = '9999-01-01'AND d.to_date = '9999-01-01'GROUP BY  d.dept_no;


解题思路:①用GROUP BY d.dept_no将每个部门分为一组,用MAX()函数选取每组中工资最高者。②为获得当前薪水,工资表和部门表的to_date都是'9999-01-01' 。 


第十三题:从titles表获取按照title进行分组,每组个数大于等于2,给出title以及对应的数目t


SELECT  title,count( title ) AS t FROM  titles GROUP BY  title HAVING  t >= 2;


解题思路:使用group by将title分组,再用having子句找出大于等于2的组,having必须在group by之后,并且有group by才能使用having,聚合参数也可以是count(*) 和count(emp_no) ,还要注意>=号之间不能有空格,否则会出错。 


第十四题:从titles表获取按照title进行分组,每组个数大于等于2,给出title以及对应的数目t。注意对于重复的emp_no进行忽略


SELECT  title,count( DISTINCT emp_no ) AS t FROM  titles GROUP BY  title HAVING  t >= 2;


解题思路:参考上题思路,同时使用distinct去重emp_no。


 第十五题:查找employees表所有emp_no为奇数,且last_name不为Mary的员工信息,并按照hire_date逆序排列


SELECT  * FROM  employees WHERE  emp_no % 2 = 1AND last_name != 'Mary'ORDER BY  hire_date DESC;


解题思路:员工号为奇数,则emp_no取余应为1,last_name不为Mary,用‘!=’表示,另外注意字符串要用单括号括起来,逆序用desc。 


第十六题:统计出当前各个title类型对应的员工当前(to_date='9999-01-01')薪水对应的平均工资。结果给出title以及平均工资avg。


SELECT  t.title,avg( salary ) AS avgFROM  salaries sINNER JOIN titles t ON s.emp_no = t.emp_no WHERE  s.to_date = '9999-01-01'AND t.to_date = '9999-01-01'GROUP BY  t.title;

解题思路:使用group by 对title进行分组,当前用两表to_date='9999-01-01'进行限定,平均工资用聚合函数avg。 


第十七题:获取当前(to_date='9999-01-01')薪水第二多的员工的emp_no以及其对应的薪水salary


SELECT  emp_no,  salary FROM  salaries WHERE  salary = ( SELECT max( salary ) FROM salaries WHERE to_date = '9999-01-01' AND salary < ( SELECT max( salary ) FROM salaries ) );

解题思路:本题难点在于如何找出薪水排第二的员工,使用子查询里嵌套子查询。①先在工资表里找出最多工资,再以工资小于最大工资为限定条件,即salary < (select max(salary)可以得到排名第二的工资。


②再使用max(salary)在除去排名第一工资的表里找最大的工资,即找到排名第二的工资。


③这个写法,不管工资第一多的员工有多少个,都能查到工资第二多的员工,且当工资第二多的员工有多个时,也都能查询出来,可以插入数据验证。 以下这种写法,尽管第一名工资有多个时仍然能查出工资第二多的,但当工资第二多的有多个员工的时候,只能查询出一个,不能查询出多个。



SELECT  emp_no,max( salary ) FROM  salaries WHERE  salary < ( SELECT max( salary ) FROM salaries ) AND to_date = '9999-01-01';

 
第十八题:查找当前薪水(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 eINNER JOIN salaries s ON e.emp_no = s.emp_no WHERE  salary = ( SELECT max( salary ) FROM salaries WHERE to_date = '9999-01-01' AND salary < ( SELECT max( salary ) FROM salaries ) );


解题思路:本题只需要在上一题的基础上增加一个内联结(左联结)即可将薪水salary、last_name以及first_name查询出来。  


第十九题:查找所有员工的last_name和first_name以及对应的dept_name,也包括暂时没有分配部门的员工



SELECT  last_name,  first_name,  dept_name FROM  (SELECT  e.last_name,  e.first_name,  de.dept_no FROM  employees eLEFT JOIN dept_emp de ON e.emp_no = de.emp_no   ) aLEFT JOIN departments dp ON a.dept_no = dp.dept_no;


解题思路:本题关键在于理清三表之间关联关系。需要使用两次左联结。红色部分可以省略。


①题目要求包括暂时没有分配部门的员工,所以将employees作为主表,使用左联结将其和dept_emp表联结,联结条件为员工编号emp_no,得出所有员工所在部门,并将结果命名为a。


②将查询结果a与departments左联结,联结条件为部门编号dept_no,求出部门名字dept_name。 


第二十题:查找员工编号emp_no为10001其自入职以来的薪水salary涨幅值growth

方法一:


SELECTmax( salary ) - min( salary ) AS growth FROM  salaries WHERE  emp_no = '10001';


方法二:


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;
FROM  salaries;


解题思路:对“入职以来的薪水salary涨幅值growth”有两种理解,第一种是员工入职以来工资最大值减去工资最小值,参考方法一。第二种理解是最新一次工资减去入职时的工资,即为涨幅值growth,参考方法二,方法二更严谨。


--end--

相关文章
|
20天前
|
SQL 存储 关系型数据库
【SQL技术】不同数据库引擎 SQL 优化方案剖析
不同数据库系统(MySQL、PostgreSQL、Doris、Hive)的SQL优化策略。存储引擎特点、SQL执行流程及常见操作(如条件查询、排序、聚合函数)的优化方法。针对各数据库,索引使用、分区裁剪、谓词下推等技术,并提供了具体的SQL示例。通用的SQL调优技巧,如避免使用`COUNT(DISTINCT)`、减少小文件问题、慎重使用`SELECT *`等。通过合理选择和应用这些优化策略,可以显著提升数据库查询性能和系统稳定性。
78 9
|
1月前
|
存储 缓存 监控
71.7万/秒到1.4万/秒!数据库查询优化实战
在现代计算机系统中,程序的局部性原理是优化性能的关键。通过利用时间局部性和空间局部性,可以显著提升数据访问效率,减少高开销的操作如内存访问和网络 I/O。本文将探讨如何利用空间局部性原理,在实际案例中减少数据库查询量,并通过详细的监控和优化措施确保系统的稳定性和高效性。
71.7万/秒到1.4万/秒!数据库查询优化实战
|
1月前
|
SQL Java 数据库连接
【潜意识Java】MyBatis中的动态SQL灵活、高效的数据库查询以及深度总结
本文详细介绍了MyBatis中的动态SQL功能,涵盖其背景、应用场景及实现方式。
111 6
|
2月前
|
SQL Oracle 数据库
使用访问指导(SQL Access Advisor)优化数据库业务负载
本文介绍了Oracle的SQL访问指导(SQL Access Advisor)的应用场景及其使用方法。访问指导通过分析给定的工作负载,提供索引、物化视图和分区等方面的优化建议,帮助DBA提升数据库性能。具体步骤包括创建访问指导任务、创建工作负载、连接工作负载至访问指导、设置任务参数、运行访问指导、查看和应用优化建议。访问指导不仅针对单条SQL语句,还能综合考虑多条SQL语句的优化效果,为DBA提供全面的决策支持。
100 11
|
2月前
|
SQL 关系型数据库 MySQL
MySQL导入.sql文件后数据库乱码问题
本文分析了导入.sql文件后数据库备注出现乱码的原因,包括字符集不匹配、备注内容编码问题及MySQL版本或配置问题,并提供了详细的解决步骤,如检查和统一字符集设置、修改客户端连接方式、检查MySQL配置等,确保导入过程顺利。
|
2月前
|
SQL 监控 安全
SQL Servers审核提高数据库安全性
SQL Server审核是一种追踪和审查SQL Server上所有活动的机制,旨在检测潜在威胁和漏洞,监控服务器设置的更改。审核日志记录安全问题和数据泄露的详细信息,帮助管理员追踪数据库中的特定活动,确保数据安全和合规性。SQL Server审核分为服务器级和数据库级,涵盖登录、配置变更和数据操作等事件。审核工具如EventLog Analyzer提供实时监控和即时告警,帮助快速响应安全事件。
|
1月前
|
关系型数据库 MySQL 数据库连接
数据库连接工具连接mysql提示:“Host ‘172.23.0.1‘ is not allowed to connect to this MySQL server“
docker-compose部署mysql8服务后,连接时提示不允许连接问题解决
|
21天前
|
关系型数据库 MySQL 数据库
Docker Compose V2 安装常用数据库MySQL+Mongo
以上内容涵盖了使用 Docker Compose 安装和管理 MySQL 和 MongoDB 的详细步骤,希望对您有所帮助。
120 42
|
12天前
|
关系型数据库 MySQL 网络安全
如何排查和解决PHP连接数据库MYSQL失败写锁的问题
通过本文的介绍,您可以系统地了解如何排查和解决PHP连接MySQL数据库失败及写锁问题。通过检查配置、确保服务启动、调整防火墙设置和用户权限,以及识别和解决长时间运行的事务和死锁问题,可以有效地保障应用的稳定运行。
67 25
|
7天前
|
SQL 关系型数据库 MySQL
数据库数据恢复——MySQL简介和数据恢复案例
MySQL数据库数据恢复环境&故障: 本地服务器,安装的windows server操作系统。 操作系统上部署MySQL单实例,引擎类型为innodb,表空间类型为独立表空间。该MySQL数据库没有备份,未开启binlog。 人为误操作,在用Delete命令删除数据时未添加where子句进行筛选导致全表数据被删除,删除后未对该表进行任何操作。

热门文章

最新文章