Mysql技术文档--之Mysql联查使用-快速了解联查看我这一篇就够了!国庆开卷!

news2024/11/23 9:26:08

阿丹:

        开头先祝贺大家国庆快乐!!!

在MySQL中,联结(JOIN)是用于将两个或多个表中的数据根据指定的条件进行关联查询的操作。通过联结,你可以从多个表中检索相关的数据,并将它们组合在一起,以满足查询需求。

MySQL支持多种类型的联结,以下是一些常见的联结类型:

内联结(INNER JOIN):内联结是最常用的联结类型之一。它返回两个表中满足联结条件的行。只有当两个表中的指定列具有匹配的值时,才会返回这些行的数据。

以下是一个内联结的示例:

SELECT *
FROM table1
INNER JOIN table2
ON table1.column = table2.column;

在上面的示例中,table1table2是两个要联结的表,column是它们之间用于联结的列。只有当这两个列的值相匹配时,才会返回对应的行数据。 2. 左联结(LEFT JOIN):左联结将返回左表中的所有行,以及与左表中的指定列匹配的右表中的行。如果右表中没有与左表匹配的行,那么对应的列将为NULL。

分享一个sql语句:

 SELECT r.role_id, r.role_name
        FROM t_role r
        INNER JOIN t_userandrole ur ON r.role_id = ur.role_id
        WHERE ur.user_id = #{userId}

这个是一个经典的网站五表设计,在拿到用户的id的时候查找该用户的权限集合! 

原理以及执行流程

INNER JOIN(内连接)的底层实现原理和在InnoDB中的工作流程如下:

  1. 首先,InnoDB引擎会根据联接条件从两个表中选择一个作为驱动表(Driving Table),另一个作为被驱动表(Driven Table)。

  2. 对于驱动表中的每一行,InnoDB会逐行读取被驱动表,并比较驱动表和被驱动表上的联接条件。

  3. 如果联接条件匹配,就会将匹配的行组合成一个结果集的行。结果集包含了来自两个表的符合联接条件的列。

  4. 返回结果集,该结果集包含了两个表中符合联接条件的交集部分,即联接条件匹配的行。

在内部实现中,InnoDB使用了嵌套循环算法(Nested-Loop Join)来处理INNER JOIN操作。这个算法的关键是,驱动表的每一行都需要与被驱动表中的所有行进行比较。

在实际运行过程中,可以根据表的大小、索引的使用情况以及其他优化策略来选择驱动表和被驱动表。通常情况下,选择较小的表作为驱动表是比较高效的。

需要注意的是,InnoDB引擎还使用了一些优化技术来提高INNER JOIN操作的性能,比如使用索引、使用临时表进行排序和过滤等。这些优化策略会根据具体的查询需求和表的结构来进行选择。

左联结的示例:

SELECT *
FROM table1
LEFT JOIN table2
ON table1.column = table2.column;

在上面的示例中,如果table2中没有与table1的指定列匹配的行,那么对应的列将为NULL。 3. 右联结(RIGHT JOIN):右联结与左联结相反,将返回右表中的所有行,以及与右表中的指定列匹配的左表中的行。如果左表中没有与右表匹配的行,那么对应的列将为NULL。

原理以及执行流程

LEFT JOIN(左连接)的底层实现原理和在InnoDB中的工作流程如下:

  1. 首先,InnoDB引擎会从左表中读取所有的行,并在结果集中为每一行查找匹配的右表行。

  2. 对于左表中的每一行,在被驱动表中查找满足联接条件的行:

    • 如果找到匹配的行,则将两个表的行组合成结果集的一行。
    • 如果没有找到匹配的行,则仍将左表的行包含在结果集中,并将右表的相关列填充为NULL值。
  3. 返回结果集,该结果集包含了左表中的所有行,以及右表中满足联接条件的匹配行。

在内部实现中,InnoDB引擎会使用嵌套循环算法(Nested-Loop Join)来处理LEFT JOIN操作。该算法的关键是,对于左表中的每一行,需要在右表中进行循环遍历,并比较联接条件。

在实际运行过程中,可以根据表的大小、索引的使用情况以及其他优化策略来选择左表和右表。通常情况下,选择较小的表作为左表是更高效的。

需要注意的是,InnoDB引擎还使用了一些优化技术来提高LEFT JOIN操作的性能,例如使用索引、使用临时表进行排序和过滤等。这些优化策略会根据具体的查询需求和表的结构来进行选择。

右联结的示例:

SELECT *
FROM table1
RIGHT JOIN table2
ON table1.column = table2.column;

在上面的示例中,如果table1中没有与table2的指定列匹配的行,那么对应的列将为NULL。 4. 全外联结(FULL OUTER JOIN):全外联结将返回两个表中的所有行,无论是否满足联结条件。如果某个表中的行在另一个表中没有匹配的行,那么对应的列将为NULL。

原理以及执行流程

RIGHT JOIN(右连接)的底层实现原理和在InnoDB中的工作流程如下:

  1. 首先,InnoDB引擎会从右表中读取所有的行,并在结果集中为每一行查找匹配的左表行。

  2. 对于右表中的每一行,在左表中查找满足联接条件的行:

    • 如果找到匹配的行,则将两个表的行组合成结果集的一行。
    • 如果没有找到匹配的行,则仍将右表的行包含在结果集中,并将左表的相关列填充为NULL值。
  3. 返回结果集,该结果集包含了右表中的所有行,以及左表中满足联接条件的匹配行。

在内部实现中,InnoDB引擎会使用嵌套循环算法(Nested-Loop Join)来处理RIGHT JOIN操作。该算法的关键是,对于右表中的每一行,需要在左表中进行循环遍历,并比较联接条件。

在实际运行过程中,可以根据表的大小、索引的使用情况以及其他优化策略来选择左表和右表。通常情况下,选择较小的表作为右表是更高效的。

需要注意的是,InnoDB引擎还使用了一些优化技术来提高RIGHT JOIN操作的性能,例如使用索引、使用临时表进行排序和过滤等。这些优化策略会根据具体的查询需求和表的结构来进行选择。

Union操作符是一种特殊的联结方式

它用于合并两个或多个相似的选择查询的结果集。与一般的联结操作符不同,Union操作符要求合并的每个查询必须有相同数量的列,并且每个列的数据类型必须相同。

在使用Union操作符时,可以将多个查询的结果合并成一个结果集,并自动去除重复的行。这与联结操作符INNER JOIN、LEFT JOIN、RIGHT JOIN等不同,因为这些联结操作符是根据指定的条件将两个表中的数据关联起来,而不是简单地将结果集合并。

因此,虽然Union操作符可以用于合并多个查询的结果集,但它并不属于联结操作符的范畴。

使用Union操作符时,要注意以下几点:

  1. 每个SELECT语句的列数和列的数据类型必须相同。
  2. 每个SELECT语句中的列的顺序必须相同。
  3. 每个SELECT语句中的列的数据类型必须是可以隐式转换的。
  4. Union操作符默认会进行去重,如果需要保留重复行,可以使用Union All操作符。

下面是一个Union操作符的示例:

SELECT column1, column2, ...
FROM table1
UNION
SELECT column1, column2, ...
FROM table2;

在上面的示例中,第一个SELECT语句从table1中选择列column1column2,第二个SELECT语句从table2中选择相同的列。Union操作符将两个查询的结果合并成一个结果集。注意,这里的查询结果没有重复行。如果table1table2中的数据有重复,则重复行只会出现一次。

原理以及工作流程

UNION(并集)的底层实现原理和在InnoDB中的工作流程如下:

  1. 首先,InnoDB引擎会执行每个UNION子查询,并将每个子查询的结果集合并成一个最终的结果集。

  2. 对于每个子查询,InnoDB会执行以下步骤: a. 从表中读取数据,并根据查询条件进行过滤。 b. 如果有排序要求,对结果进行排序。 c. 将排序后的结果存储在临时表中。

  3. 当所有子查询都执行完毕后,InnoDB会将各个临时表的结果集进行合并,并根据需要进行去重。

  4. 返回最终的合并结果集,该结果集包含了所有子查询的结果。

在内部实现中,InnoDB引擎会使用排序合并算法(Merge Sort Algorithm)来处理UNION操作。该算法的关键是,将各个子查询的结果集进行排序,然后按照排序顺序合并结果。

需要注意的是,UNION操作可以有不同的选项,例如UNION ALL和UNION DISTINCT。UNION ALL将保留所有子查询的结果,包括重复行;而UNION DISTINCT会对结果进行去重,确保结果中没有重复行。

在实际运行过程中,如果UNION操作涉及到大型数据集,可能需要考虑临时表的存储空间和排序的性能。可以通过合适的索引和优化查询语句来提高UNION操作的性能。

如果只是在写代码以及写一些基础语句以及面试的话上面的就够了!

下面我们开始来探索一下,这些联查的底层,是如何实现的?

