多表操作
一对多关系:
原则:在从表(多方)创建一个字段,字段作为外键指向主表(一方)的主键。
多对多关系:
原则:需要创建第三张表,中间表中至少两个字段,这两个字段分别作为外键指向各自一方的主键。
一对一关系:
原则:
外键唯一:主表的主键和从表的外键(唯一),形成主外键关系,外键唯一unique。
外键是主键:主表的主键和外键的主键,形成主外键关系。
提示:实际开发中应用不多,因为一对一可以创建成一张表。
外键约束:
特点:
从表外键的值是对主表主键的引用。
从表外键类型,必须与主表主键类型一致。
1、truncate table 和delete from 区别?
truncate table:
可以清除数据,而且会重置ID,相当于:靶标摧毁了,又重新创建一张一模一样的表格。
属于DDL语句,不可以结合事务。
delete from:
可以清除数据,单不会重置ID。
属于DML,可以结合事务使用。
2、约束的演示(主外键约束)
概述(作用):
约束是用来保证数据的完整性和安全性的。
分类:
单表约束:
主键约束:primary key //自增长:auto_increment
唯一约束:unique
非空约束:not null
多表约束:
主外键约束:
foreign key
格式:
alter table 数据表A add foreign key (列名) reference 数据表B(列名);
总结:外表的外键列不能出现主表没有的主键没有的内容(数据).
多表查询
交叉查询 :格式:select * from 表A,表B; 结果:表的笛卡尔积。笛卡尔积:每张表的总条数乘积。
连接查询:
内连接查询: 语法:inner join 查询结果:表的交集。
显示内连接查询 格式: select * from 表A inner join 表B on 条件;(优化:inner可以省略。)
隐式内连接查询 格式:select * from 表A ,表B where 条件;
外链接查询
左外链接: 左表的全集+表的交集 格式:select * from 表A left outer join 表B on 条件;(优化:outer可省略)
右外链接: 右表的全集+表的交集 格式:select * from 表A right outer join 表B on 条件;
子查询 : 一个SQL语句的查询条件依赖于另一个SQL语句的查询结果。
in: 任意一个,等于
any:任意一个,任何关系
all:所有的,所有条件。
补:distinct 去重
多对多图解:
5、事务
概述:指的是逻辑上的一组操作,组成该操作的各个逻辑单元,要么全部成功,要么全部失败。
记忆:
MySQL默认开启了事务的自动提交功能,Oracle没有,需要手动开启。
MySQL的默认隔离级别:repeatable read。
// select @@tx_isolation; 查看隔离级别。
//show variables like ‘%commit%‘ ; 查看是否开启了事务的自动提交功能.
set session transaction isolation level ; 指定的隔离级别。
variables
oracle 的默认隔离界别是: read committed
事务的执行特点;
事务的共有四大特性:
1. 原子性: 事务的不可分割,组成事务的各个逻辑单元不可分割。
2. 一致性:事务执行的前后,数据完整性保持一致。
3. 隔离性:事务执行不应该受到其他事务的干扰。
4. 持久性:事务一旦结束,数据就持久化到数据库中。
补:
如果不考虑隔离性,就有可能引发安全问题:
关于读的问题:
脏读: 一个事务读取到了另一个事务还没有提交的数据。
不可重复读:一个事务读取到了另一个事务已经提交的:修改数据,导致多次查询结果不一致。
虚读(幻读):一个事务读取到了另一事务已经提交的;添加数据,导致多次查询结果不一致。
关于写的问题:
丢失更新。
隔离级别的范文从小到大分别是:
read uncommitted < read committed
多表左外链接查询格式:
SELECT *
FROM 表1
LEFT JOIN 表2
ON 表1.关联字段=表2.关联字段
LEFT JOIN 表3
ON (表1/表2).关联字段=表3.关联字段
WHERE 条件