MySQL连表查询

MySQL简介,我们为什么要学习各种join

MySQL是SQL的一种,SQL意为结构化查询语言(Structure Query Language),MySQL可以应用于现实世界的各种结构化数据。

SQL(结构化查询语言),处理结构化数据的查询语言,结构化数据就是一张表,数据结构是关系,元组的结合

以下内容能看懂就看,看不懂可以自行百度

  1. 数据库(DB)是现代信息系统的核心组成部分,用于存储、管理和检索数据。
    它具备永久存储、有组织和可共享的特点。
  2. 数据库管理系统(DBMS)是一个软件系统,提供数据定义和数据操纵功能。
  3. 数据库系统(DBS)则是一个更广泛的术语,包括数据库(DB)、数据库管理系统(DBMS)、应用程序和数据库管理员(DBA)。
  4. 数据模型是数据库系统的核心和基础,分为概念模型(实体-联系模型)、逻辑模型和物理模型三类。
  5. 数据模型的组成三要素:
    数据结构(最重要,按照这个分类),数据操作,完整性约束条件
  6. 关系型数据库的数据结构是关系;数据操作包括:查询,更新(增删改);完整性约束条件包括①实体完整性(针对主属性,主属性不能为空),②参照完整性(外码,外码要么为空,要么是另一列中的值),③用户定义完整性(语义,比如性别,不能为空,比如年龄,不能是负数,比如成绩,必须在0-100之间)
  7. 现有的RDB(关系型数据库)无法处理相关数据处理问题,于是新的非关系数据库技术出现了,能很好的解决大数据相关的问题,叫NOSQL
  8. 结构化数据:可以通过固有键值获取相关数值,且数据的格式固定
  9. 非结构化数据:声音等信息,歧义严重,无法通过键值获取相关数值
  10. 半结构化数据:通过灵活键值获取相关数值,数据的格式不固定(XML,JSON等)

MySQL是关系型数据库,存储的是关系模型数据。

MySQL是一种计算机语言,只要是计算机语言,在解决现实问题的过程种,往往都对现实世界进行了抽象与映射,MySQL也不例外,一张表,往往就是对现实世界实体/映射关系的一种抽象。

join就是对各种实体之间关系的一种汇总,不管我们想要哪些结果,都可以通过join完成

在这里插入图片描述

Join的类型

在这里插入图片描述

参考文章:
SQL 连接(JOIN)

内连接,外连接,全外连接,交叉连接,自然连接

不同逻辑关系,我们能采取的最优策略(表结构设计)

表的关系,就是现实世界的实体之间的关系
1对1,1对多,多对多
不同的关系,我们有不同的策略进行处理

1对1

合法情况下,1名丈夫只能与1位女性结为夫妇

在这里插入图片描述
在这里插入图片描述

1. 表合并(最优)

普通的mysql表自带字段之间1对1的逻辑

在这里插入图片描述
优点:查询快,单表即可完成
没有缺点

2.添加外键

在这里插入图片描述
缺点:连表查询相比于单表查询比较慢

3. 创建中间表

一张新表,把逻辑关系保存起来
在这里插入图片描述
缺点:两次连表,更慢了

1对多

1个班级里面可以有多个学生,但是1个学生只能是某个班的学生
在这里插入图片描述

1.表合并

在这里插入图片描述
缺点:
①班级表有数据冗余,班级表内的字段,反反复复的出现,同一个班级内有多少学生,就要出现多少次
②修改麻烦,需要一个一个修改(学生换班,需要全都改;班级改名字,也需要都改)

2.“一”表加外键

在这里插入图片描述
缺点:
①班级表有数据冗余,班级表内的字段,反反复复的出现,同一个班级内有多少学生,就要出现多少次
②修改麻烦,需要一个一个修改(学生换班,学生表不需要改,班级表修改一条记录;班级改名字,班级表中旧名字都得改)

3.“多”表加外键(最优)

