mysql表关系(一对一、一对多、多对多)详解

mysql表关系(一对一、一对多、多对多)详解

引言

在开发的过程中,我们需要用到的表会非常多,以下是我针对一对一、一对多、多对多的理解。

一、一对一

比如:
先创建两张表,如下:
表一:person表
在这里插入图片描述
表二:identity表
在这里插入图片描述
从上表很明确看出,一个人只能对应一个身份证,一个身份证它也只能对应一个人。
查询案例:查询小白的身份证

SELECT
	p.id,
	p.`name`,
	i.identity_card 
FROM
	person p
	JOIN identity i ON p.identity_id = i.id 
WHERE
	p.`name` = "小白";

查询出来的结果
在这里插入图片描述

二、一对多

一对多是最基础的表间关系,意思是一张表A中的一条记录可以对应另一张表B中的多条记录,另一张表B中的一条记录只能对应一张表A中的一条记录

举个一对多的例子:

有两张表,

表A:学生表student(子表)

在这里插入图片描述

表B:班级表class(父表)

在这里插入图片描述

一个班级对应多个学生,一个学生只能对应一个班级,所以这两个表的关系也就很明确了:

班级表中的一条记录可以对应学生表的多条数据,学生表中的一条记录只能对应班级表的一条数据;

查询案例:查询所有姓小的学生的id,name和所在班级name

SELECT 
	s.id,s.name,c.name as className
FROM 
	student s
JOIN 
	class c 
ON 
	s.class_id=c.id
WHERE 
	s.name LIKE '小%'

查询结果
在这里插入图片描述

三、多对多

多对多的意思是:一张表A中的一条记录可以对应另一张表B中的多条记录,另一张表B中的一条记录也可以对应一张表A中的多条记录

比如:

学生表student:

在这里插入图片描述

课程表course:
在这里插入图片描述

这两张表就是多对多的关系,因为一个学生可以选择多门课程,一门课程可以被多个学生选择;

那么这样不论给哪个表添加外键都不行,这时就需要额外创建一个关系表来存放这两张表的id键值:

学生课程关系表student_course_relation(关系表):

在这里插入图片描述

这样就可以分开来看了:

学生表和关系表就是一对多的关系,课程表和关系表也是一对多的关系

查询案例:查询所有姓小的学生的id、name和所选课程的name

SELECT 
	s.id, s.name, c.name as book
FROM
	student s
JOIN 
	student_course_relation scr
ON 
	scr.studnet_id=s.id
JOIN 
	course c
ON 
	scr.course_id=c.id
WHERE
	s.name LIKE '小%'

查询结果:
在这里插入图片描述
在多对多设计表时,可以遵循以下口诀:

多对多,三张表,关系表加外键

意思就是当存在多对多的关系时,需要涉及到第三张表关系表的设计,而关系表就是存放了存在多对多关系的两张表的外键;

总结
在写sql语句中最重要的就是找表之间的关系,只有搞清楚各种表之间的联系,才不容易出错;

这两句口诀再强调一下:

一对多,两张表,多的表加外键
多对多,三张表,关系表加外键

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值