当前位置: 首页 > news >正文

牛客网SQL 练习 一

SQL195 查找最晚入职员工的所有信息

描述

有一个员工employees表简况如下:

emp_nobirth_datefirst_namelast_namegenderhire_date
100011953-09-02GeorgiFacello   M1986-06-26 
100021964-06-02Bezalel    Simmel    F    1985-11-21
100031959-12-03Parto      Bamford   M    1986-08-28
100041954-05-01Christian  Koblick   M    1986-12-01 

请你查找employees里最晚入职员工的所有信息,以上例子输出如下:

emp_nobirth_datefirst_namelast_namegenderhire_date
100041954-05-01Christian  Koblick   M    1986-12-01 

 从 "employees" 表中选择所有的数据,并按照"hire_date"列进行降序排序。然后,使用"limit 1"限制结果集只返回最顶部的一行数据。

select * from employees
order by hire_date desc
limit 1 

 SQL196 查找入职员工时间排名倒数第三的员工所有信息

描述

有一个员工employees表简况如下:

emp_nobirth_datefirst_namelast_namegenderhire_date
100011953-09-02GeorgiFacelloM1986-06-26
100021964-06-02BezalelSimmelF1985-11-21
100031959-12-03PartoBamfordM1986-08-28
100041954-05-01ChristianKoblickM1986-12-01

请你查找employees里入职员工时间排名倒数第三的员工所有信息,以上例子输出如下:

emp_nobirth_datefirst_namelast_namegenderhire_date
100011953-09-02GeorgiFacelloM1986-06-26

注意:可能会存在同一个日期入职的员工,所以入职员工时间排名倒数第三的员工可能不止一个。

从"employees"表中选择所有的数据,并使用子查询来查找第二个最近的"hire_date"。子查询"select distinct hire_date from employees order by hire_date desc limit 2,1"首先从"employees"表中选择所有不重复的"hire_date",然后按降序排序并使用"limit 2,1"来获取第二个结果。之后,外部查询使用"where hire_date ="将结果与"employees"表中的"hire_date"进行比较,从而获取与第二个最近的"hire_date"相等的员工记录。

select * from employees
where hire_date = (select distinct hire_date from employees order by hire_date desc limit 2,1)

 SQL197 查找当前薪水详情以及部门编号dept no

描述

有一个全部员工的薪水表salaries简况如下:

emp_nosalaryfrom_dateto_date
10001889582002-06-229999-01-01
10002725272001-08-029999-01-01
10003433112001-12-019999-01-01

有一个各个部门的领导表dept_manager简况如下:

dept_noemp_noto_date
d001100019999-01-01
d002100039999-01-01

请你查找各个部门当前领导的薪水详情以及其对应部门编号dept_no,输出结果以salaries.emp_no升序排序,并且请注意输出结果里面dept_no列是最后一列,以上例子输出如下:

emp_nosalaryfrom_dateto_datedept_no
10001889582002-06-229999-01-01d001
10003433112001-12-019999-01-01d002

查询从"dept_manager"表开始,使用"left join"将"dept_manager"表与"salaries"表进行连接。连接条件是"dept_manager"表中的"emp_no"与"salaries"表中的"emp_no"相等。

通过左连接,将会返回所有在"dept_manager"表中的记录,无论是否有与之匹配的薪水记录。如果在"salaries"表中没有对应的记录,那么相关列将会显示为NULL。

最终,查询选择了需要的列,包括"dept_manager"表中的"emp_no"和"dept_no"列,以及"salaries"表中的"salary,from_date,to_date"列。

select d.emp_no,s.salary,s.from_date,s.to_date,d.dept_no
from dept_manager d left join salaries s on d.emp_no = s.emp_no

 SQL198 查找所有已经分配部门的员工的lastname和firstname以及dept no

描述

有一个员工表,employees简况如下:

emp_no birth_date first_name last_name genderhire_date 
100011953-09-02Georgi     Facello    M1986-06-26
100021964-06-02Bezalel    Simmel     F1985-11-21
10003  1959-12-03Parto      Bamford    M1986-08-28
10004  1954-05-01Christian  Koblick    M1986-12-01

有一个部门表,dept_emp简况如下:

emp_nodept_no from_date to_date
10001d0011986-06-269999-01-01
10002d0021989-08-039999-01-01

