MySQL表中的联合查询

news2025/1/11 8:06:56
上一篇有关聚合查询的博客: MySQL表中的聚合查询_徐憨憨!的博客-CSDN博客主要是针对单个表进行查询操作,但是实际的开发环境中,数据往往来自己于不同的数据表,此时就需要使用联合查询进行操作!

联合查询

多表查询的基本执行过程:进行笛卡尔积然后设置条件删除无效数据进行筛选

1.示例一

假设创建两个表,学生表(包含id,name,classId),班级表(包含classId,name),在不使用外键的情况下查询学生所属班级的情况:

第一步:笛卡尔积

笛卡尔积之后产生的新表的行数等于两个表的行数之积(因为笛卡尔积的结果就是排列组合的结果),列数等于两个表的列数之和

第二步:指定连接条件删除无效数据

进行笛卡尔积之后,发现很多数据都是错误的数据(即无效数据),比如这里的张三同时属于classId为1和classId为2两个班级,这里设置的条件也是基于两个表中的classId应该相同

注意:这里设置的条件是两个表的classId要相等,所以在SQL语法中,要明确指出每个classId属于哪个表的,使用时需要使用表名.classId,否则会报错(提示字段名有歧义)!

第三步:对查询结果进行精简(删除不必要的列)

通过查询所需要的列来对查询结果进行精简

2.示例二

假设创建四个表,班级表(包含id,name,desc),课程表(id,name),分数表(score,student_id,course_id),学生表(包含id,sn,name,qq_mail,classes_id),其中学生和班级是一对多的关系,学生和课程是多对多的关系,在没有设置外键约束的情况下进行查询时需要使用多表查询.

此时我们需要查询'许仙'同学的成绩(涉及到学生表和成绩表,所以需要对这两个表进行多表查询)

第一步:笛卡尔积

第二步:指定连接条件删除无效数据

第三步:加入条件进行筛选

第四步:对查询结果进行精简(删除不必要的列)

同样使用join on也可以实现多表查询(查询时也可以设置别名)

3.内连接和外连接

内连接和外连接大多数情况下是没什么区别的:上述查询时使用from就是内连接,而join on既可以实现外连接也可以实现内连接;
当要连接的两个表里面的数据是一一对应的时候没有区别,
当要连接的两个表里面的数据不是一一对应的时候有区别.

两个表之间的数据一一对应时:

两个表之间的数据不是一一对应时:

但是如果使用了外连接则会不同(外连接分为左外连接和右外连接);

左外连接:会把左表的结果尽量列出来,哪怕在右表中没有对应的记录,就使用NULL填充

右外连接:会把右表的结果尽量列出来,哪怕在左表中没有对应的记录,就使用NULL填充

4.自连接

自连接也是多表查询的一种,只是自连接是针对于同一个表进行笛卡尔积运算,自连接的效果就是把行转成列(因为SQL中无法针对行与行之间使用条件,但是有的需求需要行与行进行比较,此时就可以使用自连接把行转换成列进行比较)

现在有一个需求:查询所有"计算机原理"成绩比"Java"成绩高的成绩信息,这个需求需要将成绩表进行自连接

第一步:笛卡尔积

注意:这里对同一个表进行笛卡尔积运算时,必须对表名起别名(所以起别名不仅针对表达式,也可以针对表)

第二步:指定连接条件删除无效数据

第三步:找出满足左侧为该同学计算机原理成绩,右侧为java成绩的记录

第四步:筛选出计算机原理成绩比Java成绩高的记录

5.子查询

子查询的本质就是把多个SQL语句组合成一个复杂的语句,但是复杂的代码可读性会较差,需要谨慎使用

子查询分为单行子查询(返回一行记录的子查询)和多行子查询(返回多行记录的子查询);

单行子查询:

查询与"不想毕业"同学的同班同学:先去查询"不想毕业"这个同学的班级id,再按照班级id来查哪些同学和他一个班;

分步查询:

