数据库表关系详解
一、一对多关系
特征:表A的一条记录对应表B的多条记录,表B的一条记录仅对应表A的一条记录
示例:
-
学生表(子表)
| id | name | class_id | |-----|------|----------| |1001| 张三 | 111 | |1002| 张四 | 222 | -
班级表(父表)
| id | name | |-----|---------| |111 | class1 | |222 | class2 |
操作要点:
- 数据添加顺序:先父表(class)后子表(student)
- 数据删除顺序:先子表(student)后父表(class)
- 设计口诀:"一对多,两张表,多的表加外键"
查询案例:查找姓"张"学生的班级信息
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的记录严格一一对应
设计方案:
- 唯一外键法(推荐)
-
学生表:
| id | name | |-----|------| |1001| 张三 | -
学生卡表(添加唯一约束):
| id | name | student_id | |-----|-------|------------| |111 | card1 | 1001 |
-
查询案例:查询张三的学生卡信息
SELECT *
FROM card c
JOIN student s ON c.student_id = s.id
WHERE s.name = '张三'
三、多对多关系
特征:表A与表B的记录可相互对应多条
示例:
-
学生表
| id | name | |-----|------| |1001| 张三 | -
课程表
| id | name | |-----|-------| |111 | Java | -
关系表(核心组件)
| student_id | course_id | |------------|-----------| |1001 |111 |
操作要点:
- 数据添加顺序:先父表(student/course)后关系表
- 数据删除顺序:先关系表后父表
- 设计口诀:"多对多,三张表,关系表加外键"
查询案例:查找姓"张"学生选修的课程
SELECT s.id, s.name, c.name
FROM student s
JOIN student_course_relation scr ON scr.student_id = s.id
JOIN course c ON scr.course_id = c.id
WHERE s.name LIKE '张%'
关键总结
- 关系判断:明确表间关系是编写正确SQL的前提
- 操作顺序:
- 一对多:父表先增后删
- 多对多:关系表最后操作
- 设计口诀:
- 一对多:两张表,多表加外键
- 多对多:三张表,关系表存外键