在这里插入图片描述
优点:
①班级表和学生表都不会数据冗余,学生表多一列即可
②修改学生班级,只需要修改一次即可(学生换班,修改学生表的c_id;班级改名字,只需要改一次即可)

3. 创建中间表

不会造成冗余,但是多次连表会增大查询的开销,能少连表就少连表

多对多

在这里插入图片描述
1个学生可以选择多门课程去学习,1门课程也可以被多个学生选择

1. 表合并

合并两张表,会造成大量的冗余
在这里插入图片描述

2. 添加外键

不管在那张表里面加外键,还是会造成数据的冗余

在这里插入图片描述

3. 创建新表(最优)

在这里插入图片描述
这样做,两张表都不会造成冗余,虽然需要多次连表查询,但是比数据冗余要好

连接类型

内连接,外连接,交叉连接,自然连接,全外连接
在这里插入图片描述
class表
在这里插入图片描述
student表
在这里插入图片描述

1. 自然连接(不建议使用)

 SELECT *FROM student sNATURAL JOIN class c

更简单的方法去连接两张表,但是不建议使用它,因为有的时候自然连接会产生出乎意料的结果

自然连接不需要打上连接条件的列名,数据库引擎会自己看着办,找到两个表共同的列连接。

PS: 关键字NATURAL和USING不能同时出现

数据库引擎找不到相同的列,结果与交叉连接无异;

这里class表的id字段多了一个空格,数据库引擎找不到相同的列,结果就是交叉连接,排列组合
在这里插入图片描述数据库引擎找不到相同的列,结果会很奇葩;
在这里插入图片描述
只返回了满足条件的前三行

2. 交叉连接

 SELECT * FROM student s CROSS JOIN class c-- 两种写法等价select * from student s,class s

查出来的结果是两张表笛卡尔积之后的结果,也就是各个字段排列组合之后的结果,这种排列组合忽略表之间的外键限制

返回左表中的所有行,左表中的每一行与右表中的所有行排列组合

20个学生,3个班,最后查出来就是3×20 = 60条结果

在这里插入图片描述

交叉连接/自然连接正常使用

我们可以通过where后面加限制条件(外键或自定义的其他条件),减少排列组合的数量

select * from student s,class c where s.c_id = c.id

在这里插入图片描述
想要继续缩小范围,可以在where后面继续加筛选条件

当我们明确连接条件的id之后,交叉连接和内连接的查询结果相同

当其中左表/右表无法匹配(值为null)时,两者都不会返回这种无法匹配的行,所以本质上都是在求交集

3. 内连接

和明确主键连接条件的交叉连接本质无异,都是求交集

select * from student s inner join class c on s.c_id = c.id
-- 两者等价
select * from student s join class c on s.c_id = c.id

在这里插入图片描述

这样看似乎没什么问题,但是如果一些学生没有c_id

在这里插入图片描述

我们再去查询,结果就会没有这些学生

在这里插入图片描述

4. 外连接

左外连接,join左边的表的所有记录都会被保留,无论是否为空;

右外连接,join右边的表的所有记录都会被保留,无论是否为空;

select * from student s left outer join class c on s.c_id = c.id
-- 两种写法等价
select * from student s left join class c on s.c_id = c.id

在这里插入图片描述

我们可以看到,刚才交叉连接和内连接缺失的一部分学生,左外连接查到了

我们对class表加一个软件三班,但是学生表没有任何一条记录的c_id是4,然后分别进行内连接查询和右外连接查询

在这里插入图片描述
内连接查询
在这里插入图片描述
既没有缺少的学生,也没有多余的班级(不满足连接条件就不显示)

右外连接

在这里插入图片描述

我们看到了多余的班级!!!

外连接是我们平常使用最频繁的连接方式,因为它可以保证我们想要的保留的数据,哪怕不满足连接条件也会被保留

5. 全外连接

