mysql的组合查询

mysql的组合查询

1、mysql的内连接查询

在 MySQL 中,内连接(INNER JOIN)是一种根据两个或多个表之间的匹配条件,将多个表中的数据进行联接的操作。内连接只返回符合联接条件的行,而不会返回未匹配的行。

内连接的语法如下:

SELECT column_name(s)
FROM table1
INNER JOIN table2
ON table1.column_name = table2.column_name;

以t_employee(员工表)和t_dept(部门表)为例:
t_employee表中的记录如下:dept代表该员工所在的部门
在这里插入图片描述

t_dept表中记录如下:
在这里插入图片描述

可以发现,其中人力资源部里没有员工(这里只是举例,可能与实际不符,但主要在于逻辑关系),而赵七没有对应的部门,现在想要查询出员工姓名以及其对应的部门名称:
此时,就要使用内连接查询,关键字(inner join)
在这里说一下关联查询sql编写的思路,1,先确定所连接的表,2,再确定所要查询的字段,3,确定连接条件以及连接方式

select 
e.empName,d.deptName
from t_employee e
INNER JOIN t_dept d
ON e.dept = d.id;

)
在这里插入图片描述

其中,没有部门的人员和部门没有员工的部门都没有被查询出来,这就是内连接的特点,只查询在连接的表中能够有对应的记录,其中e.dept = d.id是连接条件

需要注意这两个表的地位是平等的,如果其中一个表没有与另一个表相关连的数据,那么数据就不会显示出来
在内部具体的执行流程为:
1、打开第一个表,并按照 SELECT 语句中指定的列列表读取数据。
2、对于第一个表中的每一行数据,打开第二个表,并按照 SELECT 语句中指定的列列表读取数据。
4、对于第二个表中的每一行数据,比较两个表中的关联列是否匹配,如果匹配,则将两个表中的所有列组合成一行,并添加到结果集中。
5、如果两个表中存在相同列名的列,将在列名前加上表名作为前缀。
6、如果需要,按照 ORDER BY 子句中指定的顺序对结果集进行排序。
7、如果需要,应用 LIMIT 和 OFFSET 子句对结果集进行分页。
8、返回查询结果。

2、左外连接查询

是指以左边的表的数据为基准,去匹配右边的表的数据,如果匹配到就显示,匹配不到就显示为null,例如上面的实例
语法为:

SELECT column_name(s)
FROM table1
LEFT JOIN table2
ON table1.column_name = table2.column_name;

其中,table1 和 table2 是要进行联接的两个表,column_name 是两个表中要进行匹配的列的名称。在 ON 子句中,需要指定两个表中要进行匹配的列的名称。
此外,左外连接还有其他类型的语法,如 LEFT OUTER JOIN 等,这些语法可以更改联接方式或使用不同的联接条件。

SELECT e.empName,d.deptName
from t_employee e
LEFT OUTER JOIN t_dept d 
on d.id = e.dept;

结果为:
在这里插入图片描述

3、右外连接查询

右外连接是同理的,只是基准表的位置变化了而已,以右边的表为基准。
在mysql的内部,右外连接也会转化为等价的左外连接。

4、mysql的union查询(全外连接的一种形式,实际不支持全外连接)

在 MySQL 中,UNION 是一种用于组合多个 SELECT 语句结果集的操作符。UNION 操作符将多个 SELECT 语句的结果集合并成一个结果集,并去除重复的行。

UNION 操作符的语法如下:

SELECT column_name(s) FROM table1
UNION
SELECT column_name(s) FROM table2;
其中,table1 和 table2 是两个要合并的表,它们必须具有相同数量和数据类型的列,列的顺序也必须相同。UNION 操作符会按照 SELECT 语句的顺序合并两个结果集,并去除重复的行。

注意,UNION 操作符会对结果集进行排序。如果您需要按照特定的顺序组合结果集,可以使用 ORDER BY 子句。例如:

SELECT column_name(s) FROM table1
UNION
SELECT column_name(s) FROM table2
ORDER BY column_name;
如果您需要组合多个结果集,可以使用多个 UNION 操作符。例如:

SELECT column_name(s) FROM table1
UNION
SELECT column_name(s) FROM table2
UNION
SELECT column_name(s) FROM table3;
这将组合三个结果集,并去除重复的行。

