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

CREATE TABLE `employees` (
`emp_no` int(11) NOT NULL,
`birth_date` date NOT NULL,
`first_name` varchar(14) NOT NULL,
`last_name` varchar(16) NOT NULL,
`gender` char(1) NOT NULL,
`hire_date` date NOT NULL,
PRIMARY KEY (`emp_no`));
CREATE TABLE `salaries` (
`emp_no` int(11) NOT NULL,
`salary` int(11) NOT NULL,
`from_date` date NOT NULL,
`to_date` date NOT NULL,
PRIMARY KEY (`emp_no`,`from_date`));

输入描述:

思路:先分别用两次LEFT JOIN左连接employees与salaries,建立两张表,
分别存放员工当前工资(sCurrent)与员工入职时的工资(sStart),
再用INNER JOIN连接sCurrent与sStart,最后限定在同一员工下用当前工资减去入职工资。
法一:内层用LEFT JOIN,外层用INNER JOIN(内层也可以改用 INNER JOIN)
SELECT sCurrent.emp_no, (sCurrent.salary-sStart.salary) AS growth
FROM (SELECT s.emp_no, s.salary FROM employees e, salaries s WHERE e.emp_no = s.emp_no AND s.to_date = '9999-01-01')
AS sCurrent INNER JOIN(SELECT s.emp_no, s.salary FROM employees e, salaries s WHERE e.emp_no = s.emp_no AND s.from_date = e.hire_date)
AS sStart
ON sCurrent.emp_no = sStart.emp_no
ORDER BY growth;
法二:内外都层用FROM并列查询
SELECT sCurrent.emp_no, (sCurrent.salary-sStart.salary) AS growth
FROM (SELECT s.emp_no, s.salary FROM employees e, salaries s WHERE e.emp_no = s.emp_no AND s.to_date = '9999-01-01')
AS sCurrent,(SELECT s.emp_no, s.salary FROM employees e, salaries s WHERE e.emp_no = s.emp_no AND s.from_date = e.hire_date)
AS sStart
WHERE sCurrent.emp_no = sStart.emp_no
ORDER BY growth;

22.统计各个部门对应员工涨幅的次数总和,给出部门编码dept_no、部门名称dept_name以及次数sum

CREATE TABLE `departments` (
`dept_no` char(4) NOT NULL,
`dept_name` varchar(40) NOT NULL,
PRIMARY KEY (`dept_no`));
CREATE TABLE `dept_emp` (
`emp_no` int(11) NOT NULL,
`dept_no` char(4) NOT NULL,
`from_date` date NOT NULL,
`to_date` date NOT NULL,
PRIMARY KEY (`emp_no`,`dept_no`));
CREATE TABLE `salaries` (
`emp_no` int(11) NOT NULL,
`salary` int(11) NOT NULL,
`from_date` date NOT NULL,
`to_date` date NOT NULL,
PRIMARY KEY (`emp_no`,`from_date`));

输入描述:

SELECT dt.dept_no,dt.dept_name,COUNT(salary) AS SUM
FROM dept_emp de LEFT JOIN departments dt ON de.dept_no=dt.dept_noLEFT JOIN salaries s ON de.emp_no=s.emp_no
GROUP BY dt.dept_no,dt.dept_name;

23.对所有员工的当前(to_date='9999-01-01')薪水按照salary进行按照1-N的排名,相同salary并列且按照emp_no升序排列

CREATE TABLE `salaries` (
`emp_no` int(11) NOT NULL,
`salary` int(11) NOT NULL,
`from_date` date NOT NULL,
`to_date` date NOT NULL,
PRIMARY KEY (`emp_no`,`from_date`));

输入描述:

法一-SQL Server数据库中开窗函数(未通过):
1.
SELECT emp_no,salary,rank() over(order by salary ASC) as rank
FROM salary
WHERE to_date='9999-01-01'
ORDER BY emp_no;
2.
SELECT emp_no, salaries, DENSE_RANK() OVER(ORDER BY salary DESC) AS rank
WHERE to_date = '9999-01-01'
ORDER BY salary DESC, emp_no ASC;
法二:复用salaries表进行比较排名
1、从两张相同的salaries表(分别为s1与s2)进行对比分析,先将两表限定条件设为to_date = '9999-01-01',挑选出当前所有员工的薪水情况。
2、本题的精髓在于 s1.salary <= s2.salary,意思是在输出s1.salary的情况下,
有多少个s2.salary大于等于s1.salary,
比如当s1.salary=94409时,有3个s2.salary(分别为94692,94409,94409)大于等于它,
但由于94409重复,利用COUNT(DISTINCT s2.salary)去重可得工资为94409的rank等于2。其余排名以此类推。
3、千万不要忘了GROUP BY s1.emp_no,否则输出的记录只有一条(可能是第一条或者最后一条,根据不同的数据库而定),
因为用了合计函数COUNT()
4、最后先以 s1.salary 逆序排列,再以 s1.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;