mysql没有full outer join,不过我们可以用左外连接+union+右外连接间接实现全外连接

select * from student s left join class c on s.c_id = c.id
union
select * from student s right join class c on s.c_id = c.id

在这里插入图片描述

全外连接的本质就是并集

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

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

相关文章

房产中介小程序高效开发攻略:从模板到上线一站式服务

对于房产中介而言,拥有一个高效且用户友好的小程序是提升业务、增强客户黏性的关键。而采用直接复制模板的开发方式,无疑是实现这一目标的最佳途径,不仅简单快捷,而且性价比极高。 在众多小程序模板开发平台中,乔拓云网…

Java项目:基于SSM框架实现的高校专业信息管理系统设计与实现(ssm+B/S架构+源码+数据库+毕业论文+PPT+开题报告)

一、项目简介 本项目是一套基于SSM框架实现的高校专业信息管理系统 包含:项目源码、数据库脚本等,该项目附带全部源码可作为毕设使用。 项目都经过严格调试,eclipse或者idea 确保可以运行! 该系统功能完善、界面美观、操作简单、…

前端vite+rollup前端监控初始化——封装基础fmp消耗时间的npm包并且发布npm beta版本

文章目录 ⭐前言💖vue3系列文章 ⭐初始化npm项目💖type为module💖rollup.config.js ⭐封装fmp耗时计算的class💖npm build打包class对象 ⭐发布npm的beta版本💖 npm发布beta版本 ⭐安装web-performance-tool的beta版本…

5G前传光纤传输的25G光模块晶振SG2016CAN

一款适用于5G前传光纤传输网络中的25G光模块的5G晶振SG2016CAN。随着5G时代的到来,5G晶振的重要性也不言而喻,小体积宽温晶振SG2016CAN可以用于5G前传的25G光模块,具有高稳定性、小体积、宽温等优势。在5G前传光纤传输网络中,25G光…

Mac 上安装多版本的 JDK 且实现 自由切换

背景 当前电脑上已经安装了 jdk8; 现在再安装 jdk17。 期望 完成 jdk17 的安装,并且完成 环境变量 的配置,实现自由切换。 前置补充知识 jdk 的安装路径 可以通过查看以下目录中的内容,确认当前已经安装的 jdk 版本。 cd /Library/Java/Java…

【大前端】ECharts 绘制立体柱状图

