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

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`));

输入描述:

497f5ef3269a8cb8aa69b21dfa318be2.png
思路:先分别用两次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`));

输入描述:

2162216072071a245ced0f8f898b5ac8.png
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`));

输入描述:

93a457439e2a40c267c948f87e8f9692.png
法一-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`));

输入描述:

c8e9eddb7f2c71a5ee87fcda34e8be7c.png
重点:表连接,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`));

输入描述:

58400910dcdedc66caa9723359123cb1.png
思路:创建两张表(一张记录当前所有员工的工资,另一张只记录部门经理的工资)进行比较
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);

输入描述:

146b6da0f8619911637fa79998df5542.png
思路:用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`));

输入描述:

5a5df85119d8dfa4dfd3aae3472787ca.png
每年??
正确答案:
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部

2a5cbcc9b27f48c0fe4e92b851222e1c.png
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));

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

56fc249c30add2188184de7718e4dc3c.png
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'));

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/340978.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

弹性堆栈介绍

当您运行对公司至关重要的软件时&#xff0c;您将无法获得仅用于分析一段时间前发生的事情的日志&#xff0c;让客户端告诉您您的应用程序已损坏&#xff0c;而您甚至不知道发生了什么是真实的问题。 解决该问题的方法之一是使用监视和日志记录。 大多数应用程序都将具有日志记…

access统计没有选课的人数_当代大学生发愁求职就业,更发愁“选课”,自主选课变成了负担...

当代大学生除了求职就业&#xff0c;最发愁的就是“选课”。不得不说&#xff0c;随着科技的发展&#xff0c;各行各业都发生了翻天覆地的变化。而在大学里的选课&#xff0c;也因此有了巨大的改变。过去&#xff0c;大学生上课&#xff0c;其实课程都是被安排好的&#xff0c;…

产线数字化软件源码_品质笔记⑥丨卢宇聪:把握数字化趋势,坚定创新发展道路...

6天5夜&#xff0c;跨越3座城市&#xff0c;深度走访7家企业&#xff0c;对话多位企业家……这是一趟开阔视野之旅。我接触了很多之前极少有机会接触的企业&#xff0c;比如做光缆的法尔胜泓晟集团、做节能装备的双良集团、做密封件的天生密封件有限公司等。我以前经常接触的是…

es 安装kopf_Elasticsearch-kopf导览

es 安装kopf当我需要一个插件来显示Elasticsearch的集群状态时&#xff0c;或者需要深入了解通常为经典插件elasticsearch-head所达到的索引时。 由于有很多建议&#xff0c;而且似乎是非官方的继任者&#xff0c;所以我最近更详细地研究了elasticsearch-kopf 。 我喜欢它。 我…

arm 交叉编译找不到so_搭建交叉编译环境并验证

1. 搭建编译环境并验证1.1 实验目的 掌握嵌入式开发环境、交叉编译器的搭建、安装和配置方法 熟悉Linux应用程序的编译、调试方法&#xff0c;能够验证X86平台和ARM平台的差异1.2 实验内容 交叉编译器环境搭建 编写一个典型的Linux应用程序 使用GDB调试Linux程序(PC平台) 用Mak…

雷达的工作原理示意图_电磁阀的构成和工作原理示意图

电磁阀符号的含义&#xff1a;电磁阀符号由方框、箭头、“T”和字符构成。电磁阀图形符号的含义一般如下&#xff1a;1、用方框表示阀的工作位置&#xff0c;每个方块表示电磁阀的一种工作位置&#xff0c;即“位”。有几个方框就表示有几“位”&#xff0c;如二位三通表示有两…

sqlserver拼接字符串换行_1.3【Python】第三章 字符串

人工智能入门与实战第一季&#xff1a;python基础语法字符串是比较常见的数据类型&#xff0c;在第一章中我们最早接触的数据类型就是字符串&#xff1a;"hello world"&#xff0c;字符串可以用单引号’‘或双引号""来表示代码示例&#xff1a;name "…

mot数据集_谈谈ReID与MOT的关系

1.ReID与MOT的联系在MOT任务中&#xff0c;一般常用的特征模型有运动模型和表观模型&#xff0c;其中表观模型以行人重识别(ReID)类算法为主流。Re-ID任务主要解决的是跨摄像头场景下行人的识别与检索&#xff0c;其中存在给定了身份的图片序列query&#xff0c;需要为不同摄像…

jClarity:在Azure上升级到Java

在互联世界公共基础结构的新时代&#xff0c;最大和最重要的两个方面是Java和OpenJDK的诞生和兴起。 因此&#xff0c;许多公司将时间和资源投入到构建最先进的技术上&#xff0c;以确保整个行业在未来几年内在AdoptOpenJDK上拥有丰富的质量&#xff0c;而且免费的OpenJDK二进制…