请你查找所有已经分配部门的员工的last_name和first_name以及dept_no,未分配的部门的员工不显示,以上例子如下:

last_name first_name dept_no
Facello   Georgi     d001
Simmel    Bezalel    d002

和上一题差不多

select e.last_name,e.first_name,d.dept_no
from dept_emp d left join 
employees e on d.emp_no = e.emp_no

 SQL199 查找所有员工的last name和first name以及对应部门编号dept no

描述

有一个员工表,employees简况如下:

emp_no birth_date first_name last_name genderhire_date 
100011953-09-02Georgi     Facello    M1986-06-26
100021964-06-02Bezalel    Simmel     F1985-11-21
10003  1959-12-03Parto      Bamford    M1986-08-28
10004  1954-05-01Christian  Koblick    M1986-12-01

有一个部门表,dept_emp简况如下:

emp_nodept_no from_date to_date
10001d0011986-06-269999-01-01
10002d0021989-08-039999-01-01

请你查找所有已经分配部门的员工的last_name和first_name以及dept_no,也包括暂时没有分配具体部门的员工,以上例子如下:

last_name first_name dept_no
Facello   Georgi     d001
Simmel    Bezalel    d002
BamfordPartoNULL
KoblickChirstianNULL
select last_name,first_name,dept_no from 
employees e left join dept_emp d on 
e.emp_no = d.emp_no 

 SQL201 查找薪水记录超过15条的员工号emp no以及其对应的记录次数t

描述

有一个薪水表,salaries简况如下:

emp_nosalaryfrom_dateto_date
10001601171986-06-261987-06-26
10001

62102

1987-06-261988-06-25
10001660741988-06-251989-06-25
10001665961989-06-251990-06-25
10001669611990-06-251991-06-25
10001710461991-06-251992-06-24
10001743331992-06-241993-06-24
10001752861993-06-241994-06-24
10001759941994-06-241995-06-24
10001768841995-06-241996-06-23
10001800131996-06-231997-06-23
10001810251997-06-231998-06-23
10001810971998-06-231999-06-23
10001849171999-06-232000-06-22
10001851122000-06-222001-06-22
10001850972001-06-222002-06-22
10002725271996-08-031997-08-03

请你查找薪水记录超过15条的员工号emp_no以及其对应的记录次数t,以上例子输出如下:

emp_not
1000116

查询从"salaries"表开始,使用"group by"子句按照"emp_no"列分组。这意味着相同的"emp_no"值将会被聚合到一起。

然后使用"count(*)"函数统计每个"emp_no"分组中的记录数量,并且将结果命名为"t"。

最后,在"having"子句中,过滤掉只有15条或更少薪水记录的员工。只有满足"t>15"条件的分组(即记录数量大于15)才会被包含在查询结果中。

select emp_no,count(*) as t 
from salaries group by emp_no 
having t>15

SQL202 找出所有员工当前薪水salary情况 

描述

有一个薪水表,salaries简况如下:

emp_no salaryfrom_date to_date
10001725272002-06-229999-01-01
10002725272001-08-029999-01-01
10003433112001-12-019999-01-01

请你找出所有员工具体的薪水salary情况,对于相同的薪水只显示一次,并按照逆序显示,以上例子输出如下:

salary
72527
43311

查询从"salaries"表开始,使用"distinct"关键字来去除重复的薪水值,确保查询结果中只包含唯一的薪水值。

然后使用"order by"子句按照薪水值进行降序排序。"desc"关键字表示降序排序,从高到低排列。

select distinct salary 
from salaries 
order by salary desc

 SQL204 获取所有非manager的员工emp no

描述

有一个员工表employees简况如下:

emp_no birth_date first_name last_name genderhire_date 
100011953-09-02Georgi     Facello    M1986-06-26
100021964-06-02Bezalel    Simmel     F1985-11-21
10003  1959-12-03Parto      Bamford    M1986-08-28

有一个部门领导表dept_manager简况如下:

dept_no emp_nofrom_date to_date
d001100021996-08-039999-01-01
d002100031990-08-059999-01-01

请你找出所有非部门领导的员工emp_no,以上例子输出:

emp_no
10001

查询首先从"employees"表开始,使用"where"子句来筛选符合条件的员工。

然后使用子查询子句"select emp_no from dept_manager"来获取所有的部门经理的员工编号。

