当前位置: 首页 > news >正文

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

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


【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,一个永远在学习中的探索者,关注我,让我们一起进步!

文末标志

相关文章:

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

写在前面: 如果文章对你有帮助,记得点赞关注加收藏一波,利于以后需要的时候复习,多谢支持! 【MySQL数据库学习】系列文章 第一章 《认识与环境搭建》 第二章 《数据类型》 第三章 《数据定义语言DDL》 第四章 《数据操…...

2025.2.14——1400

2025.2.14——1400 A 1400 B 1400 C 1400 D 1400 E 1400 F 1400 G 1400 H 1400 ------------------------------------------------ 思维排序/双指针/二分/队列匹配思维二分/位运算思维数学思维 A 一眼想到的是维护信息计数。维护两个信息同时用长的一半去找短的一半…...

DeepSeek教unity------MessagePack-04

Union 联合 MessagePack for C# 支持序列化接口类型和抽象类类型的对象。它的行为类似于 XmlInclude 或 ProtoInclude。在 MessagePack for C# 中,这些被称为Union。只有接口和抽象类可以被 Union 属性注解。需要唯一的联合键。 /******************************…...

Java异常体系深度解析:从Exception到Error

文章目录 前言一、Java异常体系概览ExceptionError 二、受检异常与非受检异常受检异常(Checked Exception)非受检异常(Unchecked Exception) 三、常见的Error类型四、异常处理机制try-catch-finally结构Throws关键字 五、自定义异…...

【linux】文件与目录命令 - ln

文章目录 1. 基本用法2. 常用参数3. 用法举例4. 注意事项 ln 命令用于在文件系统中创建硬链接或符号链接(软链接),是文件共享和路径引用的常用工具。 1. 基本用法 语法: ln [选项] 源文件 [目标文件/目标目录]功能: 创…...

Xilinx kintex-7系列 FPGA支持PCIe 3.0 吗?

Xilinx kintex-7系列资源如下图 Xilinx各系列的GT资源类型和性能 PCIe Gen1/2/3的传输速率对比 K7上面使用的高速收发器GTX最高速率为12.5GT/s, PCIe Gen2 每个通道的传输速率为 5 GT/s。 PCIe Gen3 每个通道的传输速率为 8 GT/s。 所以理论上硬件支持PCIe3.0&#…...

无人机遥感技术在农业中的具体应用:株数和株高、冠层覆盖度、作物倒伏检测、叶面积指数、病虫害监测、产量估算、空间数据综合制图

近年来,随着无人机技术的飞速发展,其在智慧农业领域的应用越来越广泛。无人机遥感作为一种高效的空间大数据获取手段,能够为农业生产提供多时相、多维度、大面积的农情信息,为实现精准农业和智慧农业提供了有力支持。今天&#xf…...

前端框架React知识回顾

首先,得确定用户的需求,可能是一个准备面试的前端开发者,想要系统复习React相关知识点。接下来要考虑React的核心概念,比如组件、生命周期、Hooks这些肯定是必须的。然后,面试中常问的问题,比如虚拟DOM、状…...

坑多多之ac8257 i2c1 rtc-pcf8563

pcf85163 ordering information Ordering information Package Description Version Marking code PCF85163T/1 SO8 ① SOT96-1 PF85163 PCF85163TS/1 TSSOP8 ② SOT505-1 85163 ①plastic small outline package; 8 leads;body width 3.9 mm ②plastic thin…...

webpack构建流程

文章目录 [TOC](文章目录) 运行流程初始化流程编译构建流程compile编译make 编译模块build module 完成模块编译 输出流程seal输出资源emit输出完成 小结 运行流程 是一个串行的过程,它的工作流程就是将各个插件串联起来 在运行过程中会广播事件,插件只…...

React - 组件之props属性

在 React 中,props(即属性)是组件之间传递数据的一种方式。它是 React 组件的基础,用于将数据从父组件传递到子组件。 一、类组件中 1. props 的作用 数据传递: props 允许父组件向子组件传递数据。子组件可以使用这些数据来渲…...

PMTUD By UDP

通过UDP探测MTU&#xff0c;并实现udp echo server // Description: UDP echo server. // g udp_echo_server.cc -o udp_echo_server #include <iostream> #include <cstring> #include <arpa/inet.h> #include <unistd.h>#define PORT …...

Hutool - BloomFilter:便捷的布隆过滤器实现

1. 布隆过滤器简介 布隆过滤器&#xff08;Bloom Filter&#xff09;是一种空间效率极高的概率型数据结构&#xff0c;用于判断一个元素是否存在于一个集合中。它的优点是空间效率和查询时间都远远超过一般的算法&#xff0c;但缺点是有一定的误判率&#xff0c;即判断元素存在…...

【学习资源】时间序列数据分析方法(1)

时间序列数据分析是一个有趣的话题&#xff0c;让我们多花一些时间来研究。此篇为第一篇文章。主要介绍特征提取方法、深度学习时序数据分析模型、参考资源。期望能帮助大家解决工业领域的相关问题。 1 特征提取方法&#xff1a;信号处理 (来源:INTELLIGENT FAULT DIAGNOSIS A…...

盛铂科技SWFA100捷变频频率综合器:高性能国产射频系统的关键选择

