先根据考察的知识点对题目做个整理:
-
聚集函数:
1.查找最晚入职员工的所有信息 -
order by(limit):
2.查找入职员工时间排名倒数第三的员工所有信息
6.查找所有员工入职时候的薪水情况
17.获取当前薪水第二多的员工的emp_no以及其对应的薪水salary -
内连接(inner join)
3.查找当前薪水详情以及部门编号dept_no
4.查找所有已经分配部门的员工的last_name和first_name
9.获取所有部门当前manager的当前薪水情况,给出dept_no, emp_no以及salary,当前表示
24.获取所有非manager员工当前的薪水情况 -
左连接(left join)
5.查找所有员工的last_name和first_name以及对应部门编号dept_no
11.获取所有员工当前的manager
19.查找所有员工的last_name和first_name以及对应的dept_name -
group by
7.查找薪水涨幅超过15次的员工号emp_no以及其对应的涨幅次数t
12.获取所有部门中当前员工薪水最高的相关信息
13.从titles表获取按照title进行分组
14.从titles表获取按照title进行分组,注意对于重复的emp_no进行忽略
15.查找employees表
16.统计出当前各个title类型对应的员工当前薪水对应的平均工资
22.统计各个部门对应员工涨幅的次数总和
26.汇总各个部门当前员工的title类型的分配数目 -
distinct
8.找出所有员工当前薪水salary情况 -
子查询
10.获取所有非manager的员工emp_no
18.获取当前薪水第二多的员工的emp_no以及其对应的薪水salary,不准使用order by
20.查找员工编号emp_no为10001其自入职以来的薪水salary涨幅值growth
25.获取员工其当前的薪水比其manager当前薪水还高的相关信息 -
多个考点(或者说我不会的点。。。)
20.查找员工编号emp_no为10001其自入职以来的薪水salary涨幅值growth
21.查找所有员工自入职以来的薪水涨幅情况dept_name
23.对所有员工的薪水按照salary进行按照1-N的排名
25.获取员工其当前的薪水比其manager当前薪水还高的相关信息 (太难了,我太难了,完全没有思路)
27.给出每个员工每年薪水涨幅超过5000的员工编号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
));
代码:
SELECT *
FROM employees
WHERE hire_date=(SELECT max(hire_date) FROM 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
));
代码:
select *
from employees
order by hire_date
desc limit 2,1
/*select * from tableName limit i,n
# tableName:表名
# i:为查询结果的索引值(默认从0开始),当i=0时可省略i
# n:为查询结果返回的数量
# i与n之间使用英文逗号","隔开 */
/*本题直接按入职时间降序排列,然后取第三个*/
题目描述:查找各个部门当前(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
));
Remark:我这道题都没看清题目,写起来落这落那的,补了半天条件才通过,被自己菜哭。当初学的数据库和SQL都还老师了o(╥﹏╥)o
代码:
select salaries.emp_no,salaries.salary,salaries.from_date,salaries.to_date,dept_manager.dept_no
from salaries
inner join dept_manager
on salaries.emp_no=dept_manager.emp_no
and salaries.to_date='9999-01-01'
and dept_manager.to_date='9999-01-01'
题目描述:查找所有已经分配部门的员工的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,
employees.first_name,
dept_emp.dept_no
from employees
inner join dept_emp
on employees.emp_no=dept_emp.emp_no
题目描述:查找所有员工的last_name和first_name以及对应部门编号dept_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 a.last_name,a.first_name,b.dept_no
from employees a
left join dept_emp b
#此处不论有没有分配部门的员工都要选出来,所以用左连接
on a.emp_no=b.emp_no
LEFT JOIN 关键字会从左表 (table_name1) 那里返回所有的行,即使在右表 (table_name2) 中没有匹配的行。
具体语法看这里
题目描述:查找所有员工入职时候的薪水情况,给出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
));
Remak:还是没看清题目,写起来丢三落四,被自己菜哭
代码:
select e.emp_no,s.salary
from employees e
left join salaries s
on e.emp_no=s.emp_no
and s.from_date=e.hire_date
order by e.emp_no
desc
题目描述:查找薪水涨幅超过15次的员工号emp_no以及其对应的涨幅次数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 *
from(
select emp_no,count(*) t
from salaries
group by emp_no
)
where t>15
select emp_no,count(salary) as t
from salaries
group by emp_no
having count(salary)>15
group by语法
GROUP BY 语句用于结合合计函数,根据一个或多个列对结果集进行分组。
这里根据emp_no进行分组并计算列数,也就是工资涨幅的次数,然后把选出的emp_no和t作为新的表被外层的select查询
题目描述:找出所有员工当前(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 distinct salary
from salaries
where to_date='9999-01-01'
order by salary
desc
题目描述:
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 d.dept_no,d.emp_no,s.salary
from dept_manager as d
inner join salaries as s
on d.emp_no=s.emp_no
and d.to_date='9999-01-01'
and s.to_date='9999-01-01'
题目描述:获取所有非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