24.获取所有非manager员工当前的薪水情况,给出dept_no、emp_no以及salary ,当前表示to_date='9999-01-01'

CREATE TABLE `dept_emp` (
`emp_no` int(11) NOT NULL,
`dept_no` char(4) NOT NULL,
`from_date` date NOT NULL,
`to_date` date NOT NULL,
PRIMARY KEY (`emp_no`,`dept_no`));
CREATE TABLE `dept_manager` (
`dept_no` char(4) NOT NULL,
`emp_no` int(11) NOT NULL,
`from_date` date NOT NULL,
`to_date` date NOT NULL,
PRIMARY KEY (`emp_no`,`dept_no`));
CREATE TABLE `employees` (
`emp_no` int(11) NOT NULL,
`birth_date` date NOT NULL,
`first_name` varchar(14) NOT NULL,
`last_name` varchar(16) NOT NULL,
`gender` char(1) NOT NULL,
`hire_date` date NOT NULL,
PRIMARY KEY (`emp_no`));
CREATE TABLE `salaries` (
`emp_no` int(11) NOT NULL,
`salary` int(11) NOT NULL,
`from_date` date NOT NULL,
`to_date` date NOT NULL,
PRIMARY KEY (`emp_no`,`from_date`));

输入描述:

重点:表连接,NOT IN
SELECT de.dept_no, s.emp_no, s.salary
FROM (employees AS e INNER JOIN salaries AS s ON s.emp_no = e.emp_no AND s.to_date = '9999-01-01')
INNER JOIN dept_emp AS de
ON e.emp_no = de.emp_no
WHERE de.emp_no NOT IN
(SELECT emp_no
FROM dept_manager
WHERE to_date = '9999-01-01');

25.获取员工其当前的薪水比其manager当前薪水还高的相关信息,当前表示to_date='9999-01-01',
结果第一列给出员工的emp_no,
第二列给出其manager的manager_no,
第三列给出该员工当前的薪水emp_salary,
第四列给该员工对应的manager当前的薪水manager_salary

CREATE TABLE `dept_emp` (
`emp_no` int(11) NOT NULL,
`dept_no` char(4) NOT NULL,
`from_date` date NOT NULL,
`to_date` date NOT NULL,
PRIMARY KEY (`emp_no`,`dept_no`));
CREATE TABLE `dept_manager` (
`dept_no` char(4) NOT NULL,
`emp_no` int(11) NOT NULL,
`from_date` date NOT NULL,
`to_date` date NOT NULL,
PRIMARY KEY (`emp_no`,`dept_no`));
CREATE TABLE `salaries` (
`emp_no` int(11) NOT NULL,
`salary` int(11) NOT NULL,
`from_date` date NOT NULL,
`to_date` date NOT NULL,
PRIMARY KEY (`emp_no`,`from_date`));

输入描述:

思路:创建两张表(一张记录当前所有员工的工资,另一张只记录部门经理的工资)进行比较
1、先用INNER JOIN连接salaries和demp_emp,建立当前所有员工的工资记录sem
2、再用INNER JOIN连接salaries和demp_manager,建立当前所有员工的工资记录sdm
3、最后用限制条件sem.dept_no = sdm.dept_no AND sem.salary > sdm.salary找出同一部门中工资比经理高的员工,
并根据题意依次输出emp_no、manager_no、emp_salary、manager_salary
SELECT sem.emp_no AS emp_no, sdm.emp_no AS manager_no,
sem.salary AS emp_salary, sdm.salary AS manager_salary
FROM (SELECT s.salary, s.emp_no, de.dept_no FROM salaries s INNER JOIN dept_emp de
ON s.emp_no = de.emp_no AND s.to_date = '9999-01-01' ) AS sem,
(SELECT s.salary, s.emp_no, dm.dept_no FROM salaries s INNER JOIN dept_manager dm
ON s.emp_no = dm.emp_no AND s.to_date = '9999-01-01' ) AS sdm
WHERE sem.dept_no = sdm.dept_no AND sem.salary > sdm.salary;

26.汇总各个部门当前员工的title类型的分配数目,结果给出部门编号dept_no、dept_name、其当前员工所有的title以及该类型title对应的数目count

