关于Mysql的多表操作
表与表的关系
通常来说我们根据业务要求及其业务模块之间的关系,分析并设计表结构,由于业务之间相互关联,所以我们将表与表的关系分为三类
- 一对一
- 一对多
- 多对多
物理外键和逻辑外键
物理外键是值使用foreign key作为外键关联另一张表的字段的连接方法
物理外键删除一条信息,如果不把外键关联的信息同步删除,数据库操作会进行报错
逻辑外键删除一条信息,对应的信息可以不删除,保留,也不会报错
-
物理外键:强调数据完整性,操作中性能消耗比较大,小数据库量推荐
-
逻辑外键:不强制对应信息,只是在代码中体现,如果代码质量不完整,删除导致的垃圾数据会越来越多,大数据库量推荐
表与表的关系实现
1.一对一
通常指的是单表对应单表
是一种特殊的一对多,我们可以在任意一方表中添加外键
SQL脚本
-- 用户基本信息表
create table tb_user(
id int unsigned primary key auto_increment comment 'ID',
name varchar(10) not null comment '姓名',
gender tinyint unsigned not null comment '性别, 1 男 2 女',
phone char(11) comment '手机号',
degree varchar(10) comment '学历'
) comment '用户基本信息表';
-- 用户身份信息表
create table tb_user_card(
id int unsigned primary key auto_increment comment 'ID',
nationality varchar(10) not null comment '民族',
birthday date not null comment '生日',
idcard char(18) not null comment '身份证号',
issued varchar(20) not null comment '签发机关',
expire_begin date not null comment '有效期限-开始',
expire_end date comment '有效期限-结束',
user_id int unsigned not null unique comment '用户ID',
constraint fk_user_id foreign key (user_id) references tb_user(id)
) comment '用户身份信息表';
注意:在任意的一表加入外键,关联另外一表的主键,并且设置外键为唯一的 unique
2.一对多
列如一个人对应一个部门,而一个部门有很多个人,人与部门就构成了一对多的关系
- 具体实现
在一对多的表设计中,我们通常将对应 多的那张表设置外键关联另一张表的主键
3.多对多
列如一个学生有多个老师,一个老师有多个学生,n:m对应
- 具体实现
在多对多的表设计中我们我们通常会建立第三张表,中间表至少包含两个外键,分别关联两张表主键
多表查询
多表查询是指从多张表中获取所需数据
- 笛卡尔积
select * from 表1,表2;
如果我们这样查询,将会看到两表内的数据会自由组合。这种现象被称为笛卡尔积
指的是两个集合的所有组合情况
内连接
隐式内连接语法
select 字段 from 表1,表2 where 连接条件
显式内连接语法
select 字段 from 表1 join 表2 on 连接条件
注意
在多表查询的时候,如果两表有冲突相同的表名,我们通常会在字段名前面加上表名,来指定字段
外连接
外连接分为左外连接和右外连接
左外连接语法:(查询左表所有数据,包括表1和表2交集部分)
select 字段列表 from 表1 left join 表2 on 连接条件 ... ;
右外连接语法:(查询右表所有数据,包含表1和表2交集部分)
select 字段列表 from 表1 right join 表2 on 连接条件 ... ;
子查询
指的是select语句的嵌套查询,又称为子查询
SELECT * FROM t1 WHERE column1 = ( SELECT column1 FROM t2 ... );
子查询可以书写的位置
- where后
- from后(作为临时表)
- select后