SQL训练

题目描述

一个员工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`));

一、查找employees里最晚入职员工的所有信息

select * from employees order by hire_date desc limit 1;

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

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

 

题目描述

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

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

扫描二维码关注公众号,回复: 12840804 查看本文章

建表语句如下:

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

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

select dept_manager.emp_no, salary, from_date, dept_manager.to_date, dept_no from salaries, dept_manager where salaries.emp_no =
dept_manager.emp_no order by dept_manager.emp_no asc;

题目描述

有一个员工表,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,未分配的部门的员工不显示。

select last_name, first_name, dept_no from employees, dept_emp where employees.emp_no = dept_emp.emp_no;

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

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

题目描述

有一个薪水表,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,以上例子输出如下:

五、查找薪水变动超过15次的员工号emp_no以及其对应的变动次数t

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

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

select distinct(salary) from salaries order by salary desc;

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

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

题目描述

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

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

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

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

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

六、获取所有员工当前的manager

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 de.emp_no <> dm.emp_no;

题目描述

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

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

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

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

select 
    t1.dept_no,t1.emp_no,t1.salary
from 
    (select d.emp_no,d.dept_no,s.salary from dept_emp d join salaries s on d.emp_no=s.emp_no WHERE d.to_date = '9999-01-01' AND s.to_date = '9999-01-01') t1
    join 
    (select d.dept_no,max(salary)as salary from dept_emp d join salaries s on d.emp_no=s.emp_no WHERE d.to_date = '9999-01-01' AND s.to_date = '9999-01-01' group by d.dept_no) t2
on 
    t1.dept_no=t2.dept_no and t1.salary= t2.salary
order by 
    t1.dept_no asc;

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

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

题目描述

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

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

建表语句如下:

CREATE TABLE titles (
`emp_no` int(11) NOT NULL,
`title` varchar(50) NOT NULL,
`from_date` date NOT NULL,
`to_date` date DEFAULT NULL);

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

八、统计出各个title类型对应的员工薪水对应的平均工资avg

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

select title, avg(salary) as avg from salaries, titles where titles.emp_no = salaries.emp_no group by titles.title order by avg;

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

select emp_no, salary from salaries order by salary desc limit 1,1;

题目描述

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

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

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

九、查找薪水排名第二多的员工信息,不能使用order by 完成 

select s.emp_no, s.salary, e.last_name, e.first_name from salaries s join
employees e on s.emp_no = e.emp_no and s.emp_no = (select s1.emp_no from salaries s1
join salaries s2 on s1.salary <= s2.salary group by s1.emp_no having count(1) = 2);

题目描述

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

有一个部门表departments表简况如下:

有一个,部门员工关系表dept_emp简况如下:

请你查找所有员工的last_name和first_name以及对应的dept_name,也包括暂时没有分配部门的员工,以上例子输出如下:

十、查找所有员工的last_name和first_name以及对应的dept_name,也包括暂时没有分配部门的员工

select last_name, first_name, t.dept_name from employees left join (select emp_no, dept_emp.dept_no as dept_no, dept_name from dept_emp, departments where dept_emp.dept_no = departments.dept_no) t on employees.emp_no = t.emp_no;

题目描述

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

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

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

(注:可能有employees表和salaries表里存在记录的员工,有对应的员工编号和涨薪记录,但是已经离职了,离职的员工salaries表的最新的to_date!='9999-01-01',这样的数据不显示在查找结果里面,以上emp_no为2的就是这样的)

十一、查找所有员工自入职以来的薪水涨幅情况

SELECT sCurrent.emp_no, (sCurrent.salary-sStart.salary) AS growth
FROM (SELECT s.emp_no, s.salary FROM employees e INNER JOIN salaries s ON e.emp_no = s.emp_no WHERE s.to_date = '9999-01-01') AS sCurrent
INNER JOIN (SELECT s.emp_no, s.salary FROM employees e INNER JOIN salaries s ON e.emp_no = s.emp_no WHERE s.from_date = e.hire_date) AS sStart
ON sCurrent.emp_no = sStart.emp_no
ORDER BY growth

猜你喜欢

转载自blog.csdn.net/xiao__jia__jia/article/details/113789478