drop table if exists dept
create table dept # 部门表
(dept1 int(5) comment '部门编号',dept_name varchar(10) comment '部门名称');
insert into dept values
(101,'财务'),
(102,'销售'),
(103,'IT技术'),
(104,'行政');
select * from dept
drop table if exists emp
create table emp #员工表
(sid int(5) comment "员工编号",
name varchar(10) comment "姓名",
age int(5) comment "年龄",
worktime_start varchar(10) comment "入职时间",
incoming int(5) comment "工资",
dept2 varchar(10) comment "部门编号");
insert into emp VALUES
('1789','张三',35,'1980/1/1',4000,'101'),
('1674','李四',32,'1983/4/1',3500,'101'),
('1776','王五',24,'1990/7/1',2000,'101'),
('1568','赵六',57,'1970/10/11',7500,'102'),
('1564','荣七',64,'1963/10/11',8500,'102'),
('1879','牛八',55,'1971/10/20',7300,'103'),
('1880','老九',55,'1971/10/20',8000,'105');
select * from emp
#----------------------
show tables;
select * from dept
select * from emp
#----------------------
-- 1.列出每个部门的平均收入及部门名称;
select round(avg(a.incoming),2) 部门平均收入,b.dept_name 部门名称 from emp a
left join dept b
on a.dept2 = b.dept1
group by b.dept_name;
-- 2.财务部门的收入总和;
select round(sum(a.incoming),2) 财政部门总收入,b.dept_name 部门名称 from emp a
left join dept b
on a.dept2 = b.dept1
group by b.dept_name having b.dept_name = "财务";
-- 3.It技术部入职员工的员工号
select a.sid It技术部入职员工的员工号 from emp a
left join dept b
on a.dept2 = b.dept1
where b.dept_name = "IT技术";
#----多表练习-----
-- 1.列出每个部门的平均收入及部门名称
select round(avg(a.incoming),2) 部门平均收入, b.dept_name 部门名称 from emp a
left join dept b on a.dept2 = b.dept1
group by b.dept_name ;
-- 2.财务部门的收入总和
select round(sum(a.incoming),2) 财政部门总收入,b.dept_name 部门名称 from emp a
left join dept b
on a.dept2 = b.dept1
where b.dept_name = "财务";
-- 3.It技术部入职员工的员工号
select a.sid It技术部入职员工的员工号 from emp a
left join dept b
on a.dept2 = b.dept1
where b.dept_name = "IT技术";
-- 4.财务部门收入超过2000元的员工姓名
select a.name 员工姓名 from emp a
left join dept b
on a.dept2 = b.dept1
where b.dept_name = "财务" and a.incoming >2000;
-- 5.找出销售部收入最低的员工的入职时间;
select a.worktime_start 销售部收入最低的员工的入职时间 from emp a
left join dept b on a.dept2 = b.dept1
where b.dept_name = "销售"
order by a.incoming limit 1;
select a.worktime_start 销售部收入最低的员工的入职时间 from emp a
left join dept b on a.dept2 = b.dept1
where a.incoming =
(select min(a.incoming) 最低收入 from emp a
left join dept b on a.dept2 = b.dept1 where b.dept_name = "销售" ) ;
-- 6.找出年龄小于平均年龄的员工的姓名,ID和部门名称
select a.name 员工姓名,a.sid 员工ID ,b.dept_name 部门名称 from emp a
left join dept b
on a.dept2 = b.dept1
where a.age < (select round(avg(a.age),2) 平均年龄 from emp a
left join dept b on a.dept2 = b.dept1 ) ;
-- 7.列出每个部门收入总和高于9000的部门名称
select b.dept_name 部门名称 from emp a
left join dept b on a.dept2 = b.dept1
group by b.dept_name having round(sum(a.incoming),2) > 9000 ;
-- 8.查出财务部门工资少于3800元的员工姓名
select a.name 员工姓名 from emp a
left join dept b on a.dept2 = b.dept1
where b.dept_name = "财务" and a.incoming < 3800 ;
-- 9.求财务部门最低工资的员工姓名;
select a.name 员工姓名 from emp a
left join dept b on a.dept2 = b.dept1
where b.dept_name = "财务" and a.incoming = (select min(a.incoming) 最低收入 from emp a
left join dept b on a.dept2 = b.dept1 where b.dept_name = "财务" );
select a.name 员工姓名 from emp a
left join dept b on a.dept2 = b.dept1
where b.dept_name = "财务"
order by a.incoming limit 1 ;
-- 10.找出销售部门中年纪最大的员工的姓名
select a.name 姓名 from emp a
left join dept b on a.dept2 = b.dept1
where b.dept_name = "销售" order by a.worktime_start limit 1 ;
select a.name 姓名 from emp a
left join dept b on a.dept2 = b.dept1
where b.dept_name = "销售" and a.worktime_start = (select min(a.worktime_start) 最早入职时间 from emp a
left join dept b on a.dept2 = b.dept1 where b.dept_name = "销售" );
-- 11.求收入最低的员工姓名及所属部门名称:
select a.name 员工姓名 ,b.dept_name 部门名称 from emp a
left join dept b on a.dept2 = b.dept1
order by a.incoming limit 1;
select a.name 员工姓名 ,b.dept_name 部门名称 from emp a
left join dept b on a.dept2 = b.dept1
where a.incoming = (select min(a.incoming) 最低收入 from emp a left join dept b on a.dept2 = b.dept1 );
-- 12.求李四的收入及部门名称
select a.incoming 最低收入 ,b.dept_name 部门名称 from emp a
left join dept b on a.dept2 = b.dept1
where a.name = "李四";
-- 13.求员工收入小于4000元的员工部门编号及其部门名称
select b.dept1 部门编号 ,b.dept_name 部门名称 from emp a
left join dept b on a.dept2 = b.dept1
where a.incoming <4000;
-- 14.列出每个部门中收入最高的员工姓名,部门名称,收入,并按照收入降序;
--方法1.1:各部门最高收入(select max(a.incoming) 部门最高收入 from emp a
left join dept b on a.dept2 = b.dept1
group by b.dept_name order by max(a.incoming) desc) ;
--方法1.2:嵌套子查询
select a.name 员工姓名, b.dept_name 部门名称, a.incoming 部门收入
from emp a
left join dept b on a.dept2 = b.dept1
where a.incoming in ((select max(a.incoming) 部门最高收入 from emp a
left join dept b on a.dept2 = b.dept1
group by b.dept_name order by max(a.incoming) desc) )
order by 部门收入 desc ;
--方法2:开窗后取
select A.员工姓名,A.部门名称,A.员工收入 from
(select
dense_rank() over(partition by b.dept_name order by b.dept_name, a.incoming desc) as 部门收入排序,
a.`name` 员工姓名, b.dept_name 部门名称,a.incoming 员工收入
from emp a
left join dept b on a.dept2 = b.dept1 ) as A
where A.部门收入排序 = 1 order by 员工收入 desc ;
-- 15.求出财务部门收益最高的俩位员工的姓名,工号,收益
select a.name 员工姓名, a.sid 工号,a.incoming 收益 from emp a
left join dept b on a.dept2 = b.dept1
where b.dept_name = "财务" order by a.incoming desc limit 2 ;
-- 16.查询财务部低于平均收入的员工号与员工姓名:
select a.sid 工号 ,a.name 员工姓名 from emp a
left join dept b on a.dept2 = b.dept1
where b.dept_name = "财务" and a.incoming < (select round(avg(a.incoming),2) 财务部平均收入 from emp a
left join dept b on a.dept2 = b.dept1 where b.dept_name = "财务");
-- 17.列出部门员工数大于1个的部门名称;
select b.dept_name 部门名称 from emp a
left join dept b on a.dept2 = b.dept1
group by b.dept_name
having count(dept_name) >1;
-- 18.列出部门员工收入不超过7500,且大于3000的员工年纪及部门编号;
select a.age 员工年纪,a.dept2 部门编号 from emp a
where a.incoming <= 7500 and a.incoming >3000;
-- 19.求入职于20世纪70年代的员工所属部门名称;
select b.dept_name 部门名称 from emp a
left join dept b on a.dept2 = b.dept1
where a.worktime_start like "197%";
-- 20.查找张三所在的部门名称;
select b.dept_name 部门名称 from emp a
left join dept b on a.dept2 = b.dept1
where a.name = "张三";
-- 21.列出每一个部门中年纪最大的员工姓名,部门名称;
select a.name 员工姓名, b.dept_name 部门名称
from emp a
left join dept b on a.dept2 = b.dept1
where a.age in ((select max(a.age) 部门最大年纪 from emp a
left join dept b on a.dept2 = b.dept1
group by b.dept_name order by max(a.age) desc) );
-- 22.列出每一个部门的员工总收入及部门名称;
select round(sum(incoming),2) 部门总收入 ,b.dept_name 部门名称 from emp a
left join dept b on a.dept2 = b.dept1
group by b.dept_name;
-- 23.列出部门员工收入大于7000的员工号,部门名称;
select a.sid 员工号, b.dept_name 部门名称 from emp a
left join dept b on a.dept2 = b.dept1
where a.incoming > 7000;
-- 24.找出哪个部门还没有员工入职;
select b.dept_name 部门名称 from emp a
left join dept b on a.dept2 = b.dept1
where a.worktime_start is null;
-- 25.先按部门号大小排序,再依据入职时间由早到晚排序员工信息表 ;
select * from emp a
order by a.dept2, a.worktime_start ;
-- 26.求出财务部门工资最高员工的姓名和员工号
select a.sid 员工号, a.name 员工姓名 from emp a
left join dept b on a.dept2 = b.dept1
where b.dept_name = "财务" order by a.incoming limit 1;
-- 27.求出工资在7500到8500之间,年龄最大的员工的姓名和部门名称。
select a.name 员工姓名, b.dept_name 部门名称 from emp a
left join dept b on a.dept2 = b.dept1
where a.incoming between 7500 and 8500 order by a.age desc limit 1;