通过使用"not in"关键字,查询筛选出不在部门经理员工编号列表中的员工编号。

select emp_no 
from employees
where emp_no not in (select emp_no from dept_manager
)

 SQL205 获取所有员工当前的manager

描述

有一个员工表dept_emp简况如下:

emp_nodept_no from_date to_date
10001d0011986-06-269999-01-01
10002d0011996-08-039999-01-01
10003d0021995-12-039999-01-01

第一行表示为员工编号为10001的部门是d001部门。

有一个部门经理表dept_manager简况如下:

dept_noemp_nofrom_date to_date
d001100021996-08-039999-01-01
d002100031990-08-059999-01-01

第一行表示为d001部门的经理是编号为10002的员工。

获取所有的员工和员工对应的经理,如果员工本身是经理的话则不显示,以上例子如下:

emp_nomanager
1000110002

查询使用左连接(left join)将"dept_emp"表和"dept_manager"表连接起来。

连接条件是"dept_no"字段相等。

然后使用"where"子句来筛选出在"dept_emp"表中的员工编号与"dept_manager"表中的员工编号不匹配的记录。

select de.emp_no,dm.emp_no
from dept_emp de 
left join dept_manager dm on
de.dept_no = dm.dept_no
where de.emp_no != dm.emp_no

 SQL206 获取每个部门中当前员工薪水最高的相关信息

描述

有一个员工表dept_emp简况如下:

emp_nodept_nofrom_dateto_date
10001d0011986-06-269999-01-01
10002d0011996-08-039999-01-01
10003d0021996-08-039999-01-01

有一个薪水表salaries简况如下:

emp_nosalaryfrom_dateto_date
10001889582002-06-229999-01-01
10002725272001-08-029999-01-01
10003925272001-08-029999-01-01

获取每个部门中当前员工薪水最高的相关信息,给出dept_no, emp_no以及其对应的salary,按照部门编号dept_no升序排列,以上例子输出如下:

dept_noemp_nomaxSalary
d0011000188958
d0021000392527

首先,我们使用dept_emp表和salaries表进行内连接(join),将两个表根据emp_no(员工编号)进行匹配。

然后,在内连接的结果集中,我们使用子查询来找到每个部门中的最高工资。子查询首先将dept_emp表和salaries表再次进行内连接,并根据emp_no匹配。然后使用GROUP BY语句按照dept_no进行分组,并使用MAX()函数找到每个部门的最高工资。

最后,我们将子查询的结果与外部查询的结果进行匹配,只选择工资等于最高工资的记录。并且选取dept_no、de.emp_no和salary作为结果。

select dept_no,de.emp_no,salary as maxSalary from 
dept_emp de join salaries s on de.emp_no = s.emp_no
where (dept_no,salary) in(
select dept_no,max(salary) as maxSalary
from dept_emp de join salaries s on de.emp_no = s.emp_no
group by dept_no)
order by dept_no

SQL209 查找employees表emp_no与last name的员工信息

描述

有一个员工表employees简况如下:

emp_nobirth_datefirst_namelast_namegenderhire_date
100011953-09-02GeorgiFacelloM1986-06-26
100021964-06-02BezalelSimmelF1985-11-21
100031959-12-03BezalelMaryM1986-08-28
100041954-05-01ChristianKoblickM1986-12-01
100051953-11-07MarySluisF1990-01-22

请你查找employees表所有emp_no为奇数,且last_name不为Mary的员工信息,并按照hire_date逆序排列,以上例子查询结果如下:

emp_nobirth_datefirst_namelast_namegenderhire_date
100051953-11-07MarySluis  F1990-01-22
100011953-09-02GeorgiFacello  M1986-06-26

首先,我们使用employees表进行查询。

然后,在查询结果中,使用WHERE子句来筛选last_name不等于'Mary'的记录和emp_no是奇数的记录。条件last_name != 'Mary'用于排除姓为'Mary'的记录,emp_no%2=1用于过滤奇数编号的员工。

接下来,我们使用ORDER BY子句按照hire_date降序对结果进行排序。这样可以将最新入职的员工排在前面。

最后,我们从employees表中选择满足条件的记录,并按照设置的排序规则进行排序。

select * from employees
where last_name != 'Mary' and emp_no%2=1
order by hire_date desc 

 SQL210 统计出当前各个title类型对应的员工当前薪水对应的平均工资

