牛客网SQL实战练习——11~15

牛客网SQL实战练习——11~15

声明:练习牛客网SQL实战题目,整理笔记。
11.获取所有员工当前的manager,如果当前的manager是自己的话结果不显示,当前表示to_date='9999-01-01'。
结果第一列给出当前员工的emp_no,第二列给出其manager对应的manager_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 `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`));

分析:本题涉及两个表,获取所有员工当前的manager,即两表的部门号dept_no相同。用 inner join连接两张表,限制条件 de.dept_no = dm.dept_no。再用 where限制当前员工与当前经理的条件,即 dm.to_date 等于 '9999-01-01' 、de.to_date 等于 '9999-01-01' 、 de.emp_no 不等于 dm.emp_no
答案:

select de.emp_no,dm.emp_no as manager_no
from dept_emp as de inner join dept_manager as dm
on de.dept_no=dm.dept_no
where dm.to_date = '9999-01-01' 
and de.to_date = '9999-01-01' 
and de.emp_no != dm.emp_no

12.获取所有部门中当前员工薪水最高的相关信息,给出dept_no, emp_no以及其对应的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 `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`));

分析:使用inner join 把两个表连接起来,限制条件为:de.emp_no=s.emp_no。返回最高薪水用max(s.salary)代替。再用 where限制当前日期条件,即 de.to_date 等于 '9999-01-01' 、s.to_date 等于 '9999-01-01' 、
答案:

select de.dept_no,de.emp_no,max(s.salary)
from dept_emp as de inner join salaries as s
on de.emp_no=s.emp_no
where de.to_date = '9999-01-01' and s.to_date = '9999-01-01'
group by de.dept_no

13.从titles表获取按照title进行分组,每组个数大于等于2,给出title以及对应的数目t。

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

分析:本题中直接用Count(title)统计title的数目,用group by 分组,用having限制条件t>=2即可。
答案:

select title, count(title) as t
from titles
group by title 
having t>=2

14.从titles表获取按照title进行分组,每组个数大于等于2,给出title以及对应的数目t。
注意对于重复的emp_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);

分析:本题是在上一题的基础上加了限制条件对于重复的emp_no进行忽略。故使用distinct emp_no即可。
答案:

select title, count(distinct emp_no) as t
from titles
group by title 
having t>=2

15.查找employees表所有emp_no为奇数,且last_name不为Mary的员工信息,并按照hire_date逆序排列

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

分析:emp_no为奇数则emp_no % 2 = 1,last_name不为Mary则last_name != 'Mary',按照hire_date逆序排列则order by hire_date desc。
答案:

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

欢迎关注微信公众号:蛋炒番茄
同步更新!!!

你可能感兴趣的:(牛客网SQL实战练习——11~15)