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 将结果集返回给客户端。
如果关联查询中涉及到了很多表,那么查询优化器会尝试生成不同的执行计划,并对每个执行计划的执行代价进行评估,然后选择代价最小的执行计划。关联查询优化器在生成执行计划时,会根据查询的具体情况和数据库的统计信息等,进行综合考虑,选择最优的执行计划。
当涉及到大量的表时,查询优化器通常会采用一些特殊的算法来生成执行计划,以减少执行代价和查询时间。其中,一种常用的算法是基于动态规划的算法,该算法可以通过多次扫描表,计算出最优的执行计划,并将其缓存起来以便重复使用。
或者表关联太多就会使用贪婪算法。
此外,查询优化器还可以利用一些特殊的技术来优化查询性能,例如将关联查询中的子查询转化为连接查询,利用索引和缓存来提高查询效率等等。总之,查询优化器在处理大量表的关联查询时,会根据具体情况进行优化,并尽可能选择最优的执行计划,以提高查询性能。
相关文章:

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

短视频购物系统源码:构建创新购物体验的技术深度解析
短视频购物系统作为电商领域的新宠,其背后的源码实现是其成功的关键。本文将深入探讨短视频购物系统的核心技术和源码设计,以揭示其如何构建创新购物体验的技术奥秘。 1. 技术架构与框架选择 短视频购物系统的源码首先考虑的是其技术架构。常见的选择…...

暴力破解漏洞
暴力破解漏洞 1.1 漏洞简介1.2 漏洞影响范围1.3 漏洞详解1.3.1DVWA(1)LOW(2)Medium(3)HIGH 1.3.2 Pikachu(1)验证码绕过(on server)(2)验证码绕过(on client) 1.3.3 识别验证码(绕过)1.3.4 密码加密的情况 1.1 漏洞简介 暴力破解是一攻击具手段…...
前端成神之路-CSS基础选择器
前端成神之路-CSS基础选择器 目录 前端成神之路-CSS基础选择器 CSS选择器(重点) 1. CSS选择器作用(重点) 选择器的作用 2. CSS基础选择器 2.1 标签选择器 2.2 类选择器 2.3 类选择器特殊用法- 多类名 2.4 id选择器 id选…...

Endnote在word中加入参考文献及自定义参考文献格式方式
第一部分:在word中增加引用步骤 1、先下载对应文献的endnote引用格式,如在谷歌学术中的下载格式如下: 2、在endnote中打开存储env的格式库,导入对应下载的文件格式:file>import>file>choose,import对应文件&a…...

LeetCode力扣每日一题(Java):28、找出字符串中第一个匹配项的下标
别问我为什么今天做了两题,问就是我干概率论干废了,需要换换脑子想想不同类型的问题,所以来刷刷算法 一、题目 二、解题思路 1、我的思路 其实这题思路还挺简单的,我直接把代码放这,大家应该稍微看看就能懂 char[]…...

