MySQL多表&事务
事务的基本概念
如果一个包含多个步骤的业务操作,被事务管理,那么这些操作要么同时成功,要么同时失败。
事务的操作
**事务的基本操作**
开启事务: start transaction;
回滚:rollback;
提交:commit;
**事务的提交**
自动提交
MySQL中默认的是自动提交
一条DML(增删改)语句会自动提交一次事务。
手动提交
Oracle 数据库默认是手动提交事务
需要先开启事务,再提交(每次修改语句都必须运行commit提交事务才能成功)
修改提交方式
查看事务的默认提交方式:SELECT @@autocommit; -- 1 代表自动提交 0 代表手动提交
修改默认提交方式: set @@autocommit = 0;
事务的四大特征(面试必考)
**1.原子性**
是不可分割的最小操作单位,要么同时成功,要么同时失败
**2.持久性**
当事务提交或回滚后,数据库会持久化的保存数据
**3.隔离性**
多个事务之间。相互独立
**4.一致性**
事务操作前后,数据总量不变
事务的隔离级别(了解)
**事务存在的问题**
1. 脏读:一个事务,读取到另一个事务中没有提交的数据
2. 不可重复读:在同一个事务中,两次读取到的数据不一样。
3.幻读:一个事务操作(DML)数据表中所有记录,另一个事务添加了一条数据,则第一个事务查询不到自己的修改。
隔离级别
1. read uncommitted 读未提交
产生的问题:脏读、不可重复读、幻读
2. read committed 读已提交
产生的问题:不可重复读、幻读
3. repeatable read 可重复读
产生的问题:幻读
3.serialisable 串行化
不产生任何问题,但是效率最低
内连接查询
**隐式内连接**
直接逗号分割多表
SELECT emp.name,emp.gender,dept.name FROM emp,dept WHERE emp.`dept_id` = dept.`id`;
显式内连接
语法: select 字段列表 from 表名1 [inner] join 表名2 on 条件
例如:SELECT * FROM emp JOIN dept ON emp.`dept_id` = dept.`id`;
外连接查询
**左外连接查询**
查询的是左表所有数据以及和右表有交集的数据
语法: 语法:select 字段列表 from 表1 left [outer] join 表2 on 条件;
**右外连接查询**
查询的是右表所有数据以及和左表有交集的数据
语法: 语法:select 字段列表 from 表1 right [outer] join 表2 on 条件;
子查询
个人理解:查询的嵌套,将一条查询语句查询出的数据当做条件传给另一条查询语句。
概念:查询中嵌套查询,称嵌套查询为子查询。
子查询可以作为条件,使用运算符去判断。 运算符: > >= < <= =
子查询可以作为条件,使用运算符in来判断
子查询可以作为一张虚拟表参与查询