A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 夕阳下的少年 初级黑马   /  2018-5-9 16:24  /  590 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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 关联条件;

##### 子查询

* 子查询:一个查询语句条件需要依赖另一个查询语句的结果.

## 数据准备



0 个回复

您需要登录后才可以回帖 登录 | 加入黑马