前言
以下都是我在叛兀客網(wǎng)上做過的一些SQL的習題末早,每一道題都有答案,給大家分享一下
習題&答案
- 查找最晚入職員工的所有信息
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`));
答案
select * from employees
order by hire_date desc limit 0,1
- 查找入職員工時間排名倒數(shù)第三的員工所有信息
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`));
答案
select * from employees
order by hire_date desc limit 2,1
- 查找各個部門當前(to_date='9999-01-01')領導當前薪水詳情以及其對應部門編號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`));
答案
select salaries.*, dept_manager.dept_no
from salaries, dept_manager
where dept_manager.emp_no = salaries.emp_no
and dept_manager.to_date = '9999-01-01'
and salaries.to_date = '9999-01-01'
- 查找所有已經(jīng)分配部門的員工的last_name和first_name
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 `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`));
答案
select employees.last_name, first_name, dept_emp.dept_no
from dept_emp
inner join employees
where dept_emp.emp_no = employees.emp_no;
- 查找所有員工的last_name和first_name以及對應部門編號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 `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`));
答案
select employees.last_name, employees.first_name, dept_emp.dept_no
from employees
left join dept_emp
on employees.emp_no = dept_emp.emp_no
- 查找所有員工入職時候的薪水情況着降,給出emp_no以及salary巡李, 并按照emp_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`));
答案
select employees.emp_no, salaries.salary
from employees join salaries
on employees.emp_no = salaries.emp_no and employees.hire_date = salaries.from_date
order by salaries.emp_no desc
- 查找薪水漲幅超過15次的員工號emp_no以及其對應的漲幅次數(shù)t
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`));
答案
select emp_no, count(emp_no) as t
from salaries
group by emp_no
having count(emp_no) > 15
- 找出所有員工當前(to_date='9999-01-01')具體的薪水salary情況箍鼓,對于相同的薪水只顯示一次,并按照逆序顯示
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`));
答案
select salary
from salaries
where to_date = '9999-01-01'
group by salary
order by salary desc
- 獲取所有部門當前manager的當前薪水情況樊销,給出dept_no, emp_no以及salary,當前表示to_date='9999-01-01'
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`));
答案
select salary
from salaries
where to_date = '9999-01-01'
group by salary
order by salary desc
- 獲取所有非manager的員工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`));
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`));
答案
select emp_no
from employees
where employees.emp_no not
in(select emp_no from dept_manager)
- 獲取所有員工當前的manager声诸,如果當前的manager是自己的話結(jié)果不顯示酱讶,當前表示to_date='9999-01-01'。
結(jié)果第一列給出當前員工的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`));
答案
select de.emp_no, dm.emp_no as manager_no
from dept_emp de
inner join dept_manager dm
on de.dept_no = dm.dept_no
where de.emp_no != dm.emp_no
and dm.to_date = '9999-01-01' and de.to_date = '9999-01-01'
- 獲取所有部門中當前員工薪水最高的相關信息泻肯,給出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`));
答案
select de.dept_no, de.emp_no, max(s.salary)
from dept_emp de, salaries s
where de.emp_no = s.emp_no and de.to_date = '9999-01-01' and s.to_date = '9999-01-01'
group by de.dept_no
- 從titles表獲取按照title進行分組,每組個數(shù)大于等于2慰照,給出title以及對應的數(shù)目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);
答案
select title, count(title) as t
from titles
group by title
having count(title) >= 2
- 從titles表獲取按照title進行分組,每組個數(shù)大于等于2毒租,給出title以及對應的數(shù)目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);
答案
select title, count(distinct emp_no) as t
from titles
group by title
having count(title) >= 2
- 查找employees表所有emp_no為奇數(shù)墅垮,且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`));
答案
select *
from employees
where emp_no % 2 = 1 and last_name != 'Mary'
order by hire_date desc
- 統(tǒng)計出當前各個title類型對應的員工當前薪水對應的平均工資。結(jié)果給出title以及平均工資avg算色。
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 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);
答案
select titles.title, avg(salaries.salary)
from titles inner join salaries
on titles.emp_no = salaries.emp_no
where titles.to_date = '9999-01-01' and salaries.to_date = '9999-01-01'
group by title
- 獲取當前(to_date='9999-01-01')薪水第二多的員工的emp_no以及其對應的薪水salary
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`));
答案
select emp_no, salary
from salaries
where to_date = '9999-01-01'
order by salary desc
limit 1, 1
- 查找當前薪水(to_date='9999-01-01')排名第二多的員工編號emp_no抬伺、薪水salary、last_name以及first_name灾梦,不準使用order by
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`));
答案
select e.emp_no, max(s.salary), e.last_name, e.first_name
from employees e, salaries s
where e.emp_no = s.emp_no and s.to_date = '9999-01-01' and s.salary != (select max(salary) from salaries)
- 查找所有員工的last_name和first_name以及對應的dept_name峡钓,也包括暫時沒有分配部門的員工
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 `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`));
答案
select e.last_name, e.first_name, d.dept_name
from employees e
left join dept_emp de on e.emp_no = de.emp_no
left join departments d on de.dept_no = d.dept_no
- 查找員工編號emp_now為10001其自入職以來的薪水salary漲幅值growth
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`));
答案
select (max(salary) - min(salary))
from salaries
where emp_no = 10001
- 查找所有員工自入職以來的薪水漲幅情況齐鲤,給出員工編號emp_noy以及其對應的薪水漲幅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`));
答案
select t1.emp_no, t1.salary - t2.salary as growth
from (select e.emp_no, s.salary
from employees e, salaries s
where e.emp_no = s.emp_no and to_date = '9999-01-01') as t1,
(select e.emp_no, s.salary
from employees e, salaries s
where e.emp_no = s.emp_no and e.hire_date = s.from_date) as t2
where t1.emp_no = t2.emp_no
order by growth
- 統(tǒng)計各個部門對應員工漲幅的次數(shù)總和椒楣,給出部門編碼dept_no、部門名稱dept_name以及次數(shù)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`));
答案
select de.dept_no, d.dept_name, count(e.salary) as sum
from salaries e
inner join dept_emp de on e.emp_no = de.emp_no
inner join departments d on de.dept_no = d.dept_no
group by d.dept_no
- 對所有員工的當前(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`));
答案
select s1.emp_no,s1.salary,count(distinct s2.salary) as rank
from salaries s1,salaries s2
where s1.salary<=s2.salary and s1.to_date='9999-01-01' and s2.to_date='9999-01-01'
group by s1.emp_no
order by rank
- 獲取所有非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`));
答案
select de.dept_no, s.emp_no, s.salary
from salaries s
join employees e on e.emp_no = s.emp_no
join dept_emp de on de.emp_no = e.emp_no
where s.to_date = '9999-01-01' and de.emp_no not in (select emp_no from dept_manager)
- 獲取員工其當前的薪水比其manager當前薪水還高的相關信息毛俏,當前表示to_date='9999-01-01',
結(jié)果第一列給出員工的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`));
答案
select t1.emp_no, t2.emp_no as manager_no, t1.salary as emp_salary, t2.salary as manager_salary from
(select de.dept_no, de.emp_no, s.salary from dept_emp de
join salaries s on de.emp_no = s.emp_no
where de.emp_no not in (select emp_no from dept_manager) and s.to_date = '9999-01-01' and de.to_date = '9999-01-01') as t1,
(select dm.dept_no, dm.emp_no, s.salary from dept_manager dm
join salaries s on dm.emp_no = s.emp_no
where s.to_date = '9999-01-01' and dm.to_date = '9999-01-01') as t2
where emp_salary > manager_salary and t1.dept_no = t2.dept_no
總結(jié)
都是一些簡單SQL語法習題煌寇,希望能幫到大家