MySQL多表&事务
# 多表设计之外键约束
##约束
###约束的作用
约束是用来保证数据的完整性.
##### 单表约束
* 主键约束
* 唯一约束
* 非空约束
##### 多表约束
* 外键约束: 用来保证数据完整性(多表之间).
#### 演示外键约束作用
```
create table dept(
did int primary key auto_increment,
dname varchar(20)
);
insert into dept values (null,'市场部');
insert into dept values (null,'人事部');
insert into dept values (null,'教研部');
```
#### 创建一个员工表
```
sex varchar(10),
dno int
);
insert into employee values (null,'张三',8000,'1988-09-01','男',3);
insert into employee values (null,'李四',9000,'1988-09-01','男',1);
insert into employee values (null,'王五',6000,'1988-09-01','男',2);
insert into employee values (null,'赵六',10000,'1988-09-01','男',3);
insert into employee values (null,'孙七',10000,'1988-09-01','男',1);
```
#### 删除其中的某个部门(是否可以)
* 查看数据
* select * from dept;
* 向员工表中插入一条记录
* insert into
employee values (nul , '田八' , 10000 , '1988-09-01 ' , '男' , null);
* 删除一个人事部
* delete from dept where did =2;
```
向刚才做的这两个操作(插入一个没有部门的员工,删除一个带有员工的部门)。这种情况都是不应该发生。这个时候需要在多表之间添加外键约束。
```
#### 添加外键约束
##### 在员工表上添加外键
```
alter table employee add foreign key (dno) references dept(did);
```
##### 设置外键为非控
```
alter table employee modify dno int not null;
```
## 表关系的介绍
#### 表与表之间的关系
##### 一对多的关系
- 一对多的例子
- 一个部门下可以有多个员工,一个员工只能属于某一个部门.
##### 多对多的关系
- 多对多的例子:
- 一个学生可以选择多门课程,一门课程可以被多个学生选择.
##### 一对一的关系
* 一对一的例子:
* 一个公司可以有一个注册地址,一个注册地址只能多一个公司.
## 多表分析及创建
#### 多表的分析
##### 需求
```
完成一个学校的选课系统,在选课系统中包含班级,学生和课程这些实体。
```
* 班级和学生之间是有关系存在:
* 一个班级下包含多个学生,一个学生只能属于某一个班级(一对多的关系)。
* 学生和课程之间是有关系存在:
* 一个学生可以选择多门课程,一门课程也可以被多个学生所选择(多对多的关系)。
## 多表查询的概述
#### 多表查询的分类
##### 连接查询
* 交叉连接:cross join
* 交叉连接: 查询到的是两个表的笛卡尔积.
* 语法:
* 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 关联条件;
##### 子查询
* 子查询:一个查询语句条件需要依赖另一个查询语句的结果.
## 数据准备
|
|