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语句中最重要的就是找表之间的关系,只有搞清楚各种表之间的联系,才不容易出错;
这两句口诀再强调一下:
一对多,两张表,多的表加外键
多对多,三张表,关系表加外键