【MySql】牛客SQL刷题(上)
牛客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;统计各个部门对应员工涨幅的次数总和,给出部门编码dept_no、部门名称dept_name以及次数sum
select dp.dept_no,dp.dept_name,count(s.emp_no) as sum
from departments as dp
join dept_emp as de on de.dept_no = dp.dept_no
join salaries as s
on de.emp_no = s.emp_no
group by
de.dept_no;对所有员工的当前(to_date='9999-01-01')薪水按照salary进行按照1-N的排名,相同salary并列且按照emp_no升序排列
SELECT s1.emp_no, s1.salary, COUNT(DISTINCT s2.salary) AS rank
FROM salaries AS s1, salaries AS s2
WHERE s1.to_date = '9999-01-01' AND s2.to_date = '9999-01-01' AND s1.salary <= s2.salary
GROUP BY s1.emp_no
ORDER BY s1.salary DESC, s1.emp_no ASC获取所有非manager员工当前的薪水情况,给出dept_no、emp_no以及salary ,当前表示to_date='9999-01-01'
select de.dept_no,de.emp_no,s.salary
from dept_emp as de
join salaries as s
on de.emp_no=s.emp_no
where de.emp_no not in (select emp_no from dept_manager where to_date='9999-01-01')
and de.to_date='9999-01-01'
and s.to_date='9999-01-01';获取员工其当前的薪水比其manager当前薪水还高的相关信息,当前表示to_date='9999-01-01',
select S1.emp_no as emp_no,S2.emp_no as manager_no,S1.salary as emp_salary,S2.salary as manager_salary
from
(select s.salary,e.emp_no,e.dept_no from salaries as s join dept_emp as e on e.emp_no = s.emp_no and s.to_date='9999-01-01') as S1,
(select s.salary,m.emp_no,m.dept_no from salaries as s join dept_manager as m on m.emp_no = s.emp_no and s.to_date='9999-01-01') as S2
where S1.dept_no = S2.dept_no and S1.salary > S2.salary汇总各个部门当前员工的title类型的分配数目,结果给出部门编号dept_no、dept_name、其当前员工所有的title以及该类型title对应的数目count
select d.dept_no,d.dept_name,t.title,count(t.title) as count
from titles as t
join dept_emp as e
on e.emp_no = t.emp_no and e.to_date='9999-01-01' and t.to_date='9999-01-01'
join
departments as d
on d.dept_no = e.dept_no
group by d.dept_no,T.title给出每个员工每年薪水涨幅超过5000的员工编号emp_no、薪水变更开始日期from_date以及薪水涨幅值salary_growth,并按照salary_growth逆序排列。
提示:在sqlite中获取datetime时间对应的年份函数为strftime('%Y', to_date)
select s2.emp_no,s2.from_date,s2.salary-s1.salary as salary_growth
from salaries as s1,salaries as s2
where s1.emp_no = s2.emp_no
and salary_growth > 5000
and (strftime("%Y",s2.to_date) - strftime("%Y",s1.to_date) = 1
OR strftime("%Y",s2.from_date) - strftime("%Y",s1.from_date) = 1)
order by salary_growth desc查找描述信息中包括robot的电影对应的分类名称以及电影数目,而且还需要该分类对应电影数量>=5部
SELECT c.name AS name, COUNT(f.film_id) AS amount
FROM film AS f, film_category AS fc, category AS c,
(SELECT category_id FROM film_category GROUP BY category_id HAVING COUNT(category_id) >= 5) AS cc
WHERE f.description LIKE '%robot%'
AND f.film_id = fc.film_id
AND fc.category_id = c.category_id
AND c.category_id = cc.category_id使用join查询方式找出没有分类的电影id以及名称
select f.film_id,f.title
from film as f
left join
film_category as fc
on fc.film_id = f.film_id
where fc.category_id is null使用子查询的方式找出属于Action分类的所有电影对应的title,description
-- 非子查询
select f.title,f.description
from film as f,film_category as fc,
(select category_id from category where name = 'Action') as ac
where f.film_id = fc.film_id and fc.category_id = ac.category_id--join
select f.title,f.description
from film as f
inner join
film_category as fc
on f.film_id = fc.film_id
inner join
category as c
on c.category_id = fc.category_id
where c.name = 'Action';--子查询
select f.title,f.description
from film as f where f.film_id in
(select fc.film_id from film_category as fc where fc.category_id in
(select c.category_id from category as c where name ='Action'))explain ,此题毫无意义 = =
【MySql】牛客SQL刷题(上)的更多相关文章
- 牛客SQL刷题第一趴——非技术入门基础篇
user_profile表: id device_id gender age university province 1 2138 male 21 北京大学 Beijing 2 3214 male ...
- 牛客SQL刷题第三趴——SQL必知必会
01检索数据 SQL60 从 Customers 表中检索所有的 ID 编写 SQL 语句,从 Customers 表中检索所有的cust_id select * from Customers; SQ ...
- 牛客SQL刷题第三趴——SQL大厂面试真题
01 某音短视频 SQL156 各个视频的平均完播率 [描述]用户-视频互动表tb_user_video_log.(uid-用户ID, video_id-视频ID, start_time-开始观看时间 ...
- 牛客网刷题(纯java题型 1~30题)
牛客网刷题(纯java题型 1~30题) 应该是先extend,然后implement class test extends A implements B { public static void m ...
- 牛客网刷题(纯java题型 31~60题)
牛客网刷题(纯java题型 31~60题) 重写Override应该满足"三同一大一小"三同:方法名相同,参数列表相同,返回值相同或者子类的返回值是父类的子类(这一点是经过验证的) ...
- 牛客网刷题总结—Day1
1.关于哈夫曼树 哈夫曼树也称最优二叉树,其n个叶子节点都是带有权值的,其节点的带权路径长度(n个叶子节点的权值*其到根节点的路径之和)最小的二叉树即为哈夫曼树. 一般的哈夫曼树不存在度为1的节点(除 ...
- 牛客练习赛 A题 筱玛的快乐
链接:https://ac.nowcoder.com/acm/contest/342/A来源:牛客网 筱玛的快乐 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 524288K,其他语 ...
- 牛客练习赛26 E-树上路径 (树链剖分+线段树)
链接:https://ac.nowcoder.com/acm/contest/180/E 来源:牛客网 树上路径 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 262144K,其他语 ...
- 出题人的RP值(牛客练习赛38--A题)(排序)
链接:https://ac.nowcoder.com/acm/contest/358/A来源:牛客网 题目描述 众所周知,每个人都有自己的rp值(是个非负实数),膜别人可以从别人身上吸取rp值. 然而 ...
随机推荐
- yii2 HeadersAlreadySentException 报错 解决方案
报错如下: An Error occurred while handling another error: exception Stack trace: # /xxxx/xxxx/vendor/yi ...
- 使用Varnish为网站加速
(1).Varnish概述 Varnish是一款高性能的开源HTTP加速器,可以有效降低web服务器的负载,提升访问速度.根据官方的说法,Varnish是一个cache型的HTTP反向代理. Varn ...
- IDEA 多模块工程相互依赖
最近为了结构项目,抽离通用模块,同时使用一个工程管理所有模块,使用了多模块工程.不过在依赖其他模块的编译上出现了问题,总是报找不到被依赖的jar包. 最后的解决办法也很简单,对于被依赖的模块,要在ma ...
- 【计算机视觉】图像配准(Image Registration)
(Source:https://blog.sicara.com/image-registration-sift-deep-learning-3c794d794b7a) 图像配准方法概述 图像配准广泛 ...
- 18点睛Spring4.1-Meta Annotation
18.1 Meta Annotation 元注解:顾名思义,就是注解的注解 当我们某几个注解要在多个地方重复使用的时候,写起来比较麻烦,定义一个元注解可以包含多个注解的含义,从而简化代码 下面我们用& ...
- jvm误区--动态对象年龄判定
原文链接:https://blog.csdn.net/u014493323/article/details/82921740 虚拟机并不是永远地要求对象的年龄必须达到了MaxTenuringThres ...
- TCP/IP学习笔记8--数据链路之基本概念
"在你生命的最初30年中,你养成习惯:在你生命的最后30年中,你的习惯决定了你."---- Steve Jobs TCP/IP对于OSI参考模型的数据链路成及以下部分(物理层)没有 ...
- js里typeof和instanceof和箭头表达式要注意的地方,以及其他
如果学过类似C#这样的语言,然后定义两个类class Mu{}和class Ku{},那么显然typeof Mu != typeof Ku的,但是在js里则不是这样,对于Mu和Ku的对象进行typeo ...
- 【剑指offer】面试题 25. 合并两个排序的链表
面试题 25. 合并两个排序的链表 NowCoder 题目描述 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. Java 实现 ListNode Clas ...
- [转帖]QC 和 PD:关于你所不知道的快充
QC 和 PD:关于你所不知道的快充 http://www.sohu.com/a/276214250_465976 2018-11-18 06:02 当我们使用支持 PD 或者 QC 快充协议的电源适 ...