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

文末标志

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

国自然地区基金|影像组学联合病理组学预测进展期胃癌术后预后的研究|基金申请·25-02-13

小罗碎碎念 今天和大家分享一个国自然地区科学项目,执行年限为2020.01~2023.12,直接费用为34万元。 胃癌在我国发病形势严峻,现有TNM分期预后评估存在局限,难以满足精准医疗需求。本项目运用“医工结合,学科…

nvm下载安装教程(node.js 下载安装教程)

前言 nvm 官网地址:https://nvm.uihtm.com nvm 是一个 node.js 的版本管理工具,相比于仅安装 node.js,我们可以使用 nvm 直接下载或卸载 node.js,可以同时安装多个 node.js 版本,并动态的切换本地环境中的 node.js 环…

项目BUG

项目BUG 前言 我创作这篇博客的目的是记录学习技术过程中的笔记。希望通过分享自己的学习经历,能够帮助到那些对相关领域感兴趣或者正在学习的人们。 项目BUG 1.低频率信号(100k或 200K以下)可以直接用一根导线焊接出几根导线来分几路,高频率信号只能…

Apollo 9.0 速度动态规划决策算法 – path time heuristic optimizer

文章目录 1. 动态规划2. 采样3. 代价函数3.1 障碍物代价3.2 距离终点代价3.3 速度代价3.4 加速度代价3.5 jerk代价 4. 回溯 这一章将来讲解速度决策算法,也就是SPEED_HEURISTIC_OPTIMIZER task里面的内容。Apollo 9.0使用动态规划算法进行速度决策,从类名…

吴恩达深度学习——词嵌入

内容来自https://www.bilibili.com/video/BV1FT4y1E74V,仅为本人学习所用。 文章目录 词表特征词嵌入的类比推理嵌入矩阵词嵌入Word2Vec跳字模型模型细节负采样 GloVe词向量(了解) 情绪分类 词表特征 使用 one-hot 对词汇进行编码时&#x…

数据结构——Makefile、算法、排序(2025.2.13)

目录 一、Makefile 1.功能 2.基本语法和相关操作 (1)创建Makefile文件 (2)编译规则 (3)编译 (4)变量 ①系统变量 ②自定义变量 二、 算法 1.定义 2.算法的设计 &#xff…

达梦:TPCC 压测

目录 造数1. 脚本启动2. 检查数据库信息3. 删除旧用户和表空间4. 创建新的表空间5. 创建用户和表6. 数据加载7. 创建索引8. 创建存储过程和序列9. 检查数据空间使用情况10. 启用表的快速访问池11. 数据加载完成总结 压测1. 脚本启动2. 检查数据表空间3. 设置表的快速池标志4. 检…

2024 StoryDiffusion 文字/文字+图像----->视频

基于扩散模型的生成模型在生成长序列图像和视频时面临内容一致性的重大挑战,尤其是涉及复杂主题和细节的场景中,角色身份、服饰风格等元素难以保持连贯。传统方法通常依赖潜在空间的运动预测,但长视频生成时易出现不稳定性。针对这些问题&…

在带有Intel Arc GPU的Windows上安装IPEX-LLM

在带有Intel Arc GPU的Windows上安装IPEX-LLM 在带有Intel Arc GPU的Windows上安装IPEX-LLM先决条件安装 GPU 驱动安装 Visual Studio 2022 社区版安装 Intel oneAPI Base Toolkit安装 IPEX-LLM创建虚拟环境环境验证 可能遇到的问题 在带有Intel Arc GPU的Windows上安装IPEX-LL…

流程控制(if—elif—else,while , for ... in ...)

1. 流程控制 流程:计算机执行代码的顺序 流程控制:对计算机执行代码的顺序的管理 2. 流程控制分类 流程控制分类: 顺序流程:自上而下的执行结构,即 Python 默认流程 选择/分支流程:根据某一步的判断&am…

