MySQL—多表查询—多表关系介绍

一、引言

  提到查询,我们想到之前学习的单表查询(DQL语句)。而这一章节部分的博客我们将要去学习和了解多表查询。

对于多表查询,主要从以下7个方面进行学习。

(1)第一部分:介绍

1、多表关系

2、多表查询的概念以及多表查询的分类

(2)第二部分:然后接下来针对于多表查询所涉及到的

3、内连接

4、外连接

5、自连接

6、子查询

(3)第三部分:讲解完之后再通过一个多表查询的案例,对多表查询的语法进行巩固和加强

7、多表查询案例

二、多表关系

  • 概述

  在项目开发中,在进行数据库表结构设计时,会根据业务需求及业务模块之间的关系,分析并设计表结构。由于业务之间相互关联(错综复杂),所以我们所设计出来的各个表结构之间也存在着各种各样的联系。而这种联系基本上分为三种:

1、一对多(多对一)

2、多对多

3、一对一

这三种联系代表了什么含义?以及在数据库层面怎么去体现这些联系或者关系呢?下面将会详细的介绍这三种多表关系。

(1)一对多(多对一)

比较典型的案例:部门与员工的关系

关系:一个部门下可以对应着多个员工,而一个员工对应一个部门

问题:在员工和部门的关系中,其中谁是 '多' 的一方呢?谁又是 '一' 的一方?

结论:部门是 '一' 的一方,而员工表是 '多' 的一方

实现方法

在这种一对多的关系中,在数据库层面,我们要体现出这种关系。

通常是:在'多'的一方建立一个外键,这个外键来关联 '一' 的一方的主键。

这个案例之前在外键约束的案例就演示过了。

(2)多对多

比较典型的案例:学生与课程之间的关系

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

问题:那么我们如何来维护他们之间的 '多对多' 的关系呢?

实现方法

此时需要建立第三张表。建立第三张中间表,其中中间表至少要包含两个外键,分别关联两方的主键。

接下来去到工具 DataGrip 对这个案例进行实操。

1、三张表的结构创建、以及插入数据

学生表:student

CREATE TABLE student (
    id INT AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID',
    name VARCHAR(10) COMMENT '姓名',
    no VARCHAR(10) COMMENT '学号'
) COMMENT '学生表';
INSERT INTO student (id, name, no) VALUES (null,'黛绮丝','2000100101'),
                                          (null,'谢逊','2000100102'),
                                          (null,'阳俊毅','2000100103'),
                                          (null,'韦一敏','2000100104');

课程表:course

CREATE TABLE course (
    id INT AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID',
    name VARCHAR(10) COMMENT '课程名称'

) COMMENT '课程表';
INSERT INTO course(id, name) VALUES (null,'Java'),
                                    (null,'PHP'),
                                    (null,'MySQL'),
                                    (null,'C++');

目前两张表还未建立任何的关联。他们之间是多对多的关系,所以我们要再建立一张中间表去维护他们之间的关系,下面进行创建。

2、续集第一部操作
CREATE TABLE 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_course_id FOREIGN KEY (course_id) REFERENCES course(id),
    CONSTRAINT fk_student_id FOREIGN KEY (student_id) REFERENCES student(id)
) COMMENT '学生课程中间表';

INSERT INTO student_course(ID, STUDENT_ID, COURSE_ID) VALUES (null,1,1),
                                                             (null,1,2),
                                                             (null,1,3),
                                                             (null,2,2),
                                                             (null,2,3),
                                                             (null,3,4);

查看表

这就是多对多的关系在数据库层面的体现,通过中间表来维护。

3、此时我们可以通过工具 DataGrip 直接可视化界面的形式展示三个表之间的多表关系

(3) 一对一

比较典型的案例:用户与用户详情的关系

关系:一对一关系,经常用于单表拆分。

将一张表的基础字段放在一张表中,其他详情字段放在另一张表中,以提升操作效率。

比如下面有张表用户表:

问题:这张表的数据虽然很全,但是因为数据信息比较庞大,我们要根据有些业务场景中需求进行一些拆分。就比如有时候我们只需要查询用户的一些基本信息?在某些场景下我们又需要查询用户的受教育的信息?还有如何维护拆分之后的两张表的关系?

