Bootstrap

黑马2024AI+JavaWeb开发入门Day08-多表查询-飞书作业

视频地址:哔哩哔哩

讲义作业飞书地址: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_salary
    from tb_emp
    group 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_id
    from tb_emp
    group by dept_id
);

;