牛客网SQL刷题地址: https://www.nowcoder.com/ta/sql?page=0

牛客网数据库SQL实战解析(01-10题): https://blog.csdn.net/u010666669/article/details/104763370

牛客网数据库SQL实战解析(11-20题): https://blog.csdn.net/u010666669/article/details/104863298

牛客网数据库SQL实战解析(21-30题): https://blog.csdn.net/u010666669/article/details/104871373

牛客网数据库SQL实战解析(31-40题): https://blog.csdn.net/u010666669/article/details/104977904

牛客网数据库SQL实战解析(41-50题): https://blog.csdn.net/u010666669/article/details/104979427

牛客网数据库SQL实战解析(51-61题): https://blog.csdn.net/u010666669/article/details/104980372

第11题 获取所有员工当前的manager,如果当前的manager是自己的话结果不显示,当前表示to_date='9999-01-01'。


select de.emp_no,
dm.emp_no as manager_no
from dept_emp de
inner 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
;

解析:这里用左连接和内连接都可以

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

select de.dept_no,
de.emp_no,
max(s.salary)
from dept_emp de
left join salaries s
on de.emp_no=s.emp_no
where de.to_date='9999-01-01' and s.to_date='9999-01-01'
group by de.dept_no
;

解析:group by 对部门进行分组,max()函数取每组里面的最大值

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

select title, count(1) as t
from titles
group by title
having t >= 2
;

解析:having t >=2 ,对count后的数据进行过滤

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

select title,
count(distinct emp_no) as t
from titles
group by title
having t >= 2

解析:对emp_no 去重,直接distinct就可以了

第15题 查找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
;

解析:这道题很简单,奇数就是模2余1,注意看下数据格式,如果不是int类型,需要先用cast转数据类型

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

select t.title,
avg(s.salary) as `avg`
from salaries s
left 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
;

解析:这道题主要是考察对avg()函数的使用, 求平均数。

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

select emp_no, salary
from salaries
order by salary desc
limit 1,1
;

解析:薪水第二多的员工,用 limit1,1 表示

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

解析:找到薪水排名第一的员工,然后排名仅次于第一的员工就是排名第二的员工,两个子查询搞定。

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

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

解析:这道题也很简单,搞清楚表结构后,两次 left join 即可求出。

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

SELECT MAX(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;

解析:这道题有两种理解:一是涨幅值为最大薪资值减最小薪资值,二是现在的工资减入职时的工资,考虑到可能存在降薪,题解二的理解是更符合实际的,但是sql不通过。。这里提供这种思考方式,万一面试问到了呢。

牛客网数据库SQL实战解析(11-20题)的更多相关文章

  1. 牛客网数据库SQL实战解析(51-61题)

    牛客网SQL刷题地址: https://www.nowcoder.com/ta/sql?page=0 牛客网数据库SQL实战解析(01-10题): https://blog.csdn.net/u010 ...

  2. 牛客网数据库SQL实战解析(41-50题)

    牛客网SQL刷题地址: https://www.nowcoder.com/ta/sql?page=0 牛客网数据库SQL实战解析(01-10题): https://blog.csdn.net/u010 ...

  3. 牛客网数据库SQL实战解析(31-40题)

    牛客网SQL刷题地址: https://www.nowcoder.com/ta/sql?page=0 牛客网数据库SQL实战解析(01-10题): https://blog.csdn.net/u010 ...

  4. 牛客网数据库SQL实战解析(21-30题)

    牛客网SQL刷题地址: https://www.nowcoder.com/ta/sql?page=0 牛客网数据库SQL实战解析(01-10题): https://blog.csdn.net/u010 ...

  5. 牛客网数据库SQL实战解析(1-10题)

    牛客网SQL刷题地址: https://www.nowcoder.com/ta/sql?page=0 牛客网数据库SQL实战解析(01-10题): https://blog.csdn.net/u010 ...

  6. 牛客网数据库SQL实战1-查找最晚入职员工的所有信息

    题目描述 查找最晚入职员工的所有信息CREATE TABLE `employees` (`emp_no` int(11) NOT NULL,`birth_date` date NOT NULL,`fi ...

  7. 牛客网数据库SQL实战(21-25)

    21.查找所有员工自入职以来的薪水涨幅情况,给出员工编号emp_no以及其对应的薪水涨幅growth,并按照growth进行升序CREATE TABLE `employees` (`emp_no` i ...

  8. 牛客网数据库SQL实战(16-20)

    16.统计出当前各个title类型对应的员工当前薪水对应的平均工资.结果给出title以及平均工资avg.CREATE TABLE `salaries` (`emp_no` int(11) NOT N ...

  9. 牛客网数据库SQL实战(11-15)

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

随机推荐

  1. Python while 循环中使用 else 语句

    Python while 循环中使用 else 语句: else:表示 while 中的语句正常执行完,然后执行 else 语句的部分. 示例: # while 判断条件: # 一行语句 或 多行语句 ...

  2. Django学习路25_ifequal 和 ifnotequal 判断数值是否相等及加减法 {{数值|add 数值}}

    {% ifequal 数值 数值 %} <body> {# 判断是否相等 #} num 当前的值 {{ num }}<br/> {% ifequal num 5 %} {# 判 ...

  3. Qt_Demo_4:汽车管理系统

    1  简介 参考视频:https://www.bilibili.com/video/BV1XW411x7AB?p=3 Github:https://github.com/zhengcixi/Qt_De ...

  4. PHP fgetss() 函数

    定义和用法 fgetss() 函数从打开的文件中返回一行,并过滤掉 HTML 和 PHP 标签. fgetss() 函数会在到达指定长度或读到文件末尾(EOF)时(以先到者为准),停止返回一个新行. ...

  5. 6.28 NOI模拟赛 好题 状压dp 随机化

    算是一道比较新颖的题目 尽管好像是两年前的省选模拟赛题目.. 对于20%的分数 可以进行爆搜,对于另外20%的数据 因为k很小所以考虑上状压dp. 观察最后答案是一个连通块 从而可以发现这个连通块必然 ...

  6. 数据分析First week(7.15~7.21)

    描述统计学 当我们面对大量信息的时候,经常会出现数据越多,事实越模糊的情况,因此我们需要对数据进行简化,描述统计学就是用几个关键的数字来描述数据集的整体情况. 1.集中趋势 1.1 众数 众数是样本观 ...

  7. SmartDb代码修改

    在之前的一篇博客中介绍过SmartDB(https://blog.csdn.net/wuquan_1230/article/details/89145012),在使用的过程中发现一个问题,会造成内存泄 ...

  8. mysql删除数据库提示mysql Error dropping database (can't rmdir './db'...

    1.执行ps aux | grep mysql,查看mysql的data目录,比如结果是--datadir=/var/lib/mysql. 2.进入data目录,删除以该数据库为名字的文件夹.cd / ...

  9. “随手记”开发记录day18

    我们对我们的APP进行“粉刷”,更加凸显它的亮点.进行最后的界面美化,使其符合大众的审美.

  10. Java基础—控制流程语句(条件语句与循环结构)

    与任何程序设计语言一样,Java使用条件语句和循环结构确定控制流程.Java的控制流程结构与C和C++的控制流程机构一样,只有很少的例外情况.没有goto语句,但break语句可以带标签,可以利用它实 ...