【教程】MySQL数据库学习笔记(七)——多表操作(持续更新)

news2025/4/7 14:29:41

文首标志
写在前面:
如果文章对你有帮助,记得点赞关注加收藏一波,利于以后需要的时候复习,多谢支持!


【MySQL数据库学习】系列文章

第一章 《认识与环境搭建》
第二章 《数据类型》
第三章 《数据定义语言DDL》
第四章 《数据操作语言DML》
第五章 《约束》
第六章 《数据查询语言DQL》
第七章 《多表操作》


文章目录

  • 【MySQL数据库学习】系列文章
    • 一、多表关系
      • (一)多表关系概念
      • (二)外键约束
        • 1.一对多关系
        • 2.多对多关系
    • 二、多表联合查询
      • (一)交叉连接查询
      • (二)内连接查询


一、多表关系

(一)多表关系概念

在实际的项目中,往往需要进行处理多表数据,而多表的关系通常可以概括为以下几种。

  • 一对一关系:例如一个学生只有一个身份证号,表现为一张表的一行对应另一张表的一行。但这种关系使用较少,因为通常一对一关系可以合成为一张表。
  • 一对多关系:例如一个部门有着多个员工,表现为一张表的一行对应另一张表的多行。
  • 多对多关系:例如学生和选课之间,一个学生可以选多节课,而一节课也可以被多个学生所选,表现在一张表对应另一张表的多行的同时,另一张表的一行也对应这张表的多行。通常多对多的关系需要中间表将其分割为一对多的关系。

(二)外键约束

外键约束会在表中建立一种关系,这种关系使得从表(子表)中的列(外键)引用主表(父表)中的列(主键或唯一键)。通过这种方式,可以确保子表中的数据在父表中有对应的条目。

这用于确保数据的一致性和完整性,具体而言,则是用于维护表与表之间的关系,确保在一个表中引用的值在另一个表中存在。

外键约束有着以下特点。

  • 主表必须已经存在于数据库,或者是当前正在创建的表。
  • 必须为主表定义主键。
  • 主键不能包含空值,但允许在外键中出现空值。
  • 在主表的表名后面指定列名或列名的组合,而这个列或者列组合必须是主表的主键或者候选键。
  • 外键中列的数目必须和主键中列的数目相同。
  • 外键中列的数据类型必须和主键中列的数据类型相同。

如果想要创建外键约束,有两种方式。

方式1:在创建表时设置外键约束。

CREATE TABLE语句中,通过FOREIGN KEY关键字来指定外键,具体的语法格式如下。

CONSTRAINT 外键名 FOREIGN KEY 字段名1,字段名2,... REFERENCES 主表名 主键列1,主键列2,...

下面是简单的示例。

USE mydb1;

-- 创建主表(部门表)
CREATE TABLE IF NOT EXISTS dept (
    did 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(did) -- 外键约束
);

创建完外键约束后,可以通过模型查看外键约束关系。点击表,选中两个表,右键选择“逆向表到模型”即可查看。
在这里插入图片描述
可以看到,两张表之间的外键约束已经建立。
在这里插入图片描述
除此之外,还有另一种创建外键约束的方式。

方式2:在修改表时设置外键约束。

ALTER TABLE语句中,通过FOREIGN KEY关键字来指定外键,具体的语法格式如下。

ALTER TABLE 表名 ADD CONSTRAINT 外键名 FOREIGN KEY 字段名1,字段名2,... REFERENCES 主表名 主键列1,主键列2,...

下面是简单的示例。

-- 创建主表(部门表)
CREATE TABLE IF NOT EXISTS dept (
    did 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), -- 员工所属部门编号
);

-- 创建外键约束
ALTER TABLE emp ADD CONSTRAINT emp_fk FOREIGN KEY (dept_id) REFERENCES dept(did);
1.一对多关系

为了验证外键约束的作用,首先应该将上面创建的两张空表,进行一对多关系的数据填充。

-- 1.添加主表数据
INSERT INTO dept VALUES ('1001','研发部');
INSERT INTO dept VALUES ('1002','销售部');
INSERT INTO dept VALUES ('1003','财务部');
INSERT INTO dept VALUES ('1004','人事部');