立体柱状图分为: 纯色立体柱状图渐变立体柱状图 常用实现方式 纯色立体柱状图 纯色立体柱状图,使用MarkPoint和颜色渐变就实现,如下代码 import * as echarts from "echarts";var chartDom document.getElementById("main&…

AI大模型探索之路-训练篇9:大语言模型Transformer库-Pipeline组件实践

系列篇章💥 AI大模型探索之路-训练篇1:大语言模型微调基础认知 AI大模型探索之路-训练篇2:大语言模型预训练基础认知 AI大模型探索之路-训练篇3:大语言模型全景解读 AI大模型探索之路-训练篇4:大语言模型训练数据集概…

Android View事件分发面试问题及回答

问题 1: 请简述Android中View的事件分发机制是如何工作的? 答案: 在Android中,事件分发机制主要涉及到三个主要方法:dispatchTouchEvent(), onInterceptTouchEvent(), 和 onTouchEvent(). 当一个触摸事件发生时,首先被Activity的…

展会资讯 | 现场精彩回顾 阿尔泰科技参展2024第23届中国国际(西部)光电产业!

2024第23届中国国际(西部)光电产业博览会,在成都世纪城新国际会展中心圆满落幕!来自各地的光电领域设备及材料厂商汇聚一堂,展示前沿技术及创新成果。 展会现场,来自全国各地的500余家企业就精密光学、信息…

ChatGPT 网络安全秘籍(四)

原文:zh.annas-archive.org/md5/6b2705e0d6d24d8c113752f67b42d7d8 译者:飞龙 协议:CC BY-NC-SA 4.0 第八章:事故响应 事故响应是任何网络安全策略的关键组成部分,涉及确定、分析和缓解安全漏洞或攻击。 及时和有效地…

Linux深入学习内核 - 中断与异常(下)

软中断,Tasklet和Work Queue 由内核执行的几个任务之间有一些不是紧急的,他们可以被延缓一段时间!把可延迟的中断从中断处理程序中抽出来,有利于使得内核保持较短的响应时间,所以我们现在使用以下面的这些结构&#x…

通用漏洞评估系统CVSS4.0简介

文章目录 什么是CVSS?CVSS 漏洞等级分类历史版本的 CVSS 存在哪些问题?CVSS 4.0改进的“命名法”改进的“基本指标”考虑“OT/IOT”新增的“其他指标”CVSS 4.0存在的问题 Reference: 什么是CVSS? 在信息安全评估领域,CVSS为我们…

2024五一数学建模C题Python代码+结果表数据教学

2024五一数学建模竞赛(五一赛)C题保姆级分析完整思路代码数据教学 C题 煤矿深部开采冲击地压危险预测 第一问 导入数据 以下仅展示部分,完整版看文末的文章 import numpy as np import pandas as pd import matplotlib.pyplot as plt imp…

基于Springboot的音乐翻唱与分享平台

基于SpringbootVue的音乐翻唱与分享平台设计与实现 开发语言:Java数据库:MySQL技术:SpringbootMybatis工具:IDEA、Maven、Navicat 系统展示 用户登录 首页 音乐资讯 音乐翻唱 在线听歌 后台登录 后台首页 用户管理 音乐资讯管理…

labview强制转换的一个坑

32位整形强制转换成枚举的结果如何? 你以为的结果是 实际上的结果是 仔细看,枚举的数据类型是U16,"1"的数据类型是U32,所以转换产生了不可预期的结果。所以使用强制转换时一定要保证两个数据类型一致,否则…

CentOS7安装MySQL8.3(最新版)踩坑教程

安装环境说明 项值系统版本CentOS7 (具体是7.9,其他7系列版本均可)位数X86_64,64位操作系统MySQL版本mysql-8.3.0-1.el7.x86_64.rpm-bundle.tar 实际操作 官网下载安装包 具体操作不记录,相关教程很多。 mkdir /o…

锂电池SOH预测 | 基于BP神经网络的锂电池SOH预测(附matlab完整源码)

锂电池SOH预测 锂电池SOH预测完整代码锂电池SOH预测 锂电池的SOH(状态健康度)预测是一项重要的任务,它可以帮助确定电池的健康状况和剩余寿命,从而优化电池的使用和维护策略。 SOH预测可以通过多种方法实现,其中一些常用的方法包括: 容量衰减法:通过监测电池的容量衰减…

QT5制做两个独立窗口

目录 增加第二个窗口 主窗口文件添加一个私有成员为子窗口 定义两个槽函数和 关联按钮和子窗口和主窗口 添加子窗口成员 子窗口处理函数 补充回顾 增加第二个窗口 1、 2、 3 主窗口文件添加一个私有成员为子窗口 在mainwidget.h文件 同时添加两个槽;来处理…

Docker: 如何不新建容器 修改运行容器的端口

目录 一、修改容器的映射端口 二、解决方案 三、方案 一、修改容器的映射端口 项目需求修改容器的映射端口 二、解决方案 停止需要修改的容器 修改hostconfig.json文件 重启docker 服务 启动修改容器 三、方案 目前正在运行的容器 宿主机的3000 端口 映射 容器…

【综述】多核处理器芯片

文章目录 前言 Infineon处理器 AURIX™系列 TC399XX-256F300S 典型应用 开发工具 参考资料 前言 见《【综述】DSP处理器芯片》 Infineon处理器 AURIX™系列,基于TriCore内核,用于汽车和工业领域。 XMC™系列,基于ARM Cortex-M内核&…