Java UDP 多人聊天室简易版
服务端 import java.io.*; import java.net.*; import java.util.ArrayList; public class Server{public static ServerSocket server_socket;public static ArrayList<Socket> socketListnew ArrayList<Socket>(); public static void main(String []args){try{…...

leetcode 100.相同的树
涉及到递归,最好多画图理解,希望对你们有帮助 100.相同的树 题目 给你两棵二叉树的根节点 p 和 q ,编写一个函数来检验这两棵树是否相同。 如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。 题目链接…...

2021年第十届数学建模国际赛小美赛A题气道阻力的评估解题全过程文档及程序
2021年第十届数学建模国际赛小美赛 A题 气道阻力的评估 原题再现: 气道阻力的定义是通过肺气道产生单位气流所需的经肺压力的变化。更简单地说,它是嘴和肺泡之间的压力差,除以气流。影响气道阻力的因素是多方面的,我们需要探讨这…...
内网环境安装K8S1.20.11版本集群
目录 第一章.实验要求和环境 1.1.实验要求 1.2.实验环境 1.3.依赖关系处理 第二章.K8S的安装过程 2.1.初始化到集群安装成功 ------------------------------ 环境准备 ------------------------------ docker安装好了后 2.2.安装K8组件 -------------------- 部署K8…...
【前端设计模式】之策略模式
概述 在前端开发中,我们经常会遇到需要根据不同的条件或情况来执行不同的算法或行为的情况。这时,策略模式就能派上用场。策略模式是一种行为型设计模式,它将不同的算法封装成独立的策略对象,使得这些算法可以互相替换࿰…...

JUC包(面试常问)
1. Callable接口 类似于Runnable接口,Runnable描述的任务,不带返回值;Callable描述的任务带返回值。 public class Test {//创建线程,计算12...1000public static void main(String[] args) throws ExecutionException, Interru…...

文字处理工具Word mac软件特点
Microsoft Word mac是一款文字处理软件。它是 Microsoft office 套件的一部分,已广泛用于创建、编辑和格式化文本文档。 Word mac软件特点 改进的协作工具:使用 Microsoft Word 2021,多个用户可以同时处理一个文档,从而更轻松地与…...

把 Windows 11 装进移动硬盘:Windows 11 To Go
本篇文章聊聊如何制作一个可以“说带走就带走”的 Windows 操作系统,将 Windows11 做成能够放在 U 盘或者移动硬盘里的 WinToGo “绿色软件”。 写在前面 在《开源的全能维护 U 盘工具:Ventoy》这篇文章的最后,我提到了一个关键词 “WinToG…...

11、pytest断言预期异常
官方用例 # content of test_exception_zero.py import pytestdef test_zero_division():with pytest.raises(ZeroDivisionError):1/0# content of test_exception_runtimeerror.py import pytestdef test_recursion_depth():with pytest.raises(RuntimeError) as excinfo:def…...

Vue之数据绑定
在我们Vue当中有两种数据绑定的方法 1.单向绑定 2.双向绑定 让我为大家介绍一下吧! 1、单向绑定(v-bind) 数据只能从data流向页面 举个例子: <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"…...
druid在没有web的项目中如何查看监控
(1)在这个网址下载druidStat.bat文件https://github.com/alibaba/druid/blob/master/core/src/main/scripts/druidStat.bat druidStat.bat文件内容如下: echo offset _RUNJAVA"%JAVA_HOME%\bin\java.exe" set _TOOLSJAR"%JA…...
游戏被攻击该怎么办?游戏盾该如何使用,游戏盾如何防护攻击
随着Internet互联网络带宽的增加和多种DDOS黑客工具的不断发布,DDOS拒绝服务攻击的实施越来越容易,DDOS攻击事件正在成上升趋势。出于商业竞争、打击报复和网络敲诈等多种因素,导致很多商业站点、游戏服务器、聊天网络等网络服务商长期以来一…...

【基于openGauss5.0.0简单使用DBMind】
基于openGauss5.0.0简单使用DBMind 一、环境说明二、初始化tpch测试数据三、使用DBMind索引推荐功能四、使用DBMind实现SQL优化功能 一、环境说明 虚拟机:virtualbox操作系统:openEuler 20.03 TLS数据库:openGauss-5.0.0DBMind:d…...

[递归回溯]连接卡片最短路径
小游戏 题目描述 一天早上,你起床的时候想:“我编程序这么牛,为什么不能靠这个挣点银子呢?”因此你决定编写一个小游戏。 游戏在一个分割成w * h个长方格子的矩形板上进行。如图所示,每个长方格子上可以有一张游戏…...

Docker 运行 Kafka 带 SASL 认证教程
Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明:server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...

YSYX学习记录(八)
C语言,练习0: 先创建一个文件夹,我用的是物理机: 安装build-essential 练习1: 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件,随机修改或删除一部分,之后…...
pam_env.so模块配置解析
在PAM(Pluggable Authentication Modules)配置中, /etc/pam.d/su 文件相关配置含义如下: 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块,负责验证用户身份&am…...

Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级
在互联网的快速发展中,高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司,近期做出了一个重大技术决策:弃用长期使用的 Nginx,转而采用其内部开发…...
拉力测试cuda pytorch 把 4070显卡拉满
import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试,通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小,增大可提高计算复杂度duration: 测试持续时间(秒&…...

企业如何增强终端安全?
在数字化转型加速的今天,企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机,到工厂里的物联网设备、智能传感器,这些终端构成了企业与外部世界连接的 “神经末梢”。然而,随着远程办公的常态化和设备接入的爆炸式…...

听写流程自动化实践,轻量级教育辅助
随着智能教育工具的发展,越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式,也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建,…...

AI,如何重构理解、匹配与决策?
AI 时代,我们如何理解消费? 作者|王彬 封面|Unplash 人们通过信息理解世界。 曾几何时,PC 与移动互联网重塑了人们的购物路径:信息变得唾手可得,商品决策变得高度依赖内容。 但 AI 时代的来…...

视频行为标注工具BehaviLabel(源码+使用介绍+Windows.Exe版本)
前言: 最近在做行为检测相关的模型,用的是时空图卷积网络(STGCN),但原有kinetic-400数据集数据质量较低,需要进行细粒度的标注,同时粗略搜了下已有开源工具基本都集中于图像分割这块,…...

Mysql中select查询语句的执行过程
目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析(Parser) 2.4、执行sql 1. 预处理(Preprocessor) 2. 查询优化器(Optimizer) 3. 执行器…...