-- 2.添加从表数据
INSERT INTO emp VALUES ('1','刘邦',25,'1001');
INSERT INTO emp VALUES ('2','樊哙',24,'1001');
INSERT INTO emp VALUES ('3','张良',26,'1001');
INSERT INTO emp VALUES ('4','韩信',25,'1002');
INSERT INTO emp VALUES ('5','萧何',27,'1002');
INSERT INTO emp VALUES ('6','曹参',23,'1003');
INSERT INTO emp VALUES ('7','陈平',26,'1003');
INSERT INTO emp VALUES ('8','周勃',28,'1004');

注意,当删除数据的时候,有外键依赖的主表数据是不能删除的,除非先清除从表中依赖主表的外键,否则会报错。但反之,从表中的外键都是可以随意删除的。

而如果希望删除外键约束时,需要在ALTER TABLE语句中使用DROP关键字来删除外键约束。具体语法如下所示。

ALTER TABLE 表名 DROP FOREIGN KEY 外键约束名

简单的实现示例则如下所示。

ALTER TABLE emp DROP FOREIGN KEY emp_fk;

这样就能够删除刚才在上面的示例中在从表emp中创建的emp_fk外键约束。

2.多对多关系

对于多对多关系,比如之前提到的学生和选课的关系,此时学生表和选课表都是主表,而简化其关系的中间表则是从表,其中的外键列依赖于学生表和选课表两个主表。

具体的实现示例如下。

-- 创建学生表(主表)
CREATE TABLE IF NOT EXISTS student (
    sid INT PRIMARY KEY auto_increment, -- 学生编号
    name VARCHAR(20), -- 学生姓名
    age INT, -- 学生年龄
    gender VARCHAR(20) -- 学生性别
);
-- 创建课程表(主表)
CREATE TABLE IF NOT EXISTS course (
    cid INT PRIMARY KEY auto_increment, -- 课程编号
    cname VARCHAR(20) -- 课程名
);
-- 创建中间表(从表)
CREATE TABLE IF NOT EXISTS score (
    sid INT,
		cid INT,
		score DOUBLE
);

-- 创建外键约束
ALTER TABLE score ADD FOREIGN KEY (sid) REFERENCES student(sid);
ALTER TABLE score ADD FOREIGN KEY (cid) REFERENCES course(cid);

-- 学生表数据填充
INSERT INTO student VALUES (1,'刘邦',21,'男'),(2,'吕雉',19,'女'),(3,'项羽',20,'男');
-- 课程表数据填充
INSERT INTO course VALUES (1,'语文'),(2,'数学'),(3,'英语');
-- 中间表数据填充
INSERT INTO score VALUES (1,1,78),(1,2,75),(2,1,88),(2,3,90),(3,2,80),(3,3,65);

查看表的模型即可看到外键约束已创建完毕。
在这里插入图片描述

二、多表联合查询

多表联合查询(也称为联接查询)用于从多个表中检索相关数据,因为在实际项目需要时,可能需要显示的查询结果来自于两个或两个以上的表。

多表查询有以下分类。

  • 交叉连接查询
  • 内连接查询
  • 外连接查询
  • 子查询
  • 表自关联

作为使用的数据,仍然主要沿用上面的部门和员工表示例,只不过不加入外键约束。

CREATE TABLE IF NOT EXISTS dept (
    did 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) -- 员工所属部门编号
);
INSERT INTO dept VALUES
('1001','研发部'),
('1002','销售部'),
('1003','财务部'),
('1004','人事部');
INSERT INTO emp VALUES 
('01','刘邦',25,'1001'),
('02','樊哙',24,'1001'),
('03','张良',26,'1001'),
('04','韩信',25,'1001'),
('05','萧何',27,'1002'),
('06','曹参',23,'1002'),
('07','陈平',26,'1002'),
('08','周勃',28,'1003'),
('09','彭越',27,'1003'),
('10','吕雉',24,'1005');

(一)交叉连接查询

交叉连接(Cross Join) 是 SQL 中的一种连接类型,它返回两个表的笛卡尔积,可以理解为一张表的每一行都和另一张表的任意一行进行匹配(假如A表有m行数据,B表有n行数据,则返回m*n行数据)。笛卡尔积会产生很多冗余的数据,后期的其他查询可以在该集合的基础上进行条件筛选。

其语法格式为以下所示。

SELECT * FROM1,2,...

具体实现示例如下所示。

SELECT * FROM dept,emp;

返回结果如下。
在这里插入图片描述

(二)内连接查询

