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
));
输入描述:
无
输出描述:
emp_no salary last_name first_name
10009
94409
Peac
Sumant
select employees.emp_no,max(salaries.salary),employees.last_name,employees.first_name
from employees,salaries
where employees.emp_no=salaries.emp_no
and salaries.to_date='9999-01-01' and
salaries.salary<(select max(salaries.salary) from salaries where salaries.to_date='9999-01-01')
需要注意:重点:两个嵌套select和where 先把最大的剔除,再从剩下的数中选择最大的。
2、
获取当前(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
));
输入描述:
无
输出描述:
emp_no salary
10009
94409
select emp_no,salary
from salaries
where salaries.to_date='9999-01-01'
order by salary DESC limit 1,1
注意:limit的妙用,在order by 之后,进行选择输出
limit后如果只有一个数 比如:limit 3 代表选择排序后的前三个进行输出。
limit后面如果有两个数字,比如:limit 1,2 代表跳过一个数,输出跳过后的后面两个数。
3
查找所有员工的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 employees.last_name,employees.first_name,departments.dept_name
from employees left join dept_emp on employees.emp_no=dept_emp.emp_no
left join departments on departments.dept_no=dept_emp.dept_no
注意:这里需要注意的是,在进行连接时 要注意 哪个可以为空 一般在进行连接时 为中心的表不能为空 不为中心的表可以为空,left join 以左表为主表连接,左表不能为空,右表可以为空。 右连接也是一样。
4、
查找所有员工自入职以来的薪水涨幅情况,给出员工编号emp_no以及其对应的薪水涨幅growth,并按照growth进行升序
(注:可能有employees表和salaries表里存在记录的员工,有对应的员工编号和涨薪记录,但是已经离职了,离职的员工salaries表的最新的to_date!=‘9999-01-01’,这样的数据不显示在查找结果里面)
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
));
输入描述:
无
输出描述:
emp_no growth
10011
0
省略
省略
10010
54496
10004
34003
select t1.emp_no,(t1.salary-t2.salary) as growth
from (select salaries.emp_no,salaries.salary from salaries,employees
where employees.emp_no=salaries.emp_no
and employees.hire_date=salaries.from_date) as t2,
(select emp_no,salary from salaries
where to_date='9999-01-01') as t1
where t1.emp_no=t2.emp_no order by growth ASC
这里需要单独柑橘已有的表格创建两个表格,一个表格是:入职薪水表格,一个表格是 到9999-01-01的薪水表格,
再从两个表格中进行选择输出。
没有技巧 纯暴力