其实底层就是通过特定的操作将两张表使用特定的条件关联起来。

图中就是join中的三种算法

 Nested Loop Join

Nested Loop Join(嵌套循环连接)是一种常见的连接算法,用于在关系型数据库中执行连接操作。它的底层实现是通过嵌套循环的方式按照联接条件逐行匹配连接的。

嵌套循环连接的工作流程如下:

  1. 首先,从驱动表(通常是较小表)中获取第一行数据。

  2. 对于驱动表的每一行数据,从被驱动表(通常是较大表)中逐行获取数据,并与驱动表的当前行进行比较。

  3. 如果找到匹配的行,将两个表的行组合成结果集的一行。

  4. 继续逐行获取被驱动表的数据,直到遍历完成。

  5. 对于驱动表的下一行数据,重复步骤2和步骤3,直到驱动表的所有行都被处理。

需要注意的是,嵌套循环连接的性能受到两个因素的影响:驱动表的大小和索引的使用情况。对于大型表或缺乏适当索引的表,嵌套循环连接可能会导致性能问题,因为它需要耗费大量的IO操作和比较操作。

为了提高嵌套循环连接的性能,可以考虑以下优化策略:

  • 使用索引:对于连接字段,创建索引可以减少数据访问的成本,加快连接操作的执行速度。
  • 选择合适的驱动表:将较小的表作为驱动表能够减少被驱动表的扫描次数,提高连接的效率。
  • 考虑嵌套循环连接的操作顺序:在多表连接的场景中,选择合适的连接顺序可以减少执行时间。

总结来说,嵌套循环连接是一种简单且常见的连接算法,适用于小型表或具有合适索引的表。然而,在处理大型表或缺乏索引的表时,嵌套循环连接可能会导致性能问题。在实际使用中,应该根据具体情况选择合适的连接算法和优化策略。

Hash Join

Hash Join(哈希连接)是一种常见的连接算法,用于在关系型数据库中执行连接操作。Hash Join的底层实现使用哈希表作为主要的数据结构,并通过哈希算法进行数据的匹配。

Hash Join的工作流程如下:

  1. 首先,将驱动表(通常是较小表)的数据加载到内存中,并构建一个哈希表结构,将连接字段的值作为键,对应的行数据作为值存储在哈希表中。

  2. 然后,对于被驱动表(通常是较大表)的每一行数据,使用哈希算法计算连接字段的哈希值。

  3. 根据计算得到的哈希值,在驱动表的哈希表中查找匹配的行数据。

  4. 如果找到匹配的行数据,将驱动表和被驱动表的行数据组合成结果集的一行,并返回结果。

  5. 重复步骤2到步骤4,直到被驱动表的所有行数据都被处理。

需要注意的是,Hash Join的性能受到可用内存大小、哈希冲突的数量以及连接字段的选择等因素的影响。较小的哈希表可以提高连接操作的速度,而较大的哈希表可能会产生更多的哈希冲突,降低性能。

为了提高Hash Join的性能,可以考虑以下优化策略:

  • 调整内存配置:增加可用内存可以存储更大的哈希表,从而减少哈希冲突的发生。
  • 选择合适的连接字段:选择具有高基数(Distinct Cardinality)和低重复值(Low Duplication)的字段作为连接字段,可以减少哈希冲突的概率。
  • 考虑并行执行:使用并行处理可以加速Hash Join的执行速度,通过将数据划分为多个分区并并行处理。

总结来说,Hash Join是一种高效的连接算法,适用于处理大型表或具有合适索引的表。然而,Hash Join的性能受到内存配置和连接字段的选择等因素的影响。在实际使用中,应该根据具体情况选择合适的连接算法和优化策略。

Sort Merge Join

Sort Merge Join(排序合并连接)是一种常见的连接算法,用于在关系型数据库中执行连接操作。它的底层实现通过对参与连接的数据进行排序,并使用排序后的数据进行连接。

Sort Merge Join的工作流程如下:

  1. 首先,对驱动表和被驱动表分别按照连接字段进行排序。这可以通过对表中的数据进行扫描并使用外部排序算法来完成。

  2. 排序后,使用两个指针(一个指向驱动表,一个指向被驱动表)来同时扫描排序后的表。

  3. 比较连接字段的值,如果在两个表中找到匹配的值,则将匹配的行组合成结果集的一行。

  4. 继续向前移动指针,继续比较和匹配,直到其中一个表的数据已经完全遍历。

