视频地址:哔哩哔哩
讲义作业飞书地址:day08作业
多表查询:
-- 部门管理
create table tb_dept(id int unsigned primary key auto_increment comment '主键ID',name varchar(10) not null unique comment '部门名称',create_time datetime not null comment '创建时间',update_time datetime not null comment '修改时间'
) comment '部门表';insert into tb_dept (id, name, create_time, update_time)values(1,'学工部',now(),now()),(2,'教研部',now(),now()),(3,'咨询部',now(),now()),(4,'就业部',now(),now()),(5,'人事部',now(),now());-- 员工管理
create table tb_emp (id int unsigned primary key auto_increment comment 'ID',username varchar(20) not null unique comment '用户名',password varchar(32) default '123456' comment '密码',name varchar(10) not null comment '姓名',gender tinyint unsigned not null comment '性别, 说明: 1 男, 2 女',image varchar(300) comment '图像',job tinyint unsigned comment '职位, 说明: 1 班主任,2 讲师, 3 学工主管, 4 教研主管, 5 咨询师',entrydate date comment '入职时间',dept_id int unsigned comment '部门ID',salary int unsigned comment '工资',create_time datetime not null comment '创建时间',update_time datetime not null comment '修改时间'
) comment '员工表';INSERT INTO tb_emp(id, username, password, name, gender, image, job, entrydate,dept_id,salary, create_time, update_time) VALUES(1,'jinyong','123456','金庸',1,'1.jpg',4,'2000-01-01',2,20000,now(),now()),(2,'zhangwuji','123456','张无忌',1,'2.jpg',2,'2015-01-01',2,18000,now(),now()),(3,'yangxiao','123456','杨逍',1,'3.jpg',2,'2008-05-01',2,16800,now(),now()),(4,'weiyixiao','123456','韦一笑',1,'4.jpg',2,'2007-01-01',2,12000,now(),now()),(5,'changyuchun','123456','常遇春',1,'5.jpg',2,'2012-12-05',2,9000,now(),now()),(6,'xiaozhao','123456','小昭',2,'6.jpg',3,'2013-09-05',1,6000,now(),now()),(7,'jixiaofu','123456','纪晓芙',2,'7.jpg',1,'2005-08-01',1,6500,now(),now()),(8,'zhouzhiruo','123456','周芷若',2,'8.jpg',1,'2014-11-09',1,7200,now(),now()),(9,'dingminjun','123456','丁敏君',2,'9.jpg',1,'2011-03-11',1,5300,now(),now()),(10,'zhaomin','123456','赵敏',2,'10.jpg',1,'2013-09-05',1,12000,now(),now()),(11,'luzhangke','123456','鹿杖客',1,'11.jpg',5,'2007-02-01',3,8900,now(),now()),(12,'hebiweng','123456','鹤笔翁',1,'12.jpg',5,'2008-08-18',3,7800,now(),now()),(13,'fangdongbai','123456','方东白',1,'13.jpg',5,'2012-11-01',3,6800,now(),now()),(14,'zhangsanfeng','123456','张三丰',1,'14.jpg',2,'2002-08-01',2,15800,now(),now()),(15,'yulianzhou','123456','俞莲舟',1,'15.jpg',2,'2011-05-01',2,11500,now(),now()),(16,'songyuanqiao','123456','宋远桥',1,'16.jpg',2,'2007-01-01',2,8300,now(),now()),(17,'chenyouliang','123456','陈友谅',1,'17.jpg',NULL,'2015-03-21',NULL,4500,now(),now());-- 薪资等级表
create table tb_salgrade(grade int comment '等级',losal int comment '该等级最低薪资',hisal int comment '该等级最高薪资'
) comment '薪资等级表';insert into tb_salgrade values (1,0,3000);
insert into tb_salgrade values (2,3001,5000);
insert into tb_salgrade values (3,5001,8000);
insert into tb_salgrade values (4,8001,10000);
insert into tb_salgrade values (5,10001,15000);
insert into tb_salgrade values (6,15001,20000);
insert into tb_salgrade values (7,20001,25000);
insert into tb_salgrade values (8,25001,30000);-- 1. 查询员工的姓名 , 及所属的部门名称 (隐式内连接实现)
select e.name,d.name from tb_emp e, tb_dept d where e.dept_id = d.id;-- 2. 查询员工的姓名 , 及所属的部门名称 (显式内连接实现)
select e.name,d.name from tb_emp e inner join tb_dept d on e.dept_id = d.id;-- 3. 查询员工的 姓名、性别、职位、部门名称 (隐式内连接)
select e.name,e.gender,e.job,d.name from tb_emp e, tb_dept d where e.dept_id = d.id;-- 4. 查询 薪资 高于 10000 的员工的姓名、性别、职位、部门名称(显式内连接)
select e.name,e.gender,e.job,d.name from tb_emp e inner join tb_dept d on e.dept_id = d.id and e.salary> 10000;-- 5. 查询员工表 所有 员工的姓名, 和对应的部门名称 (左外连接)
select e.name,d.name from tb_emp e left join tb_dept d on e.dept_id = d.id;-- 6. 查询员工表 所有 员工的姓名, 和对应的部门名称 (右外连接)
select e.name,d.name from tb_dept d right join tb_emp e on e.dept_id = d.id;-- 7. 查询部门表 所有 部门的名称, 和对应的员工名称 (右外连接)
select d.name,e.name from tb_emp e right join tb_dept d on e.dept_id = d.id;-- 8. 查询 "教研部" 的所有员工信息 (标量子查询)
select * from tb_emp e where dept_id = (select id from tb_dept where name = '教研部');-- 9. 查询在 "方东白" 入职之后的员工信息 (标量子查询)
select * from tb_emp e where e.entrydate > (select entrydate from tb_emp where name = '方东白');-- 10. 查询 "教研部" 和 "咨询部" 的所有员工信息 (列子查询)
select * from tb_emp e where e.dept_id in (select id from tb_dept where name = '教研部' or name = '咨询部');-- 11. 查询与 "韦一笑" 的入职日期 及 职位都相同的员工信息 (行子查询)
select * from tb_emp where (entrydate,job) = (select entrydate,job from tb_emp where name = '韦一笑');-- 12. 查询入职日期是 "2006-01-01" 之后的员工信息 , 及其部门信息 (表子查询)
select e.*, d.name from tb_emp e, tb_dept d where e.dept_id = d.id and e.entrydate > '2006-01-01';-- 13. 查询 拥有员工的 部门ID、部门名称 (没有员工的部门无需展示)
select d.id,d.name from tb_dept d where d.id in (select tb_emp.dept_id from tb_emp group by dept_id);-- 14. 查询所有 在 2010-01-01 之后入职的员工, 及其归属的部门名称; 如果员工没有分配部门, 也需要展示出来
select e.name, e.entrydate, d.name as dept_name from tb_emp e left join tb_dept d on e.dept_id = d.id
where e.entrydate > '2010-01-01';-- 15. 查询 "教研部" 员工的平均工资
select avg(e.salary) as avg_salary from tb_emp e inner join tb_dept d on e.dept_id = d.id
where d.name = '教研部';-- 16. 查询工资比 "俞莲舟" 高的员工信息。
select * from tb_emp where salary > (select salary from tb_emp where name = '俞莲舟');-- 17. 查询 工资 比该企业员工的平均薪资 还要高的员工信息
select * from tb_emp where salary > (select avg(salary) from tb_emp);-- 18. 查询所有的部门信息, 并统计部门的员工人数
select d.id, d.name, count(e.id) as emp_count from tb_dept d
left join tb_emp e on d.id = e.dept_id group by d.id, d.name;-- 19. 查询所有员工的 姓名, 工资 , 及 工资等级 (有难度的哦)
select e.name, e.salary, g.grade from tb_emp e
inner join tb_salgrade g on e.salary between g.losal and g.hisal;-- 20. 查询 "教研部" 所有员工的信息 及 工资等级 (有难度的哦)
select e.*, g.grade from tb_emp e inner join tb_dept d on e.dept_id = d.id
inner join tb_salgrade g on e.salary between g.losal and g.hisal where d.name = '教研部';-- 21. 查询 工资 低于 本部门平均工资的员工信息 (有难度的哦)
select e.* from tb_emp e
inner join (select dept_id, avg(salary) as avg_salaryfrom tb_empgroup by dept_id
) dept_avg on e.dept_id = dept_avg.dept_id
where e.salary < dept_avg.avg_salary;-- 22. 列出所有部门的详细信息(包括部门ID, 部门名称)和人数
select d.id, d.name, count(e.id) as emp_count from tb_dept d
left join tb_emp e on d.id = e.dept_id group by d.id, d.name;-- 23、取得每个薪资等级有多少员工 (有难度的哦)
select g.grade, count(e.id) as emp_count from tb_salgrade g
left join tb_emp e on e.salary between g.losal and g.hisal group by g.grade;-- 24. 取得每个部门最高薪水的人员名称
select d.name as dept_name, e.name as emp_name, e.salary from tb_emp e
inner join tb_dept d on e.dept_id = d.id
where (e.salary, e.dept_id) in (select max(salary), dept_idfrom tb_empgroup by dept_id
);