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

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、插入数据 

用户基本表

教育信息表

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

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

相关文章:

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

一、引言 提到查询,我们想到之前学习的单表查询(DQL语句)。而这一章节部分的博客我们将要去学习和了解多表查询。 对于多表查询,主要从以下7个方面进行学习。 (1)第一部分:介绍 1、多表关系 2、…...

Vue基础篇--table的封装

1、 在components文件夹中新建一个ITable的vue文件 <template><div class"tl-rl"><template :table"table"><el-tablev-loading"table.loading":show-summary"table.hasShowSummary":summary-method"table…...

mysql中optimizer trace的作用

大家好。对于MySQL 5.6以及之前的版本来说&#xff0c;查询优化器就像是一个黑盒子一样&#xff0c;我们只能通过EXPLAIN语句查看到最后 优化器决定使用的执行计划&#xff0c;却无法知道它为什么做这个决策。于是在MySQL5.6以及之后的版本中&#xff0c;MySQL新增了一个optimi…...

实习面试题(答案自敲)、

1、为什么要重写equals方法&#xff0c;为什么重写了equals方法后&#xff0c;就必须重写hashcode方法&#xff0c;为什么要有hashcode方法&#xff0c;你能介绍一下hashcode方法吗&#xff1f; equals方法默认是比较内存地址&#xff1b;为了实现内容比较&#xff0c;我们需要…...

二叉树讲解

目录 前言 二叉树的遍历 层序遍历 队列的代码 queuepush和queuepushbujia的区别 判断二叉树是否是完全二叉树 前序 中序 后序 功能展示 创建二叉树 初始化 销毁 简易功能介绍 二叉树节点个数 二叉树叶子节点个数 二叉树第k层节点个数 二叉树查找值为x的节点 判…...

Unity DOTS技术(五)Archetype,Chunk,NativeArray

文章目录 一.Chunk和Archetype什么是Chunk?什么是ArchType 二.Archetype创建1.创建实体2.创建并添加组件3.批量创建 三.多线程数组NativeArray 本次介绍的内容如下: 一.Chunk和Archetype 什么是Chunk? Chunk是一个空间,ECS系统会将相同类型的实体放在Chunk中.当一个Chunk…...

算法学习笔记(7.1)-贪心算法(分数背包问题)

##问题描述 给定 &#x1d45b; 个物品&#xff0c;第 &#x1d456; 个物品的重量为 &#x1d464;&#x1d454;&#x1d461;[&#x1d456;−1]、价值为 &#x1d463;&#x1d44e;&#x1d459;[&#x1d456;−1] &#xff0c;和一个容量为 &#x1d450;&#x1d44e;&…...

气膜建筑的施工对周边环境影响大吗?—轻空间

随着城市化进程的加快&#xff0c;建筑行业的快速发展也带来了环境问题。噪音、灰尘和建筑废料等对周边居民生活和生态环境造成了不小的影响。因此&#xff0c;选择一种环保高效的施工方式变得尤为重要。气膜建筑作为一种新兴的建筑形式&#xff0c;其施工过程对周边环境的影响…...

【计算机网络】对应用层HTTP协议的重点知识的总结

˃͈꒵˂͈꒱ write in front ꒰˃͈꒵˂͈꒱ ʕ̯•͡˔•̯᷅ʔ大家好&#xff0c;我是xiaoxie.希望你看完之后,有不足之处请多多谅解&#xff0c;让我们一起共同进步૮₍❀ᴗ͈ . ᴗ͈ აxiaoxieʕ̯•͡˔•̯᷅ʔ—CSDN博客 本文由xiaoxieʕ̯•͡˔•̯᷅ʔ 原创 CSDN 如…...

30分钟快速入门TCPDump

TCPDump是一款功能强大的网络分析工具&#xff0c;它可以帮助网络管理员捕获并分析流经网络接口的数据包。由于其在命令行环境中的高效性与灵活性&#xff0c;TCPDump成为了网络诊断与安全分析中不可或缺的工具。本文将详细介绍TCPDump的基本用法&#xff0c;并提供一些高级技巧…...

Python | 刷题日记

1.海伦公式求三角形的面积 area根号下&#xff08;p(p-a)(p-b&#xff09;(p-c)) p是周长的一半 2.随机生成一个整数 import random xrandom.randint(0,9)#随机生成0到9之间的一个数 yeval(input("please input:")) if xy:print("bingo") elif x<y:pri…...

“JS逆向 | Python爬虫 | 动态cookie如何破~”

案例目标 目标网址:aHR0cHMlM0EvL21hdGNoLnl1YW5yZW54dWUuY29tL21hdGNoLzI= 本题目标:提取全部 5 页发布日热度的值,计算所有值的加和,并提交答案 常规 JavaScript 逆向思路 JavaScript 逆向工程通常分为以下三步: 寻找入口:逆向工程的核心在于找出加密参数的生成方式。…...

十.数据链路层——MAC/ARP