CREATE TABLE `departments` (
`dept_no` char(4) NOT NULL,
`dept_name` varchar(40) NOT NULL,
PRIMARY KEY (`dept_no`));
CREATE TABLE `dept_emp` (
`emp_no` int(11) NOT NULL,
`dept_no` char(4) NOT NULL,
`from_date` date NOT NULL,
`to_date` date NOT NULL,
PRIMARY KEY (`emp_no`,`dept_no`));
CREATE TABLE IF NOT EXISTS `titles` (
`emp_no` int(11) NOT NULL,
`title` varchar(50) NOT NULL,
`from_date` date NOT NULL,
`to_date` date DEFAULT NULL);

输入描述:

思路:用GROUP BY同时对 de.dept_no 和 t.title 进行分组,
1、先用 INNER JOIN 连接 dept_emp 与 salaries,根据测试数据添加限定条件
de.to_date = '9999-01-01' AND t.to_date = '9999-01-01',即当前员工的当前头衔
2、再用 INNER JOIN 连接departments,限定条件为 de.dept_no = dp.dept_no,即部门编号相同
3、最后用 GROUP BY 同时对 de.dept_no 和 t.title 进行分组,
用 COUNT(t.title) 统计相同部门下相同头衔的员工个数
SELECT de.dept_no, dp.dept_name, t.title, COUNT(t.title) AS count
FROM titles AS t INNER JOIN dept_emp AS de ON t.emp_no = de.emp_no AND de.to_date = '9999-01-01' AND t.to_date = '9999-01-01'
INNER JOIN departments AS dp ON de.dept_no = dp.dept_no
GROUP BY de.dept_no, t.title;

27.给出每个员工每年薪水涨幅超过5000的员工编号emp_no、薪水变更开始日期from_date以及薪水涨幅值salary_growth,并按照salary_growth逆序排列。

提示:在sqlite中获取datetime时间对应的年份函数为strftime('%Y', to_date)