装饰器模式应用场景_装饰器设计模式的应用

装饰器模式应用场景嗨&#xff0c;您好&#xff01; 今天&#xff0c;我将展示装饰设计模式的实际应用。 装饰器设计模式是一种广泛使用的设计模式&#xff0c;同时在运行期间处理图形&#xff0c;树木和动态更改。 如果您正在寻找或尝试进行递归&#xff0c;这也是一个不错的…

Auto Lisp 标注子样式_CSS 核心样式

CSS核心样式粗细font-weight作用:设置文字是否加粗显示属性名: font-weight, 属于font属性的一个单-属性属性值有两种方式:单词类型、数字类型单词类型数字类型100-900之间的整百数字数字越大&#xff0c;文字显示越粗其中400等价于normal, 700等价于bold字体风格font-style作用…

均质机工作原理动画_3D动画演示:有刷直流电机的工作原理

点上面蓝色字体直观学机械可长期订阅我们法律顾问&#xff1a;赵建英律师下面这张图是电机的分类&#xff0c;在看完这张图后&#xff0c;大家基本也就知道咱们今天说的有刷电机具体属于哪一类了。下面这个是LearnEngineering制作的动画&#xff0c;讲解的是直流电机的工作原理…

a113 智能音箱芯片方案_高通入局智能音箱,首款四核单芯片方案曝光

不得不说&#xff0c;智能音箱已经成为目前重要的科技品类之一&#xff0c;许多公司包括亚马逊、谷歌、苹果、阿里巴巴、小米等等&#xff0c;都在大举进军智能音箱市场。为了尽可能为更多产品提供核心原件&#xff0c;近日&#xff0c;高通公司推出了一款全新的SOC系列——QCS…

隐藏水滴屏的软件_屏下摄像头,实现这一全面屏终极方案有多难?

为了实现真正全面屏&#xff0c;手机厂商们到底能有多拼&#xff1f;在奔向全面屏的征途里&#xff0c;导航键、听筒、传感器、指纹识别模组等都被成功解决&#xff0c;隐藏在边框或屏幕底。唯独前置摄像头&#xff0c;成为全面屏征途的最后一块终极障碍。这场由iPhone X刘海屏…

java ee api_Java EE并发API教程

java ee api这是一个示例章节&#xff0c;摘自Francesco Marchioni编辑的WildFly上的实用Java EE 7开发 。 本章讨论了新的Java EE并发API&#xff08;JSR 236&#xff09; &#xff0c;它概述了使用一组托管资源在Java EE容器上并行执行任务的标准方法。 为了描述如何在您的应…

二进制_简学:二进制数制的应用

设现有正整数150&#xff0c;二进制形式为10010110&#xff0c;现有如下题目&#xff0c;求其尽可能简单的解法。题目一&#xff1a;判断该正整数是否是2的乘方&#xff1b;解法&#xff1a;由上表可以看出2的乘方的二进制形式只有一个bit为1&#xff0c;因此判断一个正整数A是…

swagger 动态设置版本号_如何快速玩转swagger

Spring Boot 框架是目前非常流行的微服务框架&#xff0c;我们很多情况下使用它来提供 Rest API。而对于 Rest API 来说很重要的一部分内容就是文档&#xff0c;Swagger 为我们提供了一套通过代码和注解自动生成文档的方法&#xff0c;这一点对于保证 API 文档的及时性将有很大…

angular java_带有Angular JS的Java EE 7 –第1部分

angular java今天的帖子将向您展示如何使用Java EE 7和Angular JS构建一个非常简单的应用程序。 在去那里之前&#xff0c;让我告诉您一个简短的故事&#xff1a; 我必须承认&#xff0c;我从来都不是Java语言的忠实拥护者&#xff0c;但是我仍然记得我第一次使用它。 我不记得…

操作系统的msxml组件版本过低_Zabbix 5.0 LTS 版本安装

zabbix 5.0 版本于 5 月 11 日正式发布&#xff0c;是最新的 LTS(长期支持)版本&#xff0c;5.0 带来很多功能和特性&#xff0c;后面会陆续推出文章介绍&#xff0c;下面主要介绍下 5.0 版本的安装。环境要求5.0 版本对基础环境的要求有大的变化&#xff0c;最大的就是对 php …

登录判断_Spring Security之多次登录失败后账户锁定功能的实现

在上一次写的文章中&#xff0c;为大家说到了如何动态的从数据库加载用户、角色、权限信息&#xff0c;从而实现登录验证及授权。在实际的开发过程中&#xff0c;我们通常会有这样的一个需求&#xff1a;当用户多次登录失败的时候&#xff0c;我们应该将账户锁定&#xff0c;等…