描述

有一个员工职称表titles简况如下:

emp_no titlefrom_date to_date
10001Senior Engineer1986-06-269999-01-01
10003Senior Engineer2001-12-019999-01-01
10004Senior Engineer1995-12-019999-01-01
10006Senior Engineer2001-08-029999-01-01
10007Senior Staff1996-02-119999-01-01

有一个薪水表salaries简况如下:

emp_no salaryfrom_date to_date
10001889581986-06-269999-01-01
10003433112001-12-019999-01-01
10004740571995-12-019999-01-01
10006433112001-08-029999-01-01
10007880702002-02-079999-01-01

请你统计出各个title类型对应的员工薪水对应的平均工资avg。结果给出title以及平均工资avg,并且以avg升序排序,以上例子输出如下:

titleavg(s.salary)
Senior Engineer62409.2500
Senior Staff88070.0000
  1. SELECT title, avg(s.salary):选择title列和s.salary的平均值作为结果集的列。

  2. FROM titles t JOIN salaries s ON t.emp_no = s.emp_no:将titles表和salaries表通过emp_no列进行连接。这样可以将职位和工资信息关联起来。

  3. GROUP BY title:按照title列进行分组,这样可以计算每个职位的平均工资。

  4. ORDER BY avg(s.salary):按照平均工资的升序对结果进行排序,即按照工资从低到高的顺序排列

select title,avg(s.salary)
from titles t join salaries s on t.emp_no = s.emp_no
group by title
order by avg(s.salary) 

 SQL211 获取当前薪水第二多的员工的emp_no以及其对应的薪水salary

描述

有一个薪水表salaries简况如下:

emp_no salaryfrom_date to_date
10001889582002-06-229999-01-01
10002725272001-08-029999-01-01
10003433112001-12-019999-01-01

请你获取薪水第二多的员工的emp_no以及其对应的薪水salary,

若有多个员工的薪水为第二多的薪水,则将对应的员工的emp_no和salary全部输出,并按emp_no升序排序。

emp_no salary
1000272527
  1. 首先,执行子查询 SELECT salary FROM salaries ORDER BY salary DESC LIMIT 1,1,这个子查询会返回按照工资降序排序后的第二个工资金额。

  2. 然后,将返回的工资金额作为条件,执行主查询 SELECT emp_no, salary FROM salaries WHERE salary = (子查询)

  3. 主查询会根据子查询返回的工资金额筛选出与之匹配的员工信息,即工资为第二高的员工。

  4. 最后,返回结果集包含工资为第二高的员工的员工号(emp_no)和对应的工资金额(salary)

select emp_no,salary from salaries
where salary =
(select salary from salaries 
order by salary desc limit 1,1)

 SQL212 获取当前薪水第二多的员工的emp_no以及其对应的薪水salary

描述

有一个员工表employees简况如下:

emp_no birth_date first_name last_name genderhire_date 
100011953-09-02Georgi     Facello    M1986-06-26
100021964-06-02Bezalel    Simmel     F1985-11-21
10003  1959-12-03Parto      Bamford    M1986-08-28
10004  1954-05-01Chirstian  Koblick    M1986-12-01

有一个薪水表salaries简况如下:

emp_no salaryfrom_date to_date
10001889582002-06-269999-01-01
10002725272001-08-029999-01-01
10003433112001-12-019999-01-01
10004740572001-11-279999-01-01

请你查找薪水排名第二多的员工编号emp_no、薪水salary、last_name以及first_name,不能使用order by完成,以上例子输出为:

(温馨提示:sqlite通过的代码不一定能通过mysql,因为SQL语法规定,使用聚合函数时,select子句中一般只能存在以下三种元素:常数、聚合函数,group by 指定的列名。如果使用非group by的列名,sqlite的结果和mysql 可能不一样)