CREATE TABLE `salaries` (
`emp_no` int(11) NOT NULL,
`salary` int(11) NOT NULL,
`from_date` date NOT NULL,
`to_date` date NOT NULL,
PRIMARY KEY (`emp_no`,`from_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;

28.查找描述信息中包括robot的电影对应的分类名称以及电影数目,而且还需要该分类对应电影数量>=5部

CREATE TABLE IF NOT EXISTS film (
film_id smallint(5)  NOT NULL DEFAULT '0',
title varchar(255) NOT NULL,
description text,
PRIMARY KEY (film_id));

CREATE TABLE category  (
category_id  tinyint(3)  NOT NULL ,
name  varchar(25) NOT NULL, `last_update` timestamp,
PRIMARY KEY ( category_id ));

CREATE TABLE film_category  (
film_id  smallint(5)  NOT NULL,
category_id  tinyint(3)  NOT NULL, `last_update` timestamp);

思路:1、找到对应电影数量>=5的所有分类,建立成虚表cc:
(select category_id, count(film_id) as category_num
from  film_category  group by category_id having count(film_id)>=5) as cc
2、设定限制条件 f.description like '%robot%'
3、在表cc、f、fc、c中查找包括robot的电影对应的分类名称和对应的电影数目。
SELECT c.name, COUNT(fc.film_id)
FROM (SELECT category_id, COUNT(film_id) AS category_num FROM film_category  GROUP BY category_id HAVING COUNT(film_id)>=5) AS cc,
film AS f, film_category AS fc, category AS c
WHERE  f.description LIKE '%robot%'
AND f.film_id = fc.film_id
AND c.category_id = fc.category_id
AND c.category_id=cc.category_id;

29.对表film、film_category,使用join查询方式找出没有分类的电影id以及名称

思路:运用 LEFT JOIN连接两表,用 IS NULL语句限定条件
SELECT f.film_id,f.title
FROM film f LEFT JOIN film_category fm
ON f.film_id=fm.film_id
WHERE fm.category_id IS NULL;

30.对表film、film_category、category,

使用子查询的方式找出属于Action分类的所有电影对应的title,description

SELECT title,description
FROM film
WHERE film_id IN (SELECT fm.film_id FROM film_category fm JOIN  category c ON fm.category_id=c.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 c.name = 'Action'));

牛客网数据开发题库_数据库刷题—牛客网(21-30)相关推荐

  1. 免费刷大学粗c语言题库的软件,51CTO题库-可以免费刷题的小程序

    51CTO题库介绍 是14年IT学习网站51CTO旗下的免费刷题小程序,是一款致力于让你快速通过考试.获取证书的免费刷题工具. 微信小程序刷题:让你利用碎片化时间学习,随时随地想刷就刷,时刻为你通过考 ...

  2. 赛码行测题库_行测题库

    热文推荐 歩知公考资讯网整理了国家公务员考试历年真题及答案汇总,还原试卷内容,并附以经典解析,帮助考生快速了解国家公务员考试题型及考察要点.[全文] 行测题库提供2016年新疆公务员考试图形推理每日精 ...

  3. 信息系统监理师题库_信息系统监理题库

    信息系统监理题库app是专门针对信息系统监理师考试的应用软件,在这个应用软件中拥有着全面的考试大纲资源,同时还有着海量的历年真题以及模拟试题供用户进行学习.该软件会自动的为用户记录错题,便于用户可以对 ...

  4. java二级为什么没题库_为什么刷了那么多二级java试题,却依然提高不了分数?...

    在等剧更新的时间,赶紧进来刷刷题.复习以下的二级java试题,看剧.刷题,两不耽误,非常完美! 下列不可作为java语言标识符的是( D ) A a1 B $1 C _1 D 11 有一段java应用 ...

  5. 赛码行测题库_行测题库:行测数字推理模拟题2.22

    行测题库:行测数字推理模拟题 1.1,-5,10,10,40,( ) A.-35 B.50 C.135 D.280 2.-1,3,-3,-3,-9,( ) A.-9 B.-4 C.-14 D.-45 ...

  6. 软件测试面试题及答案 这个在线题库的多种刷题模式能帮你快速通关

    随着企业对软件测试岗位的重视,越来越多的人都开始进入到软件测试的行业,但由于进入到软件测试岗位的最后一道门槛是"面试",很多人都担心回答不出来面试官的问题,而错过步入这个企业的机会 ...

  7. 算法题库与在线刷题网站推荐

    1.http://www.lintcode.com/zh-cn/problem/ 有面试真题,阶梯训练,比赛等模块 2.https://leetcode.com/ 很火的算法题库,在线答题,讨论 知乎 ...

  8. 洛谷c语言题库,洛谷刷题总结

    今天下午在洛谷刷了一下午的题,话说这个题目确实有意思,做起来思路也挺清晰,但是就是提交的时候总是出问题,这个就很难受. 虽然提交不能AC,但是在刷题的时候也能从中学到很多东西,今下午了解了几个重要的点 ...

  9. python搜题题库_免费搜题公众号python

    免费搜题公众号python 更多相关问题 泥里出生,加工成块,又白又嫩,街上有卖. (打一食物) 大绿球儿圆又圆,不踢不拍不投篮,买回家中用刀切,啃上一口格外甜. (打一水果) 生来无形,走动便有声, ...

最新文章

  1. 音频处理五:(音频的FFT计算)
  2. 老师:你根本不知道我有多想逃课
  3. 关于头文件,全局变量,extern,static
  4. 带前端脚本的html页面,2.从头学前端之如何在html中使用javascript
  5. c#获取网络时间并同步本地时间
  6. 迟到的读书笔记 李开复自传:世界因你不同
  7. MySQL 索引的查询、创建与删除
  8. vfp邮件.html格式,VFP 实现自动发邮件代码
  9. 前台CSS颜色代码大全
  10. AVR单片机(ATmega128)单片机运算乘除法大约所需时间
  11. 通过for循环生成简单的座位表
  12. chart的简单使用
  13. android 如何去控制第三方音乐播放app之控制QQ音乐
  14. 年轻不要停止奋斗的脚步
  15. 搜狗输入法取消软键盘
  16. 微信小程序跳转微信小店
  17. 如何用Xbox手柄玩家玩java我的世界,在Gear VR上玩《我的世界》,怎么能少了微软Xbox手柄...
  18. IP地址和网络地址及广播地址解析
  19. Linux学习(CentOS-7)---Linux开机流程
  20. 打开桌面计算机投屏到扩展屏,将Win10电脑屏幕内容投屏到小米电视的操作方法...

热门文章

  1. 用Hamcrest验证DateTime和日期
  2. Java中的值类型:为什么它们不可变?
  3. 脚本在流程中的性能影响
  4. maven aspectj_使用Spring AspectJ和Maven进行面向方面的编程
  5. EE Servlet 3:如何在Web应用程序中设置后端服务
  6. 带有Angular JS的Java EE 7 –第1部分
  7. 在JUnit中测试预期的异常
  8. Java方法中的参数太多,第4部分:重载
  9. 使用PowerMock模拟构造函数
  10. 算法证明_CFR+算法证明过程