内连接(INNER JOIN) 是 SQL 中最常用的连接类型之一,用于从两个或多个表中提取符合条件的记录。内连接只返回满足连接条件的记录,实际上是求的两张表的交集,可以将表中的相关数据组合在一起,从而进行更加复杂的查询和分析。

其具体语法格式如下所示。

-- 隐式内连接
SELECT * FROM A表,B表 WHERE 条件; -- 可以理解为从笛卡尔积中筛选出符合条件的值
-- 显式内连接
SELECT * FROM A表 INNER JOIN B表 ON 条件; -- INNER可省略

具体示例如下所示。

-- 查询每个部门的所属员工
SELECT * FROM dept,emp WHERE dept.did = emp.dept_id;
SELECT * FROM dept INNER JOIN emp ON dept.did = emp.dept_id;

-- 查询研发部和销售部的所属员工
SELECT * FROM dept,emp WHERE dept.did = emp.dept_id AND name IN ('研发部','销售部');
SELECT * FROM dept INNER JOIN emp ON dept.did = emp.dept_id AND name IN ('研发部','销售部');

-- 查询每个部门的员工数,并升序排序
SELECT a.name,count(*) FROM dept a JOIN emp b ON a.did = b.dept_id GROUP BY a.did;

-- 查询人数大于3的部门,并按照人数降序排序
SELECT a.name,count(*) AS count FROM dept a JOIN emp b ON a.did = b.dept_id GROUP BY a.did HAVING count >= 3 ORDER BY count DESC;

我是EC,一个永远在学习中的探索者,关注我,让我们一起进步!

文末标志

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2298342.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Word 公式转 CSDN 插件 发布

经过几个月的苦修,这款插件终于面世了。 从Word复制公式到CSDN粘贴,总是出现公式中的文字被单独提出来,而公式作为一个图片被粘贴的情况。公式多了的时候还会导致CSDN禁止进一步的上传公式。 经过对CSDN公式的研究,发现在粘贴公…

【ESP32接入国产大模型之Deepseek】

【ESP32接入国产大模型之Deepseek】 1. Deepseek大模型1.1 了解Deepseek api1.2 Http接口鉴权1.3. 接口参数说明1.3.1 请求体(request)参数1.3.2 模型推理 2. 先决条件2.1 环境配置2.2 所需零件 3. 核心代码3.1 源码分享3.2 源码解析3.3 连续对话修改后的代码代码说明示例输出注…

C语言蓝桥杯1003: [编程入门]密码破译

要将"China"译成密码,译码规律是:用原来字母后面的第4个字母代替原来的字母. 例如,字母"A"后面第4个字母是"E"."E"代替"A"。因此,"China"应译…

SolidWorks速成教程P3-3【零件 | 第三节】——草图绘制面实线与构造线的区别

经过了前面的特征学习后,是不是感觉对 SolidWorks越来越熟悉了?不过发现, SolidWorks速成这套教程,对于一些基础问题,还是需要解释得更详细一些,所以在这节再补充一下草图绘制面&实线与构造线的区别。 目录 1.草图绘制面 2.实线与构造线的区别 1.草图绘制面 之前…

win10中mstsc远程Centos-Stream 9图形化界面

文章目录 1 前置状态2 安装配置XRDP3 关闭SELinux3.1 查看selinux状态3.2 关闭selinux 4 启动XRDP5 Win10远程连接测试 1 前置状态 已安装CentOS9桌面版;Windows10。 2 安装配置XRDP sudo yum install epel-release sudo yum install xrdp sudo yum install tige…

中国AI“拥抱开源”给世界的启示——Anko

事实证明,中国AI企业“拥抱开源”,不仅为自身发展开拓了新路径,也带动AI企业跨国合作的需求,并推动全球AI生态向“开源普惠”转型。Anko通过免费开放部分模型功能,将AI时代的数字红利公平地派发到每一位网民手中&#…

DeepSeek处理自有业务的案例:让AI给你写一份小众编辑器(EverEdit)的语法着色文件

1 DeepSeek处理自有业务的案例:让AI给你写一份小众编辑器(EverEdit)的语法着色文件 1.1 背景 AI能力再强,如果不能在企业的自有业务上产生助益,那基本也是一无是处。将企业的自有业务上传到线上训练,那是脑子进水的做法&#xff…

Jenkins 配置 Git Parameter 四