emp_no salarylast_namefirst_name
1000474057KoblickChirstian
  1. 首先,执行子查询 (SELECT max(salary) as salary FROM salaries WHERE salary != (SELECT max(salary) as salary FROM salaries))

    • 内层子查询 (SELECT max(salary) as salary FROM salaries) 会返回工资表中的最高工资金额。

    • 外层子查询 (SELECT max(salary) as salary FROM salaries WHERE salary != (SELECT max(salary) as salary FROM salaries)) 会返回除了最高工资之外的最高工资金额。

  2. 接下来,执行主查询 SELECT salaries.emp_no, salary, last_name, first_name FROM employees JOIN salaries ON employees.emp_no = salaries.emp_no WHERE salary = (子查询)

    • 主查询会根据子查询返回的工资金额筛选出与之匹配的员工信息,即工资为除了最高工资之外的最高工资的员工信息。
  3. 最后,返回结果集包含员工号(emp_no)、工资金额(salary)、姓氏(last_name)和名字(first_name)的信息,这些信息都是工资为除了最高工资之外的最高工资的员工的信息。

select salaries.emp_no,salary,last_name,first_name
from employees join salaries on 
employees.emp_no = salaries.emp_no
where salary =
(select max(salary) as salary from salaries
where salary !=
(select max(salary) as salary from salaries) )

 

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 网络专线和IPsecVPN在使用上有什么区别?
  • TypeScript 构建工具之 webpack
  • Spring框架中ReflectionUtils类
  • 2024.8.18
  • 作业帮 TiDB 7.5.x 使用经验
  • 梧桐数据库(WuTongDB):聊聊抽象语法树(Abstract Syntax Tree, AST)技术
  • P4727 [HNOI2009] 图的同构计数
  • OpenLayers 使用高德地图并绘制一些线,并用Android原生触发
  • ZK Rollup 的Sequencer
  • STM32通过I2C硬件读写MPU6050
  • Microsoft GraphRAG 执行流程
  • 【计算机硬件硬盘与储存设备】
  • 推荐一款开源特效制作软件(适用于Godot)
  • tcpdump入门——每种flag分别表示什么意思
  • ECMAScript6语法:默认参数和rest参数
  • @angular/forms 源码解析之双向绑定
  • css布局,左右固定中间自适应实现
  • CSS选择器——伪元素选择器之处理父元素高度及外边距溢出
  • iOS仿今日头条、壁纸应用、筛选分类、三方微博、颜色填充等源码
  • macOS 中 shell 创建文件夹及文件并 VS Code 打开
  • Nginx 通过 Lua + Redis 实现动态封禁 IP
  • Python学习笔记 字符串拼接
  • WinRAR存在严重的安全漏洞影响5亿用户
  • 关于for循环的简单归纳
  • 今年的LC3大会没了?
  • 开发基于以太坊智能合约的DApp
  • 前端工程化(Gulp、Webpack)-webpack
  • 如何正确理解,内页权重高于首页?
  • ​iOS实时查看App运行日志
  • ​如何在iOS手机上查看应用日志
  • $$$$GB2312-80区位编码表$$$$
  • $(this) 和 this 关键字在 jQuery 中有何不同?
  • (2)空速传感器
  • (42)STM32——LCD显示屏实验笔记
  • (52)只出现一次的数字III
  • (pytorch进阶之路)扩散概率模型
  • (Redis使用系列) Springboot 整合Redisson 实现分布式锁 七
  • (二)换源+apt-get基础配置+搜狗拼音
  • (分布式缓存)Redis分片集群
  • (蓝桥杯每日一题)love
  • (实测可用)(3)Git的使用——RT Thread Stdio添加的软件包,github与gitee冲突造成无法上传文件到gitee
  • (源码版)2024美国大学生数学建模E题财产保险的可持续模型详解思路+具体代码季节性时序预测SARIMA天气预测建模
  • (转)nsfocus-绿盟科技笔试题目
  • (转)Unity3DUnity3D在android下调试
  • .net mvc部分视图
  • .net通过类组装数据转换为json并且传递给对方接口
  • .Net下C#针对Excel开发控件汇总(ClosedXML,EPPlus,NPOI)
  • .NET中统一的存储过程调用方法(收藏)
  • @ModelAttribute注解使用
  • [100天算法】-不同路径 III(day 73)
  • [2018][note]用于超快偏振开关和动态光束分裂的all-optical有源THz超表——
  • [ACM独立出版] 2024年虚拟现实、图像和信号处理国际学术会议(VRISP 2024,8月2日-4)
  • [Armbian] 部署Docker版Home Assistent,安装HACS并连接米家设备
  • [cb]UIGrid+UIStretch的自适应
  • [COGS 622] [NOIP2011] 玛雅游戏 模拟