IDEA快捷键:
向后缩进:选择好代码,按【TAB】
向前缩进:选择好代码,按【shift】+【TAB】
目录
select * from tb_emp where dept_id in (select id from tb_dept where name = '教研部' or name = '咨询部');
一:MySQL
(一)多表查询
1.内连接--查两张表的交集
注意这个起别名操作
-- ============================= 内连接 ==========================
-- 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 join tb_dept on tb_emp.dept_id =tb_dept.id;
注意:一共17条数据,只查出来16条数据,因为有一条数据的归属部门为null,没有与部门表建立联系,不属于二者的交集,没有被查出来
2.外连接
-- =============================== 外连接 ============================
-- 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;
相比内连接:查出来了17号数据
相比内连接:查出来了18条数据,16条关联数据,2条无关联数据
人事部, 就业部
3.内连接与外连接的区别
看上面的例子
4.子查询--嵌套查询
重点看例题
(1)标量子查询--子查询返回单个值
举例:
-- 标量子查询
-- A. 查询 "教研部" 的所有员工信息
-- a. 查询 教研部 的部门ID - tb_dept
select id from tb_dept where name = '教研部'; -- 2-- b. 再查询该部门ID下的员工信息 - tb_emp
select * from tb_emp where dept_id =2;
-- 两个select语句合在一起
select * from tb_emp where dept_id = (select id from tb_dept where name = '教研部');
-- B. 查询在 "方东白" 入职之后的员工信息
-- a. 查询 方东白 的入职时间
select entrydate from tb_emp where name = '方东白'; -- 2012-11-01-- b. 查询在 "方东白" 入职之后的员工信息
select * from tb_emp where entrydate >2012-11-01;
-- 两个select语句合在一起
select * from tb_emp where entrydate > (select entrydate from tb_emp where name = '方东白');
(2)列子查询--子查询返回结果为一列(属性字段值)
举例:
-- 列子查询
-- A. 查询 "教研部" 和 "咨询部" 的所有员工信息
-- a. 查询 "教研部" 和 "咨询部" 的部门ID - tb_dept
select id from tb_dept where name = '教研部' or name = '咨询部'; -- (2,3)-- b. 根据部门ID, 查询该部门下的员工信息 - tb_emp
select * from tb_emp where dept_id in (2,3);
-- 两个select语句合在一起
select * from tb_emp where dept_id in (select id from tb_dept where name = '教研部' or name = '咨询部');
(3)行在查询--子查询返回结果为一行(行记录)
-- 行子查询
-- A. 查询与 "韦一笑" 的入职日期 及 职位都相同的员工信息 ;
-- a. 查询 "韦一笑" 的入职日期 及 职位
select entrydate,job from tb_emp where name = '韦一笑';-- b. 查询与其入职日期 及 职位都相同的员工信息 ;
-- 方式一
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 = '2007-01-01' and job=2;
等价于: select * from tb_emp where (entrydate,job)=( '2007-01-01', 2)
-- 方式二
select * from tb_emp where (entrydate,job)=(select entrydate,job from tb_emp where name = '韦一笑');
(4)表子查询--子查询返回结果多行多列
在子表中查询,子表跟在from后面
-- 表子查询
-- A. 查询入职日期是 "2006-01-01" 之后的员工信息 , 及其部门名称
-- a. 查询入职日期是 "2006-01-01" 之后的员工信息
select * from tb_emp where entrydate > '2006-01-01';-- b. 查询这部分员工信息及其部门名称 - tb_dept
select e.* , d.name from (select * from tb_emp where entrydate > '2006-01-01') e , tb_dept d where e.dept_id = d.id;
5.案例
(1)查询价格低于 10元 的菜品的名称 、价格 及其 菜品的分类名称
方式一:用表子查询
step1:查询价格低于 10元菜品的名称 、价格 及其 菜品的分类id---返回结果为表
step2:查询分类id对应的分类名称--两张表里查,使用外连接
方法二:直接两张表一块查--内连接(用外连接也行)
select d.name, d.price, c.name
from dish d,
category c
where d.category_id = c.id
and d.price < 10;
(2)查询所有价格在 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;
(3)查询每个分类下最贵的菜品, 展示出分类的名称、最贵的菜品的价格--重点看
方法一:列子查询+group by 分组 ----难点
step1: 子查询--先分组(按菜品分类),得到每个分类下的最贵菜品的价格p
select max(菜品表.菜品价格) from 菜品表 group by 菜品分类 id --result
step2:再筛选每组内价格等于p的菜品
select 分类表.菜品分类名 菜品表.菜品价格 from 分类表 菜品表 where 菜品表.菜品价格 in (result)
方法二:
执行顺序: from --> where --> group by --> select
先分组了,然后选择 max(d.price) 这个是分组后的
通过c.name 两张表都分组了
分组了的表,只能返回分组字段和聚合函数
select c.name, max(d.price)
from dish d,
category c
where d.category_id = c.id
group by c.name;
(4)查询各个分类下 菜品状态为 '起售' , 并且 该分类下菜品总数量大于等于3 的 分类名称 .
首先筛选出 菜品状态为 '起售'的菜品--where + 内连接
select 分类表.名称 from 分类表 菜品表 where 菜品表.菜品状态==起售 (漏了两张表要连一起)
然后group by + count聚合函数
group by 分类表.名称
having count(菜品表.菜品名称)>=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;
(5)查询出 "商务套餐A" 中包含了哪些菜品 (展示出套餐名称、价格, 包含的菜品名称、价格、份数).--- 多对多查询
然后再把*换回需要返回的字段名
s.name, s.price, d.name, d.price, sd.copies,
(份数在中间表中)
-- 表: setmeal , setmeal_dish , dish
-- SQL:
select s.name, s.price, d.name, d.price, sd.copies
from setmeal s,
setmeal_dish sd,
dish d
where s.id = sd.setmeal_id
and sd.dish_id = d.id
and s.name = '商务套餐A';
(6)查询出低于菜品平均价格的菜品信息 (展示出菜品名称、菜品价格).
-- a. 计算 菜品平均价格
select avg(price) from dish;-- b. 查询出低于菜品平均价格的菜品信息
select * from dish where price < (select avg(price) from dish);
(二)事务
1.介绍
2.操作
举例:
3.事务特性
4.小结
(三)索引
【Java Web】008 - MySQL(多表查询 & 事务 & 索引)_java mysql 事务-CSDN博客
索引提高查询速度(空间换时间)
举例:
数据量越大,查询效率越低,那么我们就要对其进行优化,从而提高它查询效率,这时候就用到了索引。
1.介绍
索引:提高查询数据的数据结构
但是:一个业务,查询业务占90%以上,这两个缺点就不值一提了
2.结构
3.语法
举例;
二:mybatis入门--简化JDBC开发
(一)快速入门
1.案例介绍
2.实现过程
【Java Web】009 -- MyBatis(入门 & 增删改查 & 动态SQL)_mybatis新增sql-CSDN博客
Day08-14. Mybatis-入门-快速入门程序_哔哩哔哩_bilibili
springboot整合mybatis配置数据库,就是将上述操作转换为如下代码配置到application.properties文件中
3.配置SQL提示
注入SQL语言
配置数据库连接
(二)JDBC介绍
资源浪费:资源指数据库连接资源 (图中的黄色部分),创建资源很麻烦,费时,频繁创建释放,程序运行慢
mybatis主要关注以下两点:
(三)数据库连接池
1.介绍
---- 类似线程池
2.创建数据库连接池
3.更换默认连接池接口
(1)方法一:加依赖
(2)方法二:配置文件中指明
(四)lombok
1.问题--代码臃肿
2.lombok提供的注解
3.举例
(1)首先pox文件中添加lombok
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
(2)添加注解