MySQL 多表查询与事务的操作
1 表连接查询
笛卡尔积现象
select * from emp, dept ; -- 笛卡尔积, 两表数据相乘
-- 乘积筛选后的结果, 两边能匹配上的数据
select * from emp, dept where emp.deptno = dept.deptno;
select * from emp e, dept d where e.deptno = d.deptno;
select e.ename, d.dname from emp e, dept d where e.deptno = d.deptno;
内连接
⽤左边表的记录去匹配右边表的记录,如果符合条件的则显示。如:从表.外键 = 主表.主键
隐式内连接
隐式内连接:看不到 JOIN 关键字,条件使⽤ WHERE 指定
SELECT 字段名 FROM 左表, 右表 WHERE 条件;
select * from emp, dept where emp.dept_id
= dept.id
;
显示内连接
显示内连接:使⽤ INNER JOIN … ON 语句,可以省略 INNER
– 内连接
select * from emp e inner join dept d on e.deptno = d.deptno;
内连接查询步骤
- 确定查询哪些表
- 确定表连接的条件
- 确定查询的条件
- 确定查询的字段
– 表连接 join
/
内连接 [inner] join
外连接
左外连接 left [outer] join
右外连接 right [outer] join
oracle - 全外连接 full [outer] join
连接的选择,主要取决于查询结果,需要哪张表的全部数据
需要显示全部数据的表, 称为"驱动表"
/*
左外连接
– 左外连接
select * from emp e left outer join dept d on e.deptno = d.deptno;
select * from dept d left outer join emp e on e.deptno =
d.deptno;
##右外连接
- 右外连接
select * from emp e right outer join dept d on e.deptno = d.deptno;
三者之间关系
子查询
引入
-- 需求: 查询开发部中有哪些员⼯
select * from emp;
-- 通过两条语句查询
select id from dept where name = '开发部';
select * from emp where dept_id = 1;
-- 使⽤⼦查询
select * from emp where dept_id = (select id from dept where name = '市场
部');
⼦查询的概念:
- ⼀个查询的结果做为另⼀个查询的条件
- 有查询的嵌套,内部的查询称为⼦查询
- ⼦查询要使⽤括号
2.2 ⼦查询结果的三种情况
单列单行
单列多行
多行多列
小结
⼦查询结果只要是单列,则在 WHERE 后⾯作为条件
⼦查询结果只要是多列,则在 FROM 后⾯作为表进⾏⼆次查询
3 事务
引入
什么是事务:
在实际的开发过程中,⼀个业务操作,如:转账,往往是要多次访问数据库才能完成的。转账是⼀个⽤户扣钱,另⼀个⽤户加钱。如果其中有⼀条 SQL 语句出现异常,这条 SQL 就可能执⾏失败。
事务执⾏是⼀个整体,所有的 SQL 语句都必须执⾏成功。如果其中有 1 条 SQL 语句出现异常,则所有的 SQL 语句都要回滚,整个业务执⾏失败。
MYSQL 中可以有两种⽅式进⾏事务的操作:
- ⼿动提交事务
- ⾃动提交事务
手动提交事物
功能 | SQL语句 |
---|---|
开启事务 | start transaction; |
提交事务 | commit; |
回滚事务 | rollback; |
过程
3.5 回滚点
定义
在某些成功的操作完成之后,后续的操作有可能成功有可能失败,但是不管成功还是失败,前⾯操作都已经成功,可以在当前成功的位置设置⼀个回滚点。可以供后续失败操作返回到该位置,⽽不是返回所有操作,这个点称之为回滚点。
回滚点的操作语句 | 语句 |
---|---|
设置回滚点 | savepoint 名字 |
回到回滚点 | rollback to 名字 |
事务的隔离级别
事务的四⼤特性 ACID
事务特性 | 含义 |
---|---|
原⼦性(Atomicity) | 每个事务都是⼀个整体,不可再拆分,事务中所有的 SQL 语句要么都执⾏成功, 要么都失败。 |
⼀致性(Consistency) | 事务在执⾏前数据库的状态与执⾏后数据库的状态保持⼀致。 |
隔离性(Isolation) | 事务与事务之间不应该相互影响,执⾏时保持隔离的状态。 |
持久性(Durability) | ⼀旦事务执⾏成功,对数据库的修改是持久的。就算关机,也是保存下来的。 |