多表关系的设计
在多表之间可以添加外键约束、交叉连接等。
多表设计之外键约束
- 作用:约束是用来保证数据的完整性。
- 单表约束
- 主键约束
- 唯一约束
- 非空约束
- 多表约束
- 外键约束:用来保证数据完整性(多表之间)。
- 在员工表添加外键约束部门表时,插入一个没有部门的员工,删除一个带有员工的部门都是不应该发生。
多表查询之交叉连接
- 交叉连接
- 使用cross join关键字,select * from classes cross join student;
- 不使用cross join关键字,SELECT * FROM classes,student;
- 多表查询之内连接
- 内连接
- 显示内连接,select * from classes c inner join student s on c.cid = s.cno;
- 隐式内连接,SELECT * FROM classes c,student s WHERE c.cid = s.cno;
- 内连接
- 多表查询之外连接
- 外连接
- 左外连接,SELECT * FROM classes c LEFT OUTER JOIN student s ON c.cid = s.cno;
- 右外连接,select * from classes c right outer join student s on c.cid = s.cno;
- 外连接
- 多表查询之内连接与外连接的区别
.
多表查询的查询
- 在from语句后添加两个表,在where语句中通过两表的属性进行连接。
- 使用left join或right join将两表合并。
- 使用子查询。
多表的子查询
-
带in的子查询
例如:查询学生生日在91年之后的班级的信息,可以使用select * from classes where cid in (SELECT cno FROM student WHERE birthday > ‘1991-01-01’); -
带exists的子查询
例如:查询学生生日大于91年1月1日,如果记录存在,前面的SQL语句就会执行,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)
事务隔离
有关事务
- 事务:指的是逻辑上的一组操作,组成这组操作的各个逻辑单元,要么全都成功,要么全都失败。
- 常见的事务
- 开启事务:start transaction;
- 提交事务:commit;
- 回滚事务:rollback;
- 事务的特性:
- 原子性:事务的不可分割,组成事务的各个逻辑单元不可分割。
- 一致性:事务执行的前后,数据完整性保持一致。
- 隔离性:事务执行不应该受到其他事务的干扰。
- 持久性:事务一旦结束,数据就持久化到数据库中。
事务隔离的背景
- 隔离性:一个事务的执行,不应该受到其他事务的干扰。
- 如果不考虑隔离性(一个事务执行受到其他的事务的干扰),引发一些安全问题,主要体现在读取数据上:
- 脏读:一个事务读到了另一个事务未提交的数据,导致查询结果不一致
- 不可重复读:一个事务读到了另一个事务已经提交的update的数据,导致多次查询结果不一致。
- 虚读/幻读:一个事务读到了另一个事务已经提交的insert的数据,导致多次查询结果不一致。
有关事务隔离
- 设置事务的隔离级别:
- read uncommitted :脏读,不可重复读,虚读都有可能发生
- read committed :避免脏读。但是不可重复读和虚读是有可能发生
- repeatable read :避免脏读和不可重复读,但是虚读有可能发生。
- serializable :避免脏读,不可重复读,虚读。