注意,如果要使用 UNION 操作符,必须确保每个 SELECT 语句返回相同数量和类型的列。如果不是这样,可以使用 NULL 补充缺失的列。例如:

SELECT column1, column2 FROM table1
UNION
SELECT column1, NULL FROM table2;
这样可以确保两个结果集返回相同数量和类型的列,从而可以使用 UNION 操作符组合它们。

union 与union all

1、UNION 和 UNION ALL 都是 MySQL 中用于合并两个或多个 SELECT 语句的操作符。它们的区别如下:
UNION 对结果集去重,UNION ALL 不对结果集去重。
UNION 操作符需要对结果集进行排序,而 UNION ALL 不需要排序。因此,UNION 的性能一般比 UNION ALL 差。
UNION 可以使用 ORDER BY 子句对结果集进行排序,而 UNION ALL 不支持 ORDER BY 子句。
UNION ALL 的语法比 UNION 简单,因此在一些场景下使用 UNION ALL 可以减少代码的复杂性。
总的来说,UNION 适用于需要合并两个或多个结果集,并去除重复数据的场景。而 UNION ALL 适用于需要合并两个或多个结果集,但不需要去除重复数据的场景。由于 UNION ALL 不需要进行排序和去重操作,因此它的性能通常比 UNION 更快,尤其是在处理大量数据时。
需要注意的是,在使用 UNION 或 UNION ALL 操作符时,要保证 SELECT 语句中查询的列数、数据类型和顺序都一致,否则会导致合并结果集失败。
2、UNION 和 UNION ALL 的性能差异通常是由以下两个原因造成的:
去重排序操作
UNION 运算符会对结果集进行去重排序,而 UNION ALL 不会去重排序。去重排序是一个非常耗费计算资源的操作,因为需要对结果集进行排序,并且需要对每一条记录进行比较。如果结果集非常大,去重排序的代价就会非常昂贵,导致查询性能下降。
执行计划
在执行查询时,MySQL 会根据查询语句生成一个执行计划,用于指导数据库引擎执行查询操作。对于 UNION 和 UNION ALL 操作,由于它们的语义不同,生成的执行计划也会有所不同。
在执行 UNION 操作时,MySQL 需要将所有结果集合并在一起,并对结果集进行去重排序。为了完成这个操作,MySQL 通常会使用一些额外的排序算法和临时表,这些操作会增加查询的执行时间和计算负担。
相比之下,UNION ALL 操作不需要进行去重排序,因此可以避免这些额外的操作。这使得 MySQL 可以更轻松地优化 UNION ALL 查询的执行计划,提高查询性能。
综上所述,由于需要进行去重排序等额外的操作,UNION 的性能通常比 UNION ALL 差。但是,对于需要去重操作的场景,UNION 仍然是一个非常有用的操作符。

优化器对于关联查询的处理与优化

下面是大致的内部处理过程:
解析 SQL 语句:MySQL首先需要解析查询语句并生成执行计划。在这个阶段,MySQL 将检查查询中使用的表和列是否存在,并且会根据 WHERE 子句和 JOIN 条件来确定哪些索引可以使用,以及执行联接的顺序等信息。
优化执行计划:MySQL 接下来会对执行计划进行优化,目的是生成最优的执行计划。这个阶段包括以下步骤:
a. 估算查询成本:MySQL 会估算每个可能的执行计划的成本,并选择最优的执行计划。成本估算的主要依据包括查询的数据量、磁盘 I/O 操作和 CPU 负载等。
b. 选择最优的执行计划:MySQL 会比较所有可能的执行计划的成本,并选择最优的执行计划。
c. 生成执行计划:MySQL 会根据最优的执行计划,生成用于执行查询的代码。
执行联接查询:MySQL 接下来会执行联接查询,具体步骤如下:
a. 打开第一个表:MySQL 打开查询中的第一个表,并读取其中的数据。
b. 执行联接查询:MySQL 对于第一个表中的每一行,会在第二个表中查找匹配的行,并将两个表中匹配的行组合成一行。
c. 筛选结果:MySQL 根据 WHERE 子句中指定的条件对结果进行筛选。
d. 排序结果:如果有 ORDER BY 子句,则 MySQL 会对结果进行排序。
e. 分页结果:如果有 LIMIT 和 OFFSET 子句,则 MySQL 会对结果进行分页。
f. 返回结果集:最后,MySQL 将结果集返回给客户端。

