多表查询
笛卡尔积:
在数学中,两个集合的所有组合情况
连接查询:
内连接
查询A,B交集部分数据
隐式内连接:
select 字段列表 from 表1,表2 where 条件 、、、;
显示内连接:
select 字段列表 from 表1 [inner] join 表2 on 连接条件 、、、;
给表起别名和给字段起别名类似,表名 别名
注意:起别名之后不能用原名
外连接:
右外连接:查询右表所有数据(包含交集)
select 字段列表 from 表1 right [outer] join 表2 on 连接条件、、、;
左外连接:查询左表所有数据(包含交集)
select 字段列表 from 表1 left [outer] join 表2 on 连接条件、、、;
子查询
SQL语句中嵌套select语句,称为嵌套语句,又称子查询
形式:
select * from t1 where column1=(select column1 from t2 、、、);
子查询外部的语句可以是insert/update/delete/select的任何一个,最常见select
分类:
标量子查询:子查询返回的结果为单个值
操作符:= 、!=、>、<等
列子查询:子查询返回的结果为一列
操作符:in、not in
行子查询:子查询返回的结果为一行
= 、!=、>、<、n、not in
匹配多个字段可以使用:(字段1,字段2)=(值1,值2)
表子查询:子查询返回结果为多行多列
作为表使用
in
连接方式 | 匹配行为 | 是否保留不匹配 |
---|---|---|
INNER JOIN 或 , | 只保留匹配上的记录(交集) | ❌ 不保留 |
LEFT JOIN | 保留左表所有记录,右边匹配失败为 NULL | ✅ 保留左表不匹配 |
RIGHT JOIN | 保留右表所有记录,左边匹配失败为 NULL | ✅ 保留右表不匹配 |
FULL JOIN (部分数据库支持) | 保留左右两边所有记录,匹配失败补 NULL | ✅ 全保留 |
写SQL步骤:
先看用到什么表
根据条件写
事务
一组操作的集合,不可分割的工作单位,事务会把所有操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败
注意:
mysql的事务是自动提交的,当执行一条语句,mysql会立即隐式的提交事务
事务控制:
开启事务:start transaction; /begin;
提交事务:commit;
回滚事务:rollback;
事务没提交,执行结果已经生效,但是只有提交其他事务才能知道你删除成功了
事务的四大特性(ACID)
原子性:事务是不可分割的最小单元,要么全部成功,要么全部失败
一致性:事务完成时,必须使所有数据都保持一致状态
隔离性:数据库提供的隔离机制,保证事务在不受外部并发操作影响的独立环境运行
持久性:事务一旦提交或者回滚,他对数据库中数据的改变是永久的
索引
create index 索引名 on 表(字段);
帮助数据库高效获取数据的数据结构(B+树)
优点:
提高数据库查询效率,降低数据库IO成本
通过索引列对数据进行排序,降低数据排序的成本,降低CPU消耗
缺点:
索引会占用存储空间
提高查询效率,降低增、删、改效率
索引结构(B+数):
每一个节点有多个key
所有节点存储在叶子结点,飞叶子结点仅用于索引数据
叶子结点形成一颗双向链表,便于数据的排序及区间范围查询
主键字段,在建表时,会自动创建主键索引
声明 UNIQUE 后,数据库自动创建唯一索引,是为了用高效的数据结构保证数据唯一性和加快查找。
语法:
创建索引:
create [unique] index 索引名 on 表名(字段名,、、、);
查看索引:
show index from 表名;
删除索引:
drop index 索引名 on 表名;
Mybatis
优秀的持久层(DAO层)框架,简化JDBC(操作数据库规范)开发
入门
1、准备工作:创建springboot工程、数据库表user、实体类User)
2、引入Mybatis的相关依赖,配置Mybatis(数据库连接信息)
注意: 不要加分号
#驱动类名称
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
#数据库连接URL
spring.datasource.url=jbdc:mysql://localhost:3306/mybatis
#连接数据库用户名
spring.datasource.username=root
#连接数据库密码
spring.datasource.password=zhao521--
3、编写SQL语句(注解/XML)
JDBC
java语言操作关系型数据库的一套API
只是一套接口,具体实现由厂商提供(驱动)
步骤:
1、注册驱动
2、获取对象
3、获取执行SQL的对象statement,执行SQL,返回结果
4、封装结果
5、释放资源
问题:
1、获取的对象容易改变(硬编码不易修改)
2、封装结果臃肿
3、频繁获取、释放连接性能差
解决:
1、连接配置在Properties文件中
2、自动解析封装结果
3、数据库连接池管理(类似线程池)
程序员只需要定义:
properties配置
定义Mapper标签修饰的接口
数据库连接池
1、连接池是个容器,负责分配、管理数据库连接
2、它允许应用程序重复使用一个现有的数据库连接,而不是再建立一个
3、释放空闲时间超过最大空闲时间的连接,来避免因为没有释放资源连接而引起的数据库连接遗漏
优势:
资源重用
提升系统响应速度
避免数据库连接遗漏
实现:
标准接口:DataSource
由第三方实现
功能:获取连接 Connection getConnection()
使用最多的连接池技术:Druid(阿里巴巴开源)、Hikari(默认连接池)
lombok
lombok是一个实用的java类库,能通过注解的形式自动生成构造器、getter/setter、equals、hashcode、toString等方法,并可以自动化生成日志变量,简化java开发、提高效率。
注解:
@Data
提供了更综合的生成代码功能(@Getter、@Setter、@ToString、@EqualsAndHashCode)
@NoArgsConstructor
为实体生成无参构造器方法
@AllArgsConstructor
为实体生成除了static修饰的字段之外带有各参数的构造器方法