子查询:

注意:后面的子查询必须只返回一条记录,此时写=才是可以的(把一个查询作为另一个查询的一部分条件)

多行子查询(使用关键字in):

查询"语文"或"英文"课程的成绩信息:先根据名字查询出课程id,再根据课程id查询出课程分数

分步查询:

子查询:

注意:查询结果是在内存中,如果查询结果太大了,内存放不下,in就用不了了,就可以使用exists代替(exists关键字可读性较差,执行效率也大大低于in写法,使用这个一般都是用来解决特殊场景)

6.合并查询

合并查询本质上就是把两个查询的结果集(要求这两个结果集的列相同才能合并)

查询id小于3,或者名字为"英文"的课程

union和or的区别:

or只能查询来自于同一个表的数据,union查询结果可以来自于不同的表,只要查询的结果的列匹配即可!

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

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

相关文章

Echarts环形图线性渐变,hover后显示阴影

第004个点击查看专栏目录Echarts的渐变在上一篇文章中已经讲过 ECharts线性渐变色示例演示(2种渐变方式),这里做了环形图,饼图的一个渐变示例演示,hover到元素后,会呈现出一个阴影。注意,颜色属…

年度总结 | 积跬步以至千里,2023一起筑梦新征程

2022年,是值得载入史册的一年。疫情开放,健康码隐入历史尘埃。国际形势紧张,信创化进入快车道。企业加速转型,跨界技术融合的运维新生态已初露苗头。回顾2022,我们聚沙成塔逆寒流而勇进,精造创新以实践诠释…

【Linux】基础网络编程

计算机网络基本概念 在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统。 计算机网络的分类与一般的事物分类方法一样,可以按事物所具有的不同性质特点分类。计算机网络通俗地讲就是由多台计算…

VMware双网卡配置(ubuntu)

桥接的时候不能上网,上网的时候又不能桥接和开发板通信,这是一个非常难受的事情,下面我来配置一下双网卡,一个用来桥接和单片机通信,一个用来上网。 ⚫ NAT 网卡:Ubuntu 通过它上网,只要 Windo…

【快速开始】vuejs环境搭建第一个项目

本篇包含vuejs环境安装以及通过vue客户端快速创建运行第一个项目。(注:以下内容均已windows平台为基准) 目录: 一、安装nodejs 二、配置国内源加速 三、安装vue客户端 四、创建第一个应用 1、安装nodejs: 1.1、下载 官网下载地址&…

【Java】java | smart-doc + tonar | API文档统一管理

一、说明 1、准备舍弃swagger了,拥抱smart-doc 2、win10 3、jdk8 4、idea 二、搭建torna 1)下载zip https://foruda.gitee.com/attach_file/1672544760054905357/torna-1.19.4.zip?token25e02a8e2817a757a0aa47172349cc20&ts1675345098&am…

06 Sentinel规则持久化(3)

Sentinel 持久化模式 Sentinel规则的推送有下面三种模式: 1、原始模式 如果不做任何修改,Dashboard 的推送规则方式是通过 API 将规则推送至客户端并直接更新到内存中: 这种做法的好处是简单,无依赖;坏处是应用重启规则就会消失…

智能网联汽车信息安全敲响「警钟」,如何筑牢防线?

2009年起,谷歌、百度等互联网科技公司就入局自动驾驶,旨在赋予汽车更智慧的大脑。 如今,物流、港口等场景下自动驾驶的商业化落地,众多的网联化接口不仅加强了智能网联汽车与操作环境之间的紧密关联,也促使智能网联汽…

Linux 学习笔记 文件、目录操作与用户群组权限

