5、MYSQL-DQL-多表关系

多表查询

一个项目通常需要很多表才能完成。

1. 多表关系

多表之间的关系可以分为:

关系类型 示例场景 实现方式
一对一 一个学生只有一张身份证;一张身份证只能对应一个学生 在任一表中添加唯一外键,指向另一方的主键,以此确保一对一的关联关系
一对多 / 多对一 一个部门有多个员工,一个员工只能对应一个部门 在 "多" 的一方(员工表)建立外键,指向 "一" 的一方(部门表)的主键
多对多 一个学生可选多门课程,一门课程可被多个学生选择 借助第三张中间表实现: 1. 中间表至少包含两个字段; 2. 将多对多拆分为两个一对多关系; 3. 中间表的两个外键分别指向原两张表的主键

1.1 外键约束【foreign key】

1.1.1 添加外键约束(一对多/多对一)

语法格式:

sql 复制代码
方式一:创建表添加外键约束
[contraint <外键名>] foreign key [字段名1,字段名2,...] references <主表名> [主键列1,主键列2,...]

方式二:修改表结构添加外键约束
alter table <表名> add constraint <外键名> foreign key(<列名>) references <主表名>(<列名>)

举例:

sql 复制代码
create database mydb3;
use mydb3;

-- 主表:被其他表的外键引用主键的表(也叫父表);
-- 从表:包含外键、且外键引用其他表主键的表(也叫子表);

-- 创建部门表(主表)
create table if not exists dept (
    deptno varchar(20) primary key, -- 部门号设置主键
    name varchar(20) -- 部门名字
);

--创建员工表(从表)
-- 方式一:创建表添加外键约束
create table if not exists emp (
    eid varchar(20) primary key, -- 员工编号
    ename varchar(20), -- 员工名字
    age int, -- 员工年龄
    dept_id varchar(20), -- 员工所属部门
    constraint emp_fk foreign key(dept_id) references dept(deptno) -- 创建外键
);

--方式二:修改表结构添加外键约束
alter table emp add constraint emp_fk foreign key(dept_id) references dept(deptno);

⚠️:

  • 在添加数据时,必须先给主表添加数据,再添加从表数据。
  • 在删除数据时,如果主表数据被从表依赖,主表的数据不能删除,从表数据可以随意删除。
1.1.2 删除外键约束

语法格式:

sql 复制代码
alter table <表名> drop foreign key <外键约束名>;

举例:

sql 复制代码
alter table emp drop foreign key dept_id_fk;
1.1.3 添加外键约束(多对多)
sql 复制代码
-- 学生表和课程表(多对多)
use mydb3;

-- 1 创建学生表student(左侧主表)
create table if not exists student(
    sid int primary key auto_increment,
    name varchar(20),
    age int,
    gender varchar(20)
);

-- 2 创建课程表course(右侧主表)
create table course(
    cid  int primary key auto_increment,
    cidname varchar(20)
);

-- 3 创建中间表student_course/score(从表)
create table score(
    sid int,
    cid int,
    score double
);

-- 4 建立外键约束(2次)
alter table score add foreign key(sid) references student(sid);
alter table score add foreign key(cid) references course(cid);

-- 5 给学生表添加数据
insert into student values(1,'小龙女',18,'女'),(2,'阿紫',19,'女'),(3,'周芷若',20,'男');

-- 6 给课程表添加数据
insert into course values(1,'语文'),(2,'数学'),(3,'英语');

-- 7 给中间表添加数据
insert into score values(1,1,78),(1,2,75),(2,1,88),(2,3,90),(3,2,80),(3,3,65);
insert into score values(4,1,99); -- 会执行失败,因为 sid=4 的学生在 student 表中不存在,违反了外键约束

⚠️:

  • 在添加数据时,必须先给主表添加数据,再添加从表数据。
  • 在删除数据时,如果主表数据被从表依赖,主表的数据不能删除,从表数据可以随意删除。
相关推荐
吠品1 小时前
CSS图片模糊过渡:一个transition加filter就够
java·数据库·notepad++
梦想不只是梦与想2 小时前
对象存储服务器vs数据库
数据库·对象存储·图片存储
Ivanqhz3 小时前
正余弦位置编码(Sinusoidal Positional Encoding)
java·linux·数据库
Ivanqhz3 小时前
层归一化、残差、前馈网络与激活函数简述
服务器·数据库·人工智能·深度学习·算法
Java后端的Ai之路3 小时前
Python进阶探索23 - Python中的Time与Datetime模块
开发语言·数据库·python·datetime·time
通信瓦工5 小时前
利用浊度和电导率测量确定乙二醇基流体的质量
网络·数据库·ai
小马同学-5 小时前
mysql数据库原理
数据库·mysql
东方护航数据恢复(深圳)5 小时前
政务信创案例:达梦 DM8 数据库掉电页损坏,48 小时修复实录【东方护航数据恢复深圳店】
数据库·数据恢复·it运维·服务器数据恢复·二次开盘·硬盘开盘
AC赳赳老秦6 小时前
OpenClaw 数据引用规范自动生成:为公开数据构建可信来源标注与标准引用体系
大数据·开发语言·汇编·数据库·人工智能·deepseek·openclaw
小蒜学长7 小时前
校园社团招新网站的设计与实现(代码+数据库+LW)
java·数据库·spring boot·后端·校园社团招新网站