需要注意的是,在Sort Merge Join中,驱动表和被驱动表都要先进行排序操作,因此它适用于内存中无法一次性容纳所有数据的情况。排序的开销取决于表的大小和所选字段的基数(Distinct Cardinality)。

为了提高Sort Merge Join的性能,可以考虑以下优化策略:

  • 使用索引:对连接字段创建索引可以加速排序和连接操作,减少磁盘IO的开销。
  • 内存调整:合理设置内存缓冲区的大小,以确保能够处理排序操作。
  • 并行执行:将连接操作分成多个并行任务,可以加快Sort Merge Join的执行速度。

总结来说,Sort Merge Join是一种基于排序的连接算法,适用于处理大型数据集或无法容纳在内存中的情况。然而,它需要进行排序操作,因此在性能方面需要考虑排序的开销。在实际使用中,应该根据具体情况选择合适的连接算法和优化策略。

这些策略在Mysql中的底层策略选择器已经帮助我们选择好了,还是注意规范,避免这些使用join毕竟大厂的禁用不是没有道理的。

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

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

相关文章

市场调研的步骤与技巧:助你了解市场需求

在当今快速发展的市场中,进行有效的市场研究对于了解消费者的行为、偏好和趋势至关重要。适当的市场研究可以帮助公司获得对目标受众的有价值的见解,创造更好的产品和服务,并提高客户满意度。今天,小编和大家一起讨论一下怎么做市…

10.1 今日任务:select实现服务器并发

#include <myhead.h>#define ERR_MSG(msg) do{\fprintf(stderr, "__%d__:", __LINE__); \perror(msg);\ }while(0)#define PORT 8888 //端口号&#xff0c;范围1024~49151 #define IP "192.168.112.115" //本机IP&#xff0c;ifco…

[Linux] 4.常用初级指令

pwd&#xff1a;显示当前文件路径 ls:列出当前文件夹下有哪些文件 mkdir空格文件名&#xff1a;创建一个新的文件夹 cd空格文件夹名&#xff1a;进入文件夹 cd..&#xff1a;退到上一层文件夹 ls -a&#xff1a;把所有文件夹列出来 .代表当前文件夹 ..代表上层文件夹 用…

第 365 场 LeetCode 周赛题解