如果关联查询中涉及到了很多表,那么查询优化器会尝试生成不同的执行计划,并对每个执行计划的执行代价进行评估,然后选择代价最小的执行计划。关联查询优化器在生成执行计划时,会根据查询的具体情况和数据库的统计信息等,进行综合考虑,选择最优的执行计划。

当涉及到大量的表时,查询优化器通常会采用一些特殊的算法来生成执行计划,以减少执行代价和查询时间。其中,一种常用的算法是基于动态规划的算法,该算法可以通过多次扫描表,计算出最优的执行计划,并将其缓存起来以便重复使用。
或者表关联太多就会使用贪婪算法。

此外,查询优化器还可以利用一些特殊的技术来优化查询性能,例如将关联查询中的子查询转化为连接查询,利用索引和缓存来提高查询效率等等。总之,查询优化器在处理大量表的关联查询时,会根据具体情况进行优化,并尽可能选择最优的执行计划,以提高查询性能。

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

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

相关文章

C# WPF上位机开发(抽奖软件)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 每到年末或者是尾牙的时候,很多公司都会办一些年终的清楚活动,感谢员工过去一年辛苦的付出。这个时候,作为年会…

二叉树题目:翻转二叉树以匹配前序遍历

文章目录 题目标题和出处难度题目描述要求示例数据范围 解法思路和算法代码复杂度分析 题目 标题和出处 标题:翻转二叉树以匹配前序遍历 出处:971. 翻转二叉树以匹配前序遍历 难度 5 级 题目描述 要求 给定一个二叉树的根结点 root \texttt{roo…

单电源、轨到轨输入输出、高精度运放MS8551/8552/8554

产品简述 MS8551/8552/8554 是输入输出轨到轨的高精度运算放大器,它 有极低的输入失调电压和偏置电流,单电源电压范围为 1.8V 到 5V 。 轨到轨的输入输出范围使 MS8551/8552/8554 可以轻松地放大高 电平和低电平的传感信号。所有特性使得 MS8…

「薄荷绿」风电智慧运营,有效提高运营效率和能源利用率

随着能源需求的不断增加和全球变暖的加剧,人们对可再生能源的依赖程度不断提高。其中,风能作为一种可再生能源,其清洁、环保、无污染等特点备受青睐,其发展也越来越受到政府和企业的关注。然而,由于风能的不稳定性和不…

项目管理:为什么项目计划必不可少

项目管理计划定义了如何执行、监督和控制项目。项目计划让我们准确地知道在项目的每个阶段应该做什么,在哪里分配资源和时间,以及在事情超出计划或超出预算时要注意什么。 为了项目中获得成功,管理者需要在前期创建一个项目计划&#xff0c…

如何在 PyQt 中实现异步数据库请求

需求 开发软件的时候不可避免要和数据库发生交互,但是有些 SQL 请求非常耗时,如果在主线程中发送请求,可能会造成界面卡顿。这篇博客将会介绍一种让数据库请求变得和前端的 ajax 请求一样简单,且不会阻塞界面的异步请求方法。 实…

hive映射es表任务失败,无错误日志一直报Task Transitioned from NEW to SCHEDULED

一、背景 要利用gpt产生的存放在es种的日志表做统计分析,通过hive建es的映射表,将es的数据拉到hive里面。 在最初的时候同事写的是全量拉取,某一天突然任务报错,但是没有错误日志一直报:Task Transitioned from NEW t…

Nature Communications 高时空分辨率的机器人传感系统及其在纹理识别方面的应用

前沿速览: 现有的触觉传感器虽然可以精确的检测压力、剪切力和应变等物理刺激,但还难以像人类手指一样通过滑动触摸,同时获取静态压力与高频振动来实现精确的纹理识别。为了解决这一问题,来自南方科技大学的郭传飞团队提出了衔接…

Angular 由一个bug说起之三:为什么时不时出现额外的水平/垂直滚动条?怎样能更好的防止它的出现?

目录: 什么是单元溢出 控制滚动条出现的属性 怎样能减少意外的滚动条出现 一、什么是单元溢出 在说到这个问题之前我们先简单阐述一下视图窗口(Viewport)和视图内容(View Content) 视图窗口简单来说就是呈现内容的视口,浏览器就是一个窗口&#xff…

安装Centos7

作者:余小小 下载VMware15 参考:http://t.csdnimg.cn/saS9S 下载镜像 这里使用网易镜像库下载 网易开源镜像站http://mirrors.163.com/ 网易Centos下载http://mirrors.163.com/centos/7.7.1908/isos/x86_64/ 安装Centos系统(基础设施&…

C++初阶(十四)list

📘北尘_:个人主页 🌎个人专栏:《Linux操作系统》《经典算法试题 》《C》 《数据结构与算法》 ☀️走在路上,不忘来时的初心 文章目录 一、 list的介绍二、list的模拟实现1、list的节点2、list 的迭代器3、list4、打印5、完整代码…

[LeetCode]-283. 移动零-1089. 复写零

目录 283. 移动零 描述 解析 代码 1089. 复写零 描述 解析 代码 283. 移动零 283. 移动零https://leetcode.cn/problems/move-zeroes/ 描述 给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。 请注意 &…

数据结构与算法编程题50

假设不带权有向图采用邻接矩阵G存储,设计实现以下功能的算法。 (1)求出图中每个顶点的出度。 (2)求出图中出度为0的顶点数。 (3)求出图中每个顶点的入度。 //参考博客:https://blog.…

想要精通GO语言?这些网站是你的最佳选择!

介绍:Go(又称 Golang)是由 Google 的 Robert Griesemer,Rob PGo(又称 Golang)是由 Google 的 Robert Griesemer,Rob Pike 及 Ken Thompson 开发的一种静态强类型、编译型语言。它在2009年11月10…

matplotlib与opencv图像读取与显示的问题

个人博客:Sekyoro的博客小屋 个人网站:Proanimer的个人网站 最近在用opencv和matplotlib展示图片,但是遇到了一些问题,这里展开说说 首先需要明确的是,opencv和matplotlib读取图片都是通道在最后,而前者默认可见光图像是BGR,后者是RGB.此外还有PIL以及imageio等读取图像的工具…

如何使用cpolar+Plex在Windows系统上搭建私人媒体影音站点公网可访问

文章目录 1.前言2. Plex网站搭建2.1 Plex下载和安装2.2 Plex网页测试2.3 cpolar的安装和注册 3. 本地网页发布3.1 Cpolar云端设置3.2 Cpolar本地设置 4. 公网访问测试5. 结语 1.前言 用手机或者平板电脑看视频,已经算是生活中稀松平常的场景了,特别是各…

ERP软件定制开发对企业的优势|app小程序搭建

ERP软件定制开发对企业的优势|app小程序搭建 随着科技的不断发展,企业管理也面临了更多的挑战。为了更好地适应市场需求和提高运营效率,越来越多的企业开始选择使用ERP软件进行管理。然而,市场上现成的ERP软件并不能完全满足企业的需求&#…

兰州电力博物馆 | OLED透明展示台:创新展示,增强互动体验

产品:8片55寸OLED透明屏 应用场景:OLED透明屏利用其高透明度的特点,可以叠加在文物展示台上面,这种展示方式既让观众看到了文物原貌,又能了解其内部结构和细节特点,打破空间的束缚。 项目时间&#xff1a…

opencv知识库:cv2.add()函数和“+”号运算符

需求场景 现有一灰度图像,需求是为该图像增加亮度。 原始灰度图像 预期目标图像 解决方案 不建议的方案——“”运算符 假设我们需要为原始灰度图像的亮度整体提升88,那么利用“”运算符的源码如下: import cv2img_path r"D:\pych…

SCADA软件工具有多少免费的?

随着工业自动化的飞速发展,SCADA系统已经成为工业领域智能化转型绕不开的重要工具,不少个人和公司也都加入到了学习研究SCADA系统的队伍中。数维图小编耗费大量时间整理了国内外免费(非完全免费)的SCADA软件工具,有部分…