IP和数据链路层之间的关系 引言 在IP一节中&#xff0c;我们说IP层路由(数据转发)的过程&#xff0c;就像我们跳一跳游戏一样&#xff0c;从一个节点&#xff0c;转发到另一个节点 它提供了一种将数据从A主机跨网络发到B主机的能力 什么叫做跨网络&#xff1f;&#xff1f;&a…...

Linux主机安全可视化运维(免费方案)

本文介绍如何使用免费的主机安全软件,在自有机房或企业网络实现对Linux系统进行可视化“主机安全”管理。 一、适用对象 本文适用于个人或企业内的Linux服务器运维场景,实现免费、高效、可视化的主机安全管理。提前发现主机存在的安全风险,全方位实时监控主机运行时入侵事…...

Vite + Vue 3 前端项目实战

一、项目创建 npm install -g create-vite #安装 Vite 项目的脚手架工具 # 或者使用yarn yarn global add create-vite#创建vite项目 create-vite my-vite-project二、常用Vue项目依赖安装 npm install unplugin-auto-import unplugin-vue-components[1] 安装按需自动导入组…...

python-字符替换

[题目描述] 给出一个字符串 s 和 q 次操作&#xff0c;每次操作将 s 中的某一个字符a全部替换成字符b&#xff0c;输出 q 次操作后的字符串输入 输入共 q2 行 第一行一个字符串 s 第二行一个正整数 q&#xff0c;表示操作次数 之后 q 行每行“a b”表示把 s 中所有的a替换成b输…...

团队项目开发使用git工作流(IDEA)【精细】

目录 开发项目总体使用git流程 图解流程 1.创建项目仓库[组长完成] 2. 创建项目&#xff0c;并进行绑定远程仓库【组长完成】 3.将项目与远程仓库&#xff08;gitee&#xff09;进行绑定 3.1 创建本地的git仓库 3.2 将项目添加到缓存区 3.3 将项目提交到本地仓库&#…...

爬虫案例实战

文章目录 一、窗口切换实战二、京东数据抓取 一、窗口切换实战 案例实战&#xff1a;使用selenium实现打开百度和腾讯两个窗口并切换 知识点&#xff1a;用到selenium中execute_script()执行js代码及switch_to.window()方法 全部代码如下&#xff1a; import time import war…...

uniapp uni-popup内容被隐藏问题

今天开发新需求的时候发现uni-popup 过一会就被隐藏掉只留下遮罩(css被更改了)&#xff0c;作者进行了如下调试。 1.讲uni-popup放入其他节点内 失败&#xff01; 2.在生成dom后在打开 失败&#xff01; 3.uni-popup将该节点在包裹一层 然后将统计设置样式&#xff0c;v-if v-s…...

leetcode155 最小栈

题目 设计一个支持 push &#xff0c;pop &#xff0c;top 操作&#xff0c;并能在常数时间内检索到最小元素的栈。 实现 MinStack 类: MinStack() 初始化堆栈对象。void push(int val) 将元素val推入堆栈。void pop() 删除堆栈顶部的元素。int top() 获取堆栈顶部的元素。i…...

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...

微服务商城-商品微服务

数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...

PL0语法,分析器实现!

简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...

相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)

【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...

三体问题详解

从物理学角度&#xff0c;三体问题之所以不稳定&#xff0c;是因为三个天体在万有引力作用下相互作用&#xff0c;形成一个非线性耦合系统。我们可以从牛顿经典力学出发&#xff0c;列出具体的运动方程&#xff0c;并说明为何这个系统本质上是混沌的&#xff0c;无法得到一般解…...

代理篇12|深入理解 Vite中的Proxy接口代理配置

在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...

iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈

在日常iOS开发过程中&#xff0c;性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期&#xff0c;开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发&#xff0c;但背后往往隐藏着系统资源调度不当…...

springboot整合VUE之在线教育管理系统简介

可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生&#xff0c;小白用户&#xff0c;想学习知识的 有点基础&#xff0c;想要通过项…...

解决:Android studio 编译后报错\app\src\main\cpp\CMakeLists.txt‘ to exist

现象&#xff1a; android studio报错&#xff1a; [CXX1409] D:\GitLab\xxxxx\app.cxx\Debug\3f3w4y1i\arm64-v8a\android_gradle_build.json : expected buildFiles file ‘D:\GitLab\xxxxx\app\src\main\cpp\CMakeLists.txt’ to exist 解决&#xff1a; 不要动CMakeLists.…...

【从零开始学习JVM | 第四篇】类加载器和双亲委派机制(高频面试题)

前言&#xff1a; 双亲委派机制对于面试这块来说非常重要&#xff0c;在实际开发中也是经常遇见需要打破双亲委派的需求&#xff0c;今天我们一起来探索一下什么是双亲委派机制&#xff0c;在此之前我们先介绍一下类的加载器。 目录 ​编辑 前言&#xff1a; 类加载器 1. …...