day08 MYSQL多表
1,多表约束
外键约束:用来保证数据完整性(多表之间)。
2,表与表之间的关系:
在多的一方创建外键指向一的一方的主键
需要创建中间表,中间表至少两个字段,分别作为外键指向多对多
双方的主键(中间表可以添加别的属性字段)。
- 一对一的关系(很少用,一般一对一可以写在一个表中)
唯一外键对应
假设是一对多,在多的一方创建外键指向一的一方的主键,将外
键设置为unique。
主键对应
将两个表的主键建立对应关系即可。
3,多表查询分类:
:查询到的是两个表的笛卡尔积。
语法:
select * from 表1 cross join 表2;
select * from 表1,表2;
- 内连接: inner join (inner 可以省略)
显示内连接:在SQL中显示的调用inner join 关键字
语法:select * from 表1 inner join 表2 on 关联条件
隐式内连接:在SQl中没有调用inner join 关键字
语法:select * from 表1,表2 where 关联条件
- 外连接:outer join(outer可以省略)
左外连接:
语法:select* from 表1 left outer join 表2 on 关联条件
右外连接:
语法:select * from 表1 right outer join 表2 on 关联条件
- 子查询:一个查询语句条件需要依赖另一个查询语句的结果。
带in的子查询: ---在条件范围内
select*from classes where cid in (select cno from student where birthday>'1991-01-01');
带exists的子查询:---if条件判断,子句为true,执行前边
select*from classes where exists (select cno from student where birthday>'1991-01-01');
带any的子查询: ---大于任意的就是大于最小值
select * from classes where cid >any (select cno from student);
带all的子查询: ---大于所有的就是大于最大值
select*from classes where cid > all (select cno from student);
4,事务
- 概述:指定是逻辑上的一组操作,组成这组操作的各个逻辑单位,要么全部
失败。
开启事务:start transaction;
提交事务:commit;
回滚事务:rollback;
1,原子性:事务不可分割,组成事务的各个逻辑单元不可分割。
2,一致性:事务执行的前后,数据完整性爆出一致。
3,隔离性:事务执行不应该受到其他事务的干扰。
4,持久性:事务一旦结束,数据就持久化到数据库中。
1,脏读:一个事务读到了另一个事务未提交的数据,导致查询结果不一致。
2,不可重复读:一个事务读到了另一个事务已经提交的update数据,导致多次查询结果不一致
3,虚读/幻读:一个事务读到了另一个事务已经提交的insert的数据,导致多次查询结果不一致。
- 设置事务等级解决这些问题(事务的隔离级别):
- readuncommitted : 脏读,不可重复读,虚读都有可能发生
- readcommitted:避免脏读,但是不可重复读和虚读有可能发生
- repeatable read : 避免脏读和不可重复读,但是虚读有可能发生。
- serializable:避免脏读,不可重复读,虚读。
|
|