本系列为笔者学习JavaWeb的课堂笔记,视频资源为B站黑马程序员出品的《黑马程序员JavaWeb开发教程,实现javaweb企业开发全流程(涵盖Spring+MyBatis+SpringMVC+SpringBoot等)》,章节分布参考视频教程,为同样学习JavaWeb系列课程的同学们提供参考。
01 数据准备
-- 部门管理 tb_dept
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());
-- 员工管理 tb_emp
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',
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, create_time, update_time) VALUES
(1,'jinyong','123456','金庸',1,'1.jpg',4,'2000-01-01',2,now(),now()),
(2,'zhangwuji','123456','张无忌',1,'2.jpg',2,'2015-01-01',2,now(),now()),
(3,'yangxiao','123456','杨逍',1,'3.jpg',2,'2008-05-01',2,now(),now()),
(4,'weiyixiao','123456','韦一笑',1,'4.jpg',2,'2007-01-01',2,now(),now()),
(5,'changyuchun','123456','常遇春',1,'5.jpg',2,'2012-12-05',2,now(),now()),
(6,'xiaozhao','123456','小昭',2,'6.jpg',3,'2013-09-05',1,now(),now()),
(7,'jixiaofu','123456','纪晓芙',2,'7.jpg',1,'2005-08-01',1,now(),now()),
(8,'zhouzhiruo','123456','周芷若',2,'8.jpg',1,'2014-11-09',1,now(),now()),
(9,'dingminjun','123456','丁敏君',2,'9.jpg',1,'2011-03-11',1,now(),now()),
(10,'zhaomin','123456','赵敏',2,'10.jpg',1,'2013-09-05',1,now(),now()),
(11,'luzhangke','123456','鹿杖客',1,'11.jpg',5,'2007-02-01',3,now(),now()),
(12,'hebiweng','123456','鹤笔翁',1,'12.jpg',5,'2008-08-18',3,now(),now()),
(13,'fangdongbai','123456','方东白',1,'13.jpg',5,'2012-11-01',3,now(),now()),
(14,'zhangsanfeng','123456','张三丰',1,'14.jpg',2,'2002-08-01',2,now(),now()),
(15,'yulianzhou','123456','俞莲舟',1,'15.jpg',2,'2011-05-01',2,now(),now()),
(16,'songyuanqiao','123456','宋远桥',1,'16.jpg',2,'2007-01-01',2,now(),now()),
(17,'chenyouliang','123456','陈友谅',1,'17.jpg',NULL,'2015-03-21',NULL,now(),now());
02 笛卡尔积
笛卡尔积:指数学当中,两个集合(A和B)的所有组合情况。

select * from tb_emp, tb_dept;

select * from tb_emp, tb_dept
where tb_emp.dept.id = tb_dept.id; #逻辑连接

03 连接查询

内连接:查询两个集合(A和B)的交集

-- A. 查询员工的姓名及所属部门名称(隐式内连接)
select tb_emp.name, tb_dept.name
from tb_emp, tb_dept
where tb_emp.dept_id = tb_dept.id;
-- 起别名
select e.name, d.name
from tb_emp e, tb_dept d
where e.dept_id = d.id;
-- B. 查询员工的姓名及所属部门名称(显式内连接)
select tb_emp.name, tb_dept.name
from tb_emp inner join tb_dept
on tb_emp.dept_id = tb_dept.id;
外连接:左外连接查询左集合(A)的所有数据,右外连接查询右集合(B)的所有数据

-- A. 查询员工表所有员工的姓名和对应的部门名称(左外连接)
select e.name, d.name
from tb_emp e left join tb_dept d
on e.dept_id = d.id;
-- B. 查询部门表所有部门的名称和对应的员工姓名(右外连接)
select e.name, d.name
from tb_emp e right join tb_dept d
on e.dept_id = d.id;
select e.name, d.name
from tb_dept d left join tb_emp e
on e.dept_id = d.id;
04 子查询


① 标量子查询

-- 查询教研部的所有员工信息
-- a. 获取教研部id
select id from tb_dept where name = '教研部';
-- b. 拿着部门id筛选员工
select * from tb_emp where dept_id = 2;
-- c. 合并大法
select * from tb_emp where dept_id = (select id from tb_dept where name = '教研部');
-- 查询在东方白之后入职的员工信息
-- a. 获取方东白入职时间
select entryTime from tb_emp where name = '方东白';
-- b. 拿着入职时间筛选员工
select * from tb_emp where entryTime > '2012-11-01';
-- c. 合并大法
select * from tb_emp where entryTime > (select entryTime from tb_emp where name = '方东白');


② 列子查询

-- 查询教研部和咨询部的员工信息
-- a. 获取教研部和咨询部id
select id from tb_dept where name = '教研部' or name = '咨询部';
-- b. 拿着部门id筛选员工
select * from tb_emp where dept_id in (2, 3);
-- c. 合并大法
select * from tb_emp where dept_id in (select id from tb_dept where name = '教研部' or name = '咨询部');

③ 行子查询

-- 查询与韦一笑的入职日期和职位都相同的员工信息
-- a. 获取韦一笑的入职日期和职位
select entrydate, job from tb_emp where name = '韦一笑';
-- b. 拿着入职日期和职位筛选员工
select * from tb_emp where entrydate = '2007-01-01' and job = 2;
select * from tb_emp where (entrydate, job) = ('2007-01-01', 2);
-- c. 合并大法
select * from tb_emp where entrydate = (select entrydate from tb_emp where name = '韦一笑') and job = (select job from tb_emp where name = '韦一笑');
select * from tb_emp where (entrydate, job) = (select entrydate, job from tb_emp where name = '韦一笑');

④ 表子查询

-- 查询入职日期是“2006-01-01”之后的员工信息及其部门名称
-- a. 获取入职日期是“2006-01-01”之后的员工信息
select * from tb_emp where entrydate > '2006-01-01';
-- b. 拿着员工信息筛选部门名称
select e.*, d.name from (select * from tb_emp where entrydate > '2006-01-01') e, tb_dept d where e.dept_id = d.id;

05 案例:根据需求完成多表查询的SQL语句编写

-- 1. 查询价格低于10元的菜品的名称、价格及其菜品的分类名称
select d.name, d.price, c.name
from dish d,
category c
where d.category_id = c.id
and d.price < 10;
-- 查询所有价格在10到50元之间且状态为'起售'的菜品名称、价格及其菜品的分类名称 (即使菜品没有分类 , 也需要将菜品查询出来)
select d.name, d.price, c.name
from dish d
left join category c on d.category_id = c.id
where d.price between 10 and 50
and d.status = 1;
-- 查询每个分类下最贵的菜品, 展示出分类的名称、最贵的菜品的价格
select c.name, max(d.price)
from dish d,
category c
where d.category_id = c.id
group by c.name;
-- 查询各个分类下状态为'起售' , 并且该分类下菜品总数量大于等于3的分类名称
select c.name, count(*)
from dish d,
category c
where d.category_id = c.id
and d.status = 1
group by c.name
having count(*) >= 3;
-- 查询出 "商务套餐A" 中包含了哪些菜品(展示出套餐名称、价格, 包含的菜品名称、价格、份数)
select s.name, s.price, d.name, d.price, sd.copies
from setmeal s,
setmeal_dish sd,
dish d
where sd.setmeal_id = s.id
and sd.dish_id = d.id
and s.name = '商务套餐A';
-- 查询出低于菜品平均价格的菜品信息 (展示出菜品名称、菜品价格)
select * from dish where price < (select avg(price) from dish);
323

被折叠的 条评论
为什么被折叠?