Jenkins 配置 Git Parameter 四 一、开启 项目参数设置 勾选 This project is parameterised 二、添加 Git Parameter 如果此处不显示 Git Parameter 说明 Jenkins 还没有安装 Git Parameter plugin 插件,请先安装插件 Jenkins 安装插件 三、设置基本参数 点击…

网络工程师 (38)流量和差错控制

一、流量控制 流量控制是一种协调发送站和接收站工作步调的技术。它的主要目的是防止发送端发送数据过快,导致接收端缓冲区溢出,从而造成数据丢失。流量控制机制通过调整发送速率来匹配接收端的处理能力。 基本原理 发送站每发出一帧数据,就进…

从零开始:Django初学者的实战之旅

一、概念引入 要基于编程开发一个完整的企业项目不管什么样的项目,基本都有3种不同的开发模式,这几种开发模式,如果把项目类比成建造房子则有如下: 1.原生开发:类似从0开始造房子,从0开始构建项目&#xf…

青果教务系统逆向(js逆向)

首先我们打开f12检查以下登录函数 可以看到登录函数在checkrand中,直接去全局搜索函数 在这里,打个断点直接跳进去 可以看到参数在这里形成 这是我们发起请求需要的参数,把这几个参数加进去直接登录就行 那就一个一个看呗,第一…

在Linux中Redis不支持lua脚本的处理方法

redis安装在IP为x.x.x.x的服务器上 redis安装 第一步,安装前,检测系统是否安装了redis。若安装了redis,则需要删除redis;若没有安装redis,则需要安装2.6版本以上的redis。 # 确保Redis版本支持Lua脚本。从Redis 2.6…

WPF进阶 | 深入 WPF 依赖项属性:理解其强大功能与应用场景

WPF进阶 | 深入 WPF 依赖项属性:理解其强大功能与应用场景 前言一、依赖项属性基础概念1.1 什么是依赖项属性1.2 依赖项属性与 CLR 属性的区别1.3 依赖项属性的定义与注册 二、依赖项属性的原理深入剖析2.1 依赖项属性系统的工作机制2.2 元数据(Metadata…

关于 IoT DC3 中设备(Device)的理解

在物联网系统中,设备(Device)是一个非常宽泛的概念,它可以指代任何能够接入系统并进行数据交互的实体。包括但不限于手机、电脑、服务器、网关、硬件设备甚至是某些软件程序等所有能接入到该平台的媒介。 内容 定义 目的 示例 …

从 0 开始本地部署 DeepSeek:详细步骤 + 避坑指南 + 构建可视化(安装在D盘)

个人主页:chian-ocean 前言: 随着人工智能技术的迅速发展,大语言模型在各个行业中得到了广泛应用。DeepSeek 作为一个新兴的 AI 公司,凭借其高效的 AI 模型和开源的优势,吸引了越来越多的开发者和企业关注。为了更好地…

Uniapp 获取定位详解:从申请Key到实现定位功能

文章目录 前言一、申请定位所需的 Key1.1 注册高德开发者账号1.2 创建应用1.3 添加 Key 二、在 Uniapp 中配置定位功能2.1 引入高德地图 SDK2.2 获取定位权限 三、实现定位功能3.1 使用 uni.getLocation 获取位置3.2 处理定位失败的情况3.3 持续定位3.4 停止持续定位 四、总结 …

Spring系统学习——持续更新

spring概述 1.轻量级的开源的JAVAEE框架 2.解决企业应用开发的复杂性 3.两大核心 :IOC(控制反转)和AOP(面向切面) 4.Spring特点: 1.方便解耦,简化开发。2.Aop编程支持3.方便程序测试4.方便和其…

QT笔记——QRadioButton

文章目录 1、概要2、实际的应用2.1、创建多个QRadioButton,只可同时选中其中一个,点击后实现对应的槽函数 1、概要 实现QRadioButton相关的应用;2、实际的应用 2.1、创建多个QRadioButton,只可同时选中其中一个,点击后实现对应的槽函数 创建…

微服务面试题:远程调用

🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,精通Java编…

C++17 中的 std::reduce:详细教程

文章目录 1. 简介2. 函数签名3. 使用场景3.1 简单的累加操作3.2 自定义归并操作3.3 并行计算的性能优势 4. 注意事项4.1 归并操作的结合律和交换律4.2 默认值的使用 5. 总结 1. 简介 std::reduce 是 C17 标准库中引入的一个算法,用于对范围内的元素进行归并操作。它…