练习24.10.28-02

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; 

猜你喜欢

转载自blog.csdn.net/qq_42217078/article/details/143308578