一、命令行提示符 1.1 命令行基础 bearpi:当前用户名,在前是用户名 ubuntu:用户所在的域名,在后面,这是我自定义的,默认应该是主机名 ~ 波浪线为目前所在目录,~代表家目录(home d…

【LMI传感器】LMI Gocator线激光传感器环境变量配置

文章目录1 打开系统环境配置界面2 环境变量配置1 打开系统环境配置界面 控制面板>系统和安全>系统>高级系统设置 系统属性>高级>环境变量 2 环境变量配置 环境变量配置 GENICAM_GENTL32_PATH E:\Program Files(x86)\GoCator\Release_5.3.22.22(SR1)\Integ…

ios pod更换三方库source

无法访问github,pod无法添加三方库,此时gitlab上有这个三方库并且可以访问。以FMDB为例子本地路径:/Users/用户名/.cocoapods/repos/trunk/Specs/f/4/e/FMDB/2.7.5修改podspec.json内sourcegithubgitlab"source": { "git"…

Pipenv:作为 Python 开发人员为什么应该使用它

Pipenv 是一个旨在将所有打包世界中最好的东西带到 Python 世界的工具。它将 Pipfile、pip 和 virtualenv 整合到一个命令中。它会自动为您的项目创建和管理虚拟环境,并在您安装/卸载包时从您的 Pipfile 添加/删除包。在深入研究之前,让我们先看看 Pipen…

抓包对抗原理与案例

服务端校验客户端 案例:爱奇艺 平时我们碰到的HTTP和HTTPS都在应用层,SOCKS在会话层,TCP和UDP在传输层,IP在网络层。 HTTP未加密主要有这些不足 通信使用明文(不加密),内容可能会被窃听 不验证通信方的身份,因此有可能遭遇伪装…

2月2日 读书笔记

段的起始地址用32位来表示,被称为段的基址,在本书中被分成了3段,分别为2字节、1字节、1字节。之所以这么做,主要是为了与80286时代的程序兼容。有了这样的规格,80286用的操作系统,也可以不用修改就在386以后…

不忘初心,勇攀高峰!低代码公司流辰信息紧抓机遇,努力超前冲!

在数字化发展趋势越来越激烈的当下,市场变得风云变幻,作为一家致力于提升企业办公自动化效率的低代码公司平台服务商,流辰信息矢志不渝,不忘初心,紧跟时代发展潮流,坚持围绕客户需求研发创新,提…

马哥架构第4周课程作业

docker应用一. docker常用命令博客1.1 Docker安装及基础命令介绍1.1.1 Docker 安装准备1.1.2 安装和删除方法1.1.2.1 Ubuntu 安装和删除Docker1.1.2.2 CentOS 安装和删除Docker1.1.2.3 Linux 二进制安装1.1.2.4 安装 podman1.1.2.5 在不同系统上实现一键安装 docker 脚本1.1.2.…

HBase入门概念

文章目录HBase存储结构数据模型table 逻辑结构切分存储table 物理结构架构 todo使用DDLDMLphoenixHBase nosql (k,v) 以HDFS为基础存储数据 存储结构 数据模型 nameSpace: 命名空间table: 表(需要声明…

浅谈C/S和B/S架构的工作原理及优缺点

C/S架构 一、C/S架构及其背景 C/S架构是一种比较早的软件架构,主要应用于局域网内。在这之前经历了集中计算模式,随着计算机网络的进步与发展,尤其是可视化工具的应用,出现过两层C/S和三层C/S架构,不过一直很流行也比…

蓝桥杯刷题019——观光公交(贪心)

题目描述 风景迷人的小城 Y 市,拥有 n 个美丽的景点。由于慕名而来的游客越来越多,Y 市特意安排了一辆观光公交车,为游客提供更便捷的交通服务。观光公交车在第 0 分钟出现在 1 号景点,随后依次前往 2、3、4……n 号景点。从第 i …

使用Workbook读取表格问题总结

使用Workbook读取表格问题总结一、Workbook类型二、问题总结1.SXSSFWorkbook为什么我Create了一万行Row但是却获取不到?2.读取表格一、Workbook类型 Workbook分三种类型: 1.HSSFWorkbook 用于Excel2003版及更早版本(扩展名为.xls)的导出; 2.…