实现方法:此时,我们就可以将这个表进行拆分。把基础的用户字段放在一张表中,把用户受教育的信息放在另外一张表中。拆分了之后,我们还得考虑其它情况。比如如何继续维护这两张表的关系。在任意的一张表加入一个外键,去关联另一张表的主键就可以了。

也就是注意:

  在任意一方加入外键,关联另外一方的主键,并且设置外键为唯一的(UNIQUE)。这个又好像和一对多比较像,所以此时为了限定它们之间是一对一的关系,则需要在外键上再添加一个唯一约束,也就意味着教育信息的一条记录只能对应着一个用户。从而保证它们是一对一的关系

接下来去到工具 DataGrip 对这个案例进行实操。

1、创建两张表的结构

 

2、插入数据 

用户基本表

教育信息表

所以一条教育信息,对应一个用户

这篇博客的内容就到这里了。

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

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

相关文章

记录layui-table中操作列的宽度随着权限变化而变化

最近做一个项目,某个页面因为角色不同,所以显示的的按钮有所不同。 管理员权限 普通人员权限 layui引入的table宽度是写死的,不能随着自动变化,查了一些资料,让写入css的方法 .layui-table th, .layui-table td { whi…

智能楼宇安防3D数据可视化平台满足日益增长的安防需求

在当今社会,安全是每个人和企业最为关心的问题。为满足日益增长的安防需求,3D可视化公司深圳华锐视点隆重推出安防平台3D可视化管理系统,以先进的三维技术为您的安全保驾护航。 安防平台3D可视化管理系统通过创新的三维可视化技术&#xff0c…

优化你的WordPress网站:内链建设与Link Whisper Pro插件的利用

文章目录 内链的重要性WordPress SEO插件:Link Whisper Pro主要功能使用指南下载与安装 结语 在数字营销和网站管理领域,SEO内部优化是提升网站排名、增加流量和提高用户参与度的核心策略。在众多SEO技巧中,内链建设是构建良好网站结构和提升…

Glide支持通过url加载本地图标

序言 glide可以在load的时候传入一个资源id来加载本地图标,但是在开发过程中。还得区分数据类型来分别处理。这样的使用成本比较大。希望通过自定义ModelLoader实现通过自定义的url来加载Drawab。降低使用成本 实现 一共四个类 类名作用GlideIcon通过自定义url的…

轻松搭建AI应用的三个大模型技术路线

时下聊起AI,想必最热的就是使用AI的应用(chatGPT,文心一言等)来提升自己工作的效率,比如破局俱乐部,洋哥带领星球2万多人开启大航海,教人使用这一波新起的应用进行赚钱与赋能。 在我的视角来看…

PS系统教程11

HUD拾色器 作用:它可以帮助使用者更加高效地选择和使用颜色,从而提高工作效率和设计质量。 先确定色相值改变饱和度改变亮度使用HUD拾色器选中画笔工具画笔模式-正常shiftAlt右键 色相轮 上下移动从黑到白亮度变化左右移动从浅到深饱和度的变化选中颜…

探索 Adobe Illustrator 2023 (AI 2023) for Mac/Win——创意设计的强大工具

Adobe Illustrator 2023 (AI 2023) for Mac/Win 是一款在设计领域备受推崇的专业矢量图形编辑软件软件,为设计师们提供了无尽的创意可能性。 它具有强大而精确的绘图功能,让用户能够轻松绘制出各种复杂的图形、线条和形状。无论是简洁的图标设计还是精美…

不服就干!FEAST微生物溯源:一场微生物“寻根究底”的浪漫之旅

微生物一直处于不断变化的状态,估计不同源微生物群落(source,“源”)对特定微生物群落(sink,“汇”)的贡献或混合比例被称为微生物溯源(MST)问题。了解样本中这些生物体来自何处以及如何形成群落…

机器学习之数学基础(六)~时间复杂度和空间复杂度

目录 算法背景 background 1. 时间复杂度 Time Complexity 1.1 时间复杂度分类 1.1.1 O(1) 常数阶 1.1.2 O(n) 线性阶 1.1.3 O(n^2) 平方阶 1.1.4 O(logn) 对数阶 1.1.5 O(nlogn) 线性对数阶 1.1.6 O(2^n) 指数阶 1.1.7 O(n!) 阶乘阶 1.1.8 时间复杂度分类 1.2 时…

记录Nuxt 3 官网项目的一次部署

本来以为就是一次简单的部署,之前也是部署过几次nuxt项目了,所以,并没有要记录的想法。但是过程出现了很多问题,最后考虑还是写下来吧。留个记录(完整的配置部署过程) 这里我将要说明两种部署方式以供选择&…

electron-Vue: Module parse failed: Unexpected character ‘ ‘

​ electron-Vue项目中,我自己写了一个node的C扩展(xx.node),然后在.vue文件里import它,然后运行npm run electron:serve,报错如下: ​​ electron-Vue打包默认使用webpack,默认情况下webpack没…

Vue2.0项目搭建流程(一步一步教你如何初始化一个前端项目)

文章目录 1.环境准备2.项目初始化3.删除不必要的初始化文件 1.环境准备 1.winr在cmd终端界面输入node -v,检测node环境是否安装成功 2.cmd终端界面输入vue -V,检测前端脚手架vue/cli是否安装成功 没有显示则终端输入以下指令 //以下内容三选一 cnpm …

vue的elementUI的el-tree的选择

有一棵树型的数据,需要实现:在外部加一个 全选和不全选的按钮,去全部勾选树结构里面每一项的选框。 当点击勾选全选的时候,树的每一项都勾选; 当取消全选的时候,树的每一项都不勾选; 当选树的其中一项时,全选按钮是半选状态; 实现效果如下: <template><…

骨传导耳机哪个牌子好?精选5大品质上乘的尖货骨传导耳机推荐!

作为一名数码博主&#xff0c;我已有十余年的行业经历&#xff0c;其中&#xff0c;骨传导耳机作为近年来新兴的技术产品&#xff0c;凭借特殊的传声方式和佩戴方式吸引到了不少消费者&#xff0c;我也是亲自体验并评测了数十款。基于这些经验&#xff0c;我深感有必要提醒大家…

玩转Matlab-Simscape(初级)- 09 - 在Simulink中创建曲柄滑块机构的控制模型

** 玩转Matlab-Simscape&#xff08;初级&#xff09;- 09 - 在Simulink中创建曲柄滑块机构的控制模型 ** 目录 玩转Matlab-Simscape&#xff08;初级&#xff09;- 09 - 在Simulink中创建曲柄滑块机构的控制模型 前言一、问题描述二、创建模型2.1 识别机构中的刚体2.2 确定刚…

标准发布 | 反渗透和纳滤水处理膜修复再利用技术指南

一、编制单位 本文件由浙江大学、中华环保联合会水环境治理专业委员会提出。 本文件由中华环保联合会归口。 本文件主编单位&#xff1a;浙江大学、河南一膜环保技术有限公司、安徽精高水处理有限公司、国能龙源环保有限公司、湖南沁森高科新材料有限公司。 本文件参编单位&…

C++ | Leetcode C++题解之第119题杨辉三角II

题目&#xff1a; 题解&#xff1a; class Solution { public:vector<int> getRow(int rowIndex) {vector<int> row(rowIndex 1);row[0] 1;for (int i 1; i < rowIndex; i) {row[i] 1LL * row[i - 1] * (rowIndex - i 1) / i;}return row;} };

简搭云可视化大屏设计器:前端技术探索与实践

一、引言 随着数字化时代的到来&#xff0c;数据可视化已经成为企业决策和业务分析不可或缺的一部分。为了满足用户对于数据展示的直观性、便捷性和高效性需求&#xff0c;简搭云可视化大屏设计器应运而生。本文旨在探讨简搭云可视化大屏设计器的前端技术实现&#xff0c;并通…

店匠科技亮相VivaTech,新零售解决方案引关注

在中法建交60周年之际,两国关系持续发展并共同推动双方在人工智能和全球治理领域达成重要合作。同时,浙江-法国高新产业创新合作对接会在巴黎顺利举行,进一步促进了中法两国在高新技术领域的交流与合作。 紧跟此次访问的步伐,众多中国科技创新企业齐聚巴黎,于5月22日至25日在法…

计算机SCI期刊,中科院3区,专业性强,审稿专业

一、期刊名称 Frontiers in Neurorobotics 二、期刊简介概况 期刊类型&#xff1a;SCI 学科领域&#xff1a;计算机科学 影响因子&#xff1a;3.1 中科院分区&#xff1a;3区 三、期刊征稿范围 神经机器人前沿在体现自主系统的科学和技术及其应用方面发表了严格的同行评审…