Java基础学完,继续深耕(0506)SQL--多表关系

多表关系

一对多(多对一)

一对一

多对多

一对多

场景:部门与员工的关系 (一个部门下有多个员工)。

实现:在数据库表中多的一方,添加字段,来关联一的一方的主键。

现在只是在语法上关联了,但是还需要添加外键约束实现真正关联

可以在创建表时 或 表结构创建完成后,为字段添加外键约束。 具体语法如下:

-- 添加外键约束(为 emp 表中的 dept_id 添加外键关联 dept 表中的 id
alter table emp add constraint fk_emp_dept_id foreign key (dept_id) references dept(id);

一对一

案例: 用户 与 身份证信息 的关系

关系: 一对一关系,多用于单表拆分,将一张表的基础字段放在一张表中,其他字段放在另一张表中,以提升操作效率

实现: 在任意一方加入外键,关联另外一方的主键,并且设置外键为唯一的(UNIQUE)

-- ============== 一对一 =====================

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 '用户信息表';
insert into tb_user values (1,'白眉鹰王',1,'18812340001','初中'),
(2,'青翼蝠王',1,'18812340002','大专'),
(3,'金毛狮王',1,'18812340003','初中'),
(4,'紫衫龙王',2,'18812340004','硕士');
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 '用户信息表';
insert into tb_user_card values (1,'汉','1960-11-06','100000100000100001','朝阳区公安局','2000-06-10',null,1),
(2,'汉','1971-11-06','100000100000100002','静安区公安局','2005-06-10','2025-06-10',2),
(3,'汉','1963-11-06','100000100000100003','昌平区公安局','2006-06-10',null,3),
(4,'回','1980-11-06','100000100000100004','海淀区公安局','2008-06-10','2028-06-10',4);

多对多

案例: 学生 与 课程的关系

关系: 一个学生可以选修多门课程,一门课程也可以供多个学生选择

实现: 建立第三张中间表,中间表至少包含两个外键,分别关联两方主键

-- ============== 多对多 ==================

create table tb_student(

id int auto_increment primary key comment '主键ID',

name varchar(10) comment '姓名',

no varchar(10) comment '学号'
) comment '学生表';
insert into tb_student(name, no) values ('黛绮丝', '2000100101'),('谢逊', '2000100102'),('殷天正', '2000100103'),('韦一笑', '2000100104');
create table tb_course(

id int auto_increment primary key comment '主键ID',

name varchar(10) comment '课程名称'
) comment '课程表';
insert into tb_course (name) values ('Java'), ('PHP'), ('MySQL') , ('Hadoop');
create table tb_student_course(

id int auto_increment comment '主键' primary key,

student_id int not null comment '学生ID',

course_id int not null comment '课程ID',

constraint fk_courseid foreign key (course_id) references tb_course (id),
constraint fk_studentid foreign key (student_id) references tb_student (id)
)comment '学生课程中间表';

相关推荐
数字新视界2 分钟前
动环监控可视化在数据中心管理中的应用与实践解析
数据库·物联网·解决方案·动环监控·大榕树
极地野狼 音乐哔哔5 分钟前
数据库备份恢复的原理实践
数据库
互联网中的一颗神经元33 分钟前
小白python入门 - 25. SQL 与表设计入门
数据库·python·sql
ttwuai36 分钟前
AI 生成后台改数据后,操作日志别只记按钮:Go + MySQL 怎么验
数据库·人工智能·mysql·golang
KaMeidebaby1 小时前
卡梅德生物技术快报 | 核酸适配体文库测序:核酸适配体文库测序的技术原理、实验流程与数据解析
前端·网络·数据库·人工智能·算法
ClouGence1 小时前
除了 DBeaver,2026 年还有哪些好用的开源数据库管理工具?
数据库·开源
景芯SoC芯片实战2 小时前
12nm工艺下,6T-Turbo Cell的Filler到底该怎么插?
数据库·数字ic·dft·soc后端
韩楚风2 小时前
【参天引擎】一次宕机后的数据恢复,让我把 Cantian 持久化与恢复的六大机制全搞明白了
服务器·网络·数据库·分布式·mysql·架构·cantian
寒月小酒2 小时前
第五章 生成集成 和第六章 RAG评估(all-in-rag学习)
数据库·学习
AI人工智能集结号3 小时前
AI回答采集:基于PostgreSQL JSONB的原始数据存储与可追溯性方案
数据库·人工智能·postgresql