暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

按在地上摩擦面试官mysql之实战一

Java八股文宝典 2021-04-20
385

日常工作中,会遇到大量的sql编写,同样一个逻辑,每个人写的sql会有不同。实战篇会带领大家进行大量的sql练习,希望你自己独立思考,进行sql编写

Q1

请你查找employees里最晚入职员工的所有信息?

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

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

01

请你查找employees里最晚入职员工的所有信息?

自己思考几分钟,在看下我的思路:

点击空白处查看答案

1. 首先找到入职时间最晚的

2. 再让入职时间等于最晚时间,就能找到所有入职员工最晚入职的

按照我的思路自己写,写不出来再看答案:

select * from employees where hire_date=(select max(hire_date) from employees)



 

Q2

请你查找employees里入职员工时间排名倒数第三的员工所有信息?

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

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

02

请你查找employees里入职员工时间排名倒数第三的员工所有信息?

自己思考几分钟,在看下我的思路:

点击空白处查看答案

1.  首先按照入职时间倒序排列

2.  去重,再取第三晚入职的(不去重,有可能最晚的入职多个员工)

3.  再让入职时间等于第三晚时间,就能找到所有入职员工第三晚入职的


按照我的思路自己写,写不出来再看答案:

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



 

Q3

查找各个部门当前领导当前薪水详情以及其对应部门编号dept_no

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

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

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


CREATE TABLE `dept_manager` (

`dept_no` char(4) NOT NULL,

`emp_no` int(11) NOT NULL,

`to_date` date NOT NULL,

PRIMARY KEY (`emp_no`,`dept_no`));


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

03

查找各个部门当前领导当前薪水详情以及其对应部门编号dept_no

自己思考几分钟,在看下我的思路:

点击空白处查看答案

1.  查领导的薪水和部门编号,需要两个表才能完成

2.  两个表之间的关联是靠emp_no字段

3.  先内连接查询,再根据部门排序


按照我的思路自己写,写不出来再看答案:

select a.*,b.dept_no from salaries a, dept_manager b where a.emp_no=b.emp_no order by a.emp_no


 

Q4

查找所有已经分配部门的员工的last_name和first_name以及dept_no

查找所有已经分配部门的员工的last_name和first_name以及dept_no

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

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


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

04

查找所有已经分配部门的员工的last_name和first_name以及dept_no

自己思考几分钟,在看下我的思路:

点击空白处查看答案

1.  查员工的信息以及部门编码,需要关联查询,关联关系emp_no

2.  未分配部门的不展示,所以明显是个内连接查询

 

按照我的思路自己写,写不出来再看答案:

select a.last_name,a.first_name,b.dept_no from employees a inner join dept_emp b on a.emp_no=b.emp_no


 

Q5

请查找所有已经分配部门的员工的last_name和first_name以及dept_no

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

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

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


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

05

请查找所有已经分配部门的员工的last_name和first_name以及dept_no

自己思考几分钟,在看下我的思路:

点击空白处查看答案

1.  查员工的信息以及部门编码,需要关联查询,关联关系emp_no

2.  未分配部门的员工展示,所以明显是个左连接查询

3.  未分配部门的员工展示,所以员工表在左侧


按照我的思路自己写,写不出来再看答案:

select a.last_name,a.first_name,b.dept_no from employees a leftjoin dept_emp b on a.emp_no=b.emp_no


 

Q6

查找薪水涨幅超过15次的员工号emp_no以及其对应的涨幅次数t

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

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


请你查找薪水记录超过15次的员工号emp_no以及其对应的记录次数t

06

查找薪水涨幅超过15次的员工号emp_no以及其对应的涨幅次数t

自己思考几分钟,在看下我的思路:

点击空白处查看答案

1.  统计员工的薪水记录

2.  根据员工分组,查找次数大于等于15的

3.  常规是where但是用了聚合函数之后后面只能用having+条件

 

按照我的思路自己写,写不出来再看答案:

select emp_no,count(1) as t from salaries group by emp_no having t>14

 

 

Q7

找出所有员工当前具体的薪水salary情况

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

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


请你找出所有员工具体的薪水salary情况,对于相同的薪水只显示一次,并按照逆序显示

07

找出所有员工当前具体的薪水salary情况

自己思考几分钟,在看下我的思路:

点击空白处查看答案

1.  相同的薪水只展示一次,按照薪水聚合

2.  排序要在聚合后面


按照我的思路自己写,写不出来再看答案:

select salary from salaries group by salary order by salary desc


 

Q8

获取所有非manager的员工emp_no

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

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

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


请你找出所有非部门领导的员工emp_no

08

获取所有非manager的员工emp_no

自己思考几分钟,在看下我的思路:

点击空白处查看答案

1.  查所有部门领导的emp_no

2.  查员工emp_no不是领导的


按照我的思路自己写,写不出来再看答案:

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



 

Q9

获取所有员工当前的manager

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

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

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


请你找出所有非部门领导的员工emp_no

09

获取所有员工当前的manager

自己思考几分钟,在看下我的思路:

点击空白处查看答案

1.  查员工的信息以及经理,需要关联查询,关联关系emp_no

2.  经理自己不展示,需要过率以下


按照我的思路自己写,写不出来再看答案:

select a.emp_no,b.emp_no from dept_emp a,dept_manager b where a.dept_no = b.dept_no and a.emp_no != b.emp_no


 

Q10

获取所有部门中当前员工薪水最高的相关信息

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

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

获取所有部门中员工薪水最高的相关信息,给出dept_no, emp_no以及其对应的salary,按照部门编号升序排列

10

获取所有部门中当前员工薪水最高的相关信息

自己思考几分钟,在看下我的思路:

点击空白处查看答案

1.  首先找到部门的薪水高的,关联查询并且聚合(能确认部门的最高薪水)

2.  在从部门薪水最高的临时表中,找到部门里对应的人

3.  人的部门编号和薪水的最大值同时满足,确定薪水最高的人


按照我的思路自己写,写不出来再看答案:

select t.dept_no ,s.emp_no,maxSalary from salaries s, (select dept_no, max(salary) as maxSalary from salaries a,dept_emp b where a.emp_no=b.emp_no group by dept_no ) t, dept_emp d where s.salary=t.maxSalary and d.dept_no=t.dept_no and d.emp_no=s.emp_no order by dept_no


 

OS:每天坚持跟山虎做十道题,几天之后你的sql功底就会突飞猛进。

大家好,我是山虎,喜欢数学,编码,算法,股票,AI。经历过一次失败的创业。东西不要死记硬背,要做到自己真正的理解。年轻人就要折腾,年轻人就要折腾,年轻人就要折腾。原创不易,帮忙转发。

JAVA八股文

随时欢迎与我讨论各种问题

文章转载自Java八股文宝典,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论