A 有序三元组中的最大值 I 参考 B B B 题做法… class Solution { public:using ll long long;long long maximumTripletValue(vector<int> &nums) {int n nums.size();vector<int> suf(n);partial_sum(nums.rbegin(), nums.rend(), suf.rbegin(), [](int x…

Facebook Delos 中的虚拟共识协议

背景 Facebook 的软件系统栈一般包括两层&#xff1a;上层是数据平面&#xff0c; 下层是控制平面。 facebook software stack 数据平面包括大量的服务&#xff0c;他们需要存储和处理海量数据。控制平面用来支撑数据平面&#xff0c;起到一些控制作用&#xff1a;调度、配置…

XSS-labs

XSS常见的触发标签_xss标签_H3rmesk1t的博客-CSDN博客 该补习补习xss漏洞了 漏洞原理 网站存在 静态 和 动态 网站 xss 针对的网站 就是 动态网站 动态网站会根据 用户的环境 与 需求 反馈出 不同的响应静态页面 代码写死了 只会存在代码中有的内容 通过动态网站 用户体…

2023年中国火化设备行业现状分析:随着城市化进程的推进,市场需求将持续增长[图]

火化设备行业是指生产和提供用于尸体火化处理的设备和相关服务的行业。火化设备主要用于将尸体进行高温焚烧&#xff0c;将尸体转化为骨灰&#xff0c;以达到尸体处理和殡葬的目的。 火化设备行业优点 资料来源&#xff1a;共研产业咨询&#xff08;共研网&#xff09; 我国火…

C++面试八股(一)

目录 C和C的区别 1、语言特性 2、内存管理 3、C的库更加丰富 4、对异常的处理 什么是封装继承多态&#xff1f; 封装 继承 多态 new和malloc的区别 STL容器有哪些&#xff1f;容器对应的使用场景&#xff1f;&#xff08;挑一个你认为最熟悉的容器&#xff09; vector、…

评估指标Pre\Rec\F1\AUC

AUC的计算方法同时考虑了分类器对于正例和负例的分类能力&#xff0c;在样本不平衡的情况下&#xff0c;依然能够对分类器作出合理的评价。AUC代表模型预估样本之间的排序关系&#xff0c;即正负样本之间预测的gap越大&#xff0c;auc越大. 来自 https://blog.csdn.net/pearl8…

wustctf2020_name_your_cat

wustctf2020_name_your_cat Arch: i386-32-little RELRO: Partial RELRO Stack: Canary found NX: NX enabled PIE: No PIE (0x8048000)32位&#xff0c;开了NX和canary int shell() {return system("/bin/sh"); }有个后门函数 unsigned int…

AutoHotkey ---- 统一所有软件的快捷键(分析篇)

文章目录 引言理论编程方案 引言 快捷键大家都不陌生.但是目前的快捷键普遍存在以下几个问题。 不统一,即word、ppt、浏览器、各种编辑器、邮件客户端等等&#xff0c;都有属于自己的一套快捷键。快捷键冲突&#xff0c;即不同软件使用了相同的快捷键&#xff0c;而且作用域是…

GNN PyG~torch_geometric 学习理解

目录 1. PyG Introduction 2. PyG Installation 2.1 PyG 安装常见错误及原因 2.2 PyG 具体安装步骤 3. torch_geometric packages torch_geometric.data.Data Dataset 与 DataLoader Dropout、BatchNorm 3. torch_geometric: 理解edge_index 3.1 理解 mini-batch edg…

[H5动画制作系列]帧代码运行顺序测试

刚开始接触Animate CC(过去叫:Flash),对于帧代码的执行顺序十分迷惑。所以,专门做一个简单代码顺序测试. 准备工作: 代码图层actions,第1帧和第10帧为关键帧。 背景图层bg,就一个字符串红色Test.界面如下: 代码测试步骤: 第1帧参考代码如下: 第10帧参考代码如下: …

​68条萝卜刀《乡村振兴战略下传统村落文化旅游设计》许少辉八一新书

​68条萝卜刀《乡村振兴战略下传统村落文化旅游设计》许少辉八一新书 ​68条萝卜刀《乡村振兴战略下传统村落文化旅游设计》许少辉八一新书

打包python模块代码到pypi

python中&#xff0c;我们会在自己业务中&#xff0c;重复性的使用某些功能。我们可以把这些公用的模块&#xff0c;打包上传&#xff0c;然后给需要的人使用&#xff0c;pypi给我们提供了这个机会 本期目录 一、准备工作 二、编写文件 三、上传下载 一、准备工作 1、需要git…

k8s实战案例之部署Nginx+Tomcat+NFS实现动静分离

1、基于镜像分层构建及自定义镜像运行Nginx及Java服务并基于NFS实现动静分离 1.1、业务镜像设计规划 根据业务的不同,我们可以导入官方基础镜像,在官方基础镜像的基础上自定义需要用的工具和环境,然后构建成自定义出自定义基础镜像,后续再基于自定义基础镜像,来构建不同服…

软件测试之Python基础学习

目录 一、Python基础 Python简介、环境搭建及包管理 Python简介 环境搭建 包管理 Python基本语法 缩进(Python有非常严格的要求) 一行多条语句 断行 注释 变量 基本数据类型(6种) 1. 数字Number 2. 字符串String 3. 列表List 4. 元组Tuple 序列相关操作方法 …

Unity 鼠标悬浮时文本滚动(Text Mesh Pro)

效果 直接将脚本挂载在Text Mesh Pro上&#xff0c;但是需要滚动的文本必须在Scroll View中&#xff0c;否侧会定位错误&#xff0c;还需要给Scroll View中看需求添加垂直或者水平布局的组件 代码 using System.Collections; using System.Collections.Generic; using UnityE…

【生物信息学】使用谱聚类(Spectral Clustering)算法进行聚类分析

目录 一、实验介绍 二、实验环境 1. 配置虚拟环境 2. 库版本介绍 3. IDE 三、实验内容 0. 导入必要的工具 1. 生成测试数据 2. 绘制初始数据分布图 3. 循环尝试不同的参数组合并计算聚类效果 4. 输出最佳参数组合 5. 绘制最佳聚类结果图 6. 代码整合 一、实验介绍…

【BLIP/BLIP2/InstructBLIP】一篇文章快速了解BLIP系列(附代码讲解说明)

文章目录 BLIP系列1. BLIP1.1 动机1.2 整体架构1.3 损失函数1.4 Captioning and Filtering(CapFilt)1.4.1 Why&#xff1f;1.4.2 方法 2. BLIP22.1 Q-Former的设计2.2 实现功能2.2.1 图像文本检索(Image-Text Retrieval)2.2.2 图像字幕(Image Captioning)2.2.3 视觉问答(VQA)2.…