在现代射频系统中&#xff0c;频率综合器是实现精确频率控制和快速跳频的核心组件。盛铂科技推出的SWFA100捷变频频率综合器凭借其卓越的性能和小型化设计&#xff0c;成为高性能射频系统中的理想选择。 SWFA100捷变频频率综合器 高速跳频与宽频覆盖 SWFA100捷变频频率综合器能…...

释放你的元数据:使用 Elasticsearch 的自查询检索器

作者&#xff1a;来自 Elastic Josh Asres 了解如何使用 Elasticsearch 的 “self-quering” 检索器来通过结构化过滤器提高语义搜索的相关性。 在人工智能搜索的世界中&#xff0c;在海量的数据集中高效地找到正确的数据至关重要。传统的基于关键词的搜索在处理涉及自然语言的…...

【快速幂算法】快速幂算法讲解及C语言实现(递归实现和非递归实现,附代码)

快速幂算法 快速幂算法可用分治法实现 不难看出&#xff0c;对任意实数a和非负整数n&#xff0c;有&#xff1a; a n { 1 , n 0 , a ≠ 0 0 , a 0 ( a n 2 ) 2 , n > 0 , n 为偶数 ( a n 2 ) 2 ∗ a , n > 0 , n 为奇数 a^n \begin{cases} 1, & n 0, a\neq 0…...

3. 导入官方dashboard

官方dashboard&#xff1a;https://grafana.com/grafana/dashboards 1. 点击仪表板 - 新建 - 导入 注&#xff1a;有网络的情况想可以使用ID&#xff0c;无网络情况下使用仪表板josn文件 2. 在官方dashboard网页上选择符合你现在数据源的dashboard - 点击进入 3. 下拉网页选…...

怎么理解 Spring Boot 的约定优于配置 ?

在传统的 Spring 开发中&#xff0c;大家可能都有过这样的经历&#xff1a;项目还没开始写几行核心业务代码&#xff0c;就已经在各种配置文件中耗费了大量时间。比如&#xff0c;要配置数据库连接&#xff0c;不仅要在 XML 文件里编写冗长的数据源配置&#xff0c;还要处理事务…...

Dify 是什么?Dify是一个开源的LLM应用开发平台,支持快速搭建生成式AI应用,具有RAG管道、Agent功能、模型集成等特点

首先&#xff0c;Dify是一个开源的LLM应用开发平台&#xff0c;支持快速搭建生成式AI应用&#xff0c;具有RAG管道、Agent功能、模型集成等特点75。根据搜索结果&#xff0c;网页6详细对比了多个RAG和AI开发框架&#xff0c;包括MaxKB、FastGPT、RagFlow、Anything-LLM等。其中…...

vscode里如何用git

打开vs终端执行如下&#xff1a; 1 初始化 Git 仓库&#xff08;如果尚未初始化&#xff09; git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...

突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合

强化学习&#xff08;Reinforcement Learning, RL&#xff09;是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程&#xff0c;然后使用强化学习的Actor-Critic机制&#xff08;中文译作“知行互动”机制&#xff09;&#xff0c;逐步迭代求解…...

Qt Http Server模块功能及架构

Qt Http Server 是 Qt 6.0 中引入的一个新模块&#xff0c;它提供了一个轻量级的 HTTP 服务器实现&#xff0c;主要用于构建基于 HTTP 的应用程序和服务。 功能介绍&#xff1a; 主要功能 HTTP服务器功能&#xff1a; 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...

【AI学习】三、AI算法中的向量

在人工智能&#xff08;AI&#xff09;算法中&#xff0c;向量&#xff08;Vector&#xff09;是一种将现实世界中的数据&#xff08;如图像、文本、音频等&#xff09;转化为计算机可处理的数值型特征表示的工具。它是连接人类认知&#xff08;如语义、视觉特征&#xff09;与…...

select、poll、epoll 与 Reactor 模式

在高并发网络编程领域&#xff0c;高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表&#xff0c;以及基于它们实现的 Reactor 模式&#xff0c;为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。​ 一、I…...

【Oracle】分区表

个人主页&#xff1a;Guiat 归属专栏&#xff1a;Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...

安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)

船舶制造装配管理现状&#xff1a;装配工作依赖人工经验&#xff0c;装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书&#xff0c;但在实际执行中&#xff0c;工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...

嵌入式学习笔记DAY33(网络编程——TCP)

一、网络架构 C/S &#xff08;client/server 客户端/服务器&#xff09;&#xff1a;由客户端和服务器端两个部分组成。客户端通常是用户使用的应用程序&#xff0c;负责提供用户界面和交互逻辑 &#xff0c;接收用户输入&#xff0c;向服务器发送请求&#xff0c;并展示服务…...

JavaScript 数据类型详解

JavaScript 数据类型详解 JavaScript 数据类型分为 原始类型&#xff08;Primitive&#xff09; 和 对象类型&#xff08;Object&#xff09; 两大类&#xff0c;共 8 种&#xff08;ES11&#xff09;&#xff1a; 一、原始类型&#xff08;7种&#xff09; 1. undefined 定…...

腾讯云V3签名

想要接入腾讯云的Api&#xff0c;必然先按其文档计算出所要求的签名。 之前也调用过腾讯云的接口&#xff0c;但总是卡在签名这一步&#xff0c;最后放弃选择SDK&#xff0c;这次终于自己代码实现。 可能腾讯云翻新了接口文档&#xff0c;现在阅读起来&#xff0c;清晰了很多&…...