SpringBoot实战:高效获取视频资源

文章目录 前言技术实现SpringBoot项目构建产品选取配置数据采集 号外号外 前言 在短视频行业高速发展的背景下,海量内容数据日益增长,每天都有新的视频、评论、点赞、分享等数据涌现。如何高效、精准地获取并处理这些庞大的数据,已成为各大平…

SSL域名证书怎么申请?

在数字化时代,网络安全已成为企业和个人不可忽视的重要议题。SSL(Secure Sockets Layer,安全套接层)域名证书,作为保障网站数据传输安全的关键工具,其重要性日益凸显。 一、SSL域名证书:网络安…

用大模型学大模型04-模型与网络

目前已经学完深度学习的数学基础,开始学习各种 模型和网络阶段,给出一个从简单到入门的,层层递进的学习路线。并给出学习每种模型需要的前置知识。增加注意力机制,bert, 大模型,gpt, transformer, MOE等流行…

DeepSeek4j 已开源,支持思维链,自定义参数,Spring Boot Starter 轻松集成,快速入门!建议收藏

DeepSeek4j Spring Boot Starter 快速入门 简介 DeepSeek4j 是一个专为 Spring Boot 设计的 AI 能力集成启动器,可快速接入 DeepSeek 大模型服务。通过简洁的配置和易用的 API,开发者可轻松实现对话交互功能。 环境要求 JDK 8Spring Boot 2.7Maven/Gr…

graphRAG的原理及代码实战(2)基本原理介绍(中)

graphRAG-结果解读 1、简介 前文中,graphRAG项目index索引建立完成后,会生成7个parquet文件。 为什么用 Parquet 格式保存知识图谱? 高效存储: 知识图谱中的数据通常是结构化的,包含大量的实体、关系、嵌入等。Parq…

TLQ-CN10.0.2.0 (TongLINK/Q-CN 集群)部署指引 (by lqw)

文章目录 安装准备虚拟机部署部署zk集群安装zk集群启动zk集群初始化元数据(zk)关闭zk集群 部署BookKeeper集群安装BookKeeper集群初始化元数据(bk)启动BookKeeper停止 BookKeeper 部署Brokers集群安装Brokers集群启动 broker停止 …

深入剖析推理模型:从DeepSeek R1看LLM推理能力构建与优化

著名 AI 研究者和博主 Sebastian Raschka 又更新博客了。原文地址:https://sebastianraschka.com/blog/2025/understanding-reasoning-llms.html。这一次,他将立足于 DeepSeek 技术报告,介绍用于构建推理模型的四种主要方法,也就是…

【Sceneform-EQR】实现3D场景背景颜色的定制化(背景融合的方式、Filament材质定制)

写在前面的话 Sceneform-EQR是基于(filament)扩展的一个用于安卓端的渲染引擎。故本文内容对Sceneform-EQR与Filament都适用。 需求场景 在使用Filament加载三维场景的过程中,一个3D场景对应加载一个背景纹理。而这样的话,即便…

Visual Studio 2022在配置远程调试服务器时无法连接到OpenEuler24.03

表现为在VS中为OpenEuler24.03创建远程服务器时,界面上直接报主机密钥算法失败,或直接提示无法连接到服务器,导致无法创建远程服务器。 经查询日志发现一些蛛丝马迹 09:25:15.2035105 [Info, Thread 53] liblinux.Local.Services.WslEnumer…

常用架构图:业务架构、产品架构、系统架构、数据架构、技术架构、应用架构、功能架构及信息架构

文章目录 引言常见的架构图I 业务架构图-案例模块功能说明1. 用户界面层 (UI)2. 应用服务层3. 数据管理层4. 基础设施层业务流程图示例技术实现II 功能架构图 -案例功能模块说明1. 船舶监控模块2. 报警管理模块3. 应急响应模块4. 通信管理模块5. 数据分析模块数据管理层基础设施…