广告
返回顶部
首页 > 资讯 > 数据库 >什么是MySQL 连接查询
  • 231
分享到

什么是MySQL 连接查询

2024-04-02 19:04:59 231人浏览 八月长安
摘要

什么是Mysql 连接查询?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。          

什么是Mysql 连接查询?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

                                                       

1 作用

数据库join操作被称为连接,作用是能连接多个表的数据(通过连接条件),从多个表中获取数据合并在一起作为结果集返回给客户端。例如:

表A:

idnameage
1A18
2B19
3C20

表B:

iduidgender
11F
22M

通过连接可以获取到合并两个表的数据:

select A.*,B.gender from  A left join B on A.id=B.uid
idnameagegender
1A18F
2B19M
3C20null

2 连接关键字

连接两个表我们可以用两个关键字:onusingon可以指定具体条件,using则指定相同名字数据类型的列作为等值判断的条件,多个则通过逗号隔开。
如下:

on: select * from A join B on A.id=B.id and B.name=''
using: select * from A join B using(id,name) = select * from A join B on 
A.id=B.id and A.name=B.name

3 连接类型

3.1 内连接

内连接和交叉连接
  • 语法:A  join | inner join |  cross join B
  • 表现:A和B满足连接条件记录的交集,如果没有连接条件,则是A和B的笛卡尔积
  • 特点:在mysql中,cross joininner joinjoin所实现的功能是一样的。因此在Mysql的官方文档中,指明了三者是等价的关系。
隐式连接
  • 语法:from A,B,C
  • 表现:相当于无法使用onusingjoin
  • 特点:逗号是隐式连接运算符。 隐式连接是SQL92中的标准内容,而在SQL99中显式连接才是标准,虽然很多人还在用隐私连接,但是它已经从标准中被移除。从使用的角度来说,还是推荐使用显示连接,这样可以更清楚的显示出多个表之间的连接关系和连接依赖的属性。

3.2 外连接

左外连接
  • 语法:A left join B
  • 表现:左表的数据全部保留,右表满足连接条件的记录展示,不满足的条件的记录则全是null
右外连接
  • 语法:A right join B
  • 表现:右表的数据全部保留,左表满足连接条件的记录展示,不满足的条件的记录则全是null
全外连接

MySQL不支持全外连接,只支持左外连接和右外连接。如果要获取全连接的数据,要可以通过合并左右外连接的数据获取到,如 select * from A left join B on A.name = B.name  uNIOn  select * from A right join B on B.name = B.name;

这里union会自动去重,这样取到的就是全外连接的数据了。

3.3 自然连接

  • 语法:A natural join B ==== A natural left join B ==== A natural right join B
  • 表现:相当于不能指定连接条件的连接,MySQL会使用左右表内相同名字和类型的字段作为连接条件。
  • 特点:自然连接也分自然内连接,左外连接,右外连接,其表现和上面提到的一致,只是连接条件由MySQL自动判定。

4 执行顺序

在连接过程中,MySQL各关键字执行的顺序如下:

from -> on|using -> where -> group by -> having -> select -> order by -> 
limit

可以看到,连接的条件是先于where的,也就是先连接获得结果集后,才对结果集进行where筛选,所以在使用join的时候,我们要尽可能提供连接的条件,而少用where的条件,这样才能提高查询性能。

5 连接算法

join有三种算法,分别是Nested Loop JoinHash joinSort Merge Join。MySQL官方文档中提到,MySQL只支持Nested Loop Join这一种算法。

具体来说Nested Loop Join又分三种细分的算法:

  • SNLJ
  • BNLJ
  • INLJ

我们来看下对于连接语句select * from A left join B on A.id=B.tid,这三种算法是怎么连接的。

5.1 Simple Nested Loop Join(SNLJ)

SNLJ是在没有使用到索引的情况下,通过两层循环全量扫描连接的两张表,得到符合条件的两条记录则输出。也就是让两张表做笛卡尔积进行扫描,是比较暴力的算法,会比较耗时。其过程如下:

for (a in A) {
     for (b in B) {
         if (a.id == b.tid) {
             output <a, b>;
         }
     }
 }

当然,MySQL即使在无索引可用,或者判断全表扫描可能比使用索引更快的情况下,还是不会选择使用过于粗暴的SNLJ算法,而是采用下面的算法。

5.2 Block Nested Loop Join(BNLJ)

INLJ是MySQL无法使用索引的时候采用的join算法。会将外层循环的行分片存入join buffer, 内层循环的每一行与整个buffer中的记录做比较,从而减少内层循环的次数,具体逻辑如下:

for (blockA in A.blocks) {
     for (b in B) {
         if (b.tid in blockA.id) {
             output <a, b>;
         }
     }
 }

相比于SNLJ算法,BNLJ算法通过外层循环的结果集的分块,可以有效的减少内层循环的次数。

原理

举例来说,外层循环的结果集是100行,使用SNLJ算法需要扫描内部表100次,如果使用BNLJ算法,假设每次分片的数量是10,则会先把对Outer Loop表(外部表)每次读取的10行记录放到join buffer,然后在InnerLoop表(内部表)中每次循环都直接匹配这10行数据,这样内层循环只需要10次,对内部表的扫描减少了9/10,所以BNLJ算法就能够显著减少内层循环表扫描的次数。

当然这里,不管SNLJ还是BNLJ算法,他们总的比较次数都是一样的,都是要拿外层循环的每一行与内层循环的每一行进行比较。

BNLJ算法减少的是总的扫描行数,SNLJ算法是外层循环要一行行扫描A表的数据,然后取A.id去表B一行行扫描看是否匹配。而BNLJ算法则是外层循环要一行行扫描A表的数据,然后放到内存分块里,然后去表B一行行扫描,扫描出来的B的一行数据与内存分块里的A的数据块进行比较。这里可以一次就是很多行A的数据与B的数据进行比较,而且是在内存中进行比较,速度更加快了。

影响因素

这里BNLJ算法总的扫描行数是由外层循环的数据量N,和分块数量K还有内层循环的数据量M决定的。其中分块数量K与外层循环的数据量N又是息息相关的,我们可以表示为λN,其中λ取值为(0~1)。则总扫描次数C=N+λNM

可以看出,在这个式子里,Nλ的大小都会影响扫描行数,但是λ才是影响扫描行数的关键因素,这个值越小越好(除非NM的差值非常大,这时候N才会成为关键影响因素)。

那什么会影响 λ 的大小呢?那就是 MySQL的join_buffer_size设置项的大小了。λjoin_buffer_size成倒数关系,join_buffer_size越大,分块越大,λ越小,分块数量也就越少,也就是外层循环的次数也越少。所以在使用不上索引的时候,我们要优先考虑扩大join_buffer_size的大小,这样优化效果会更明显。而在能使用上索引的时候,MySQL会使用以下算法来进行join

5.3 Index Nested Loop Join(INLJ)

INLJ是MySQL判断能使用到被驱动表的索引的情况下采用的算法。假设A表的数据行为10,B表的数据行为100,且B.tid建立了索引,则对于select * from A left join B on A.id=B.tid,MySQL会采用Index Nested Loop Join。其过程如下:

for (a in A) {
     if (a.id in B.tid.Index) {
        output <a, tid.Index所在行>;
     }
 }

总共需要循环10次A,每次循环的时候通过索引查询一次B的数据。而如果我们反过来是B left join A的话,总共要循环100次B,由此可见如果使用join的话,需要让小表做驱动表,这样才能有效减少循环次数。但是需要注意的是,这个结论的前提是可以使用被驱动表的索引。

INLJ内层循环读取的是索引,可以减少内存循环的次数,提高join效率,但是也有缺点的,就是如果扫描的索引是非聚簇索引,并且需要访问非索引的数据,会产生一个回表读取数据的操作,这就多了一次随机的I/O操作。例如上面在索引里匹配到了tid,还要去找tid所在的行在磁盘所在的位置,具体可以见我以前的文章:MySQL索引详解之索引的存储方式。

6 注意点

  • 尽量增加连接条件,减少join后数据集的大小
  • 用小结果集驱动大结果集,将筛选结果小的表首先连接,再去连接结果集比较大的表
  • 被驱动表的被join的字段要建立索引,且使用上索引。使用上索引包括使用该字段,且不会有索引失效的情况出现
  • 设置足够大的join_buffer_size

7 外连接常见问题

Q:如果想筛选驱动表的数据,例如左连接筛选左表的数据,该在连接条件还是where筛选?
A:要通过where筛选,连接条件只影响连接过程,不影响连接返回的结果数(某些情况下连接条件会影响连接返回的结果数,例如左连接中,右侧匹配的数据不唯一的时候)

Q:被驱动表匹配的数据行不唯一导致最终连接数据超过驱动表数据量该怎么办?例如对于左连接,右表匹配的数据行不唯一。
A:join之前先对被驱动表去重,例如通过group by去重:A lef join (select * from B group by name)


看完上述内容,你们掌握什么是MySQL 连接查询的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注编程网数据库频道,感谢各位的阅读!

您可能感兴趣的文档:

--结束END--

本文标题: 什么是MySQL 连接查询

本文链接: https://www.lsjlt.com/news/43861.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 什么是MySQL 连接查询
    什么是MySQL 连接查询?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。          ...
    99+
    2022-10-18
  • MySQL连接查询是什么
    这篇文章主要为大家展示了“MySQL连接查询是什么”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“MySQL连接查询是什么”这篇文章吧。内连接内连接INNERJOIN是最常用的连接操作。从数学的角...
    99+
    2023-06-29
  • MySQL连接查询的方法是什么
    这篇文章主要介绍“MySQL连接查询的方法是什么”,在日常操作中,相信很多人在MySQL连接查询的方法是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”MySQL连接查询的...
    99+
    2022-10-19
  • Mysql连接join查询的原理是什么
    Mysql连接join查询的原理是什么,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。Mysql连接(join)查询1、基本概念将两个表的每...
    99+
    2022-10-18
  • MySQL内连接查询的方法是什么
    本篇内容介绍了“MySQL内连接查询的方法是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!内连接也叫连接,是最早的一种连接。还可以被称为...
    99+
    2023-06-27
  • 什么是oracle连接查询
    本篇内容主要讲解“什么是oracle连接查询”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“什么是oracle连接查询”吧!Oracle连接查询Oracle连接查...
    99+
    2022-10-18
  • mysql连接查询
    11.5连接查询(列连接) 问题:学生表有十条数据,成绩表有十条数据。 连接之后有多少条数据(笛卡尔积):10*10=100   连续查询会产生笛卡尔积;假设集合A = {a,b},集合B = {c,d} 两个集合的笛卡尔积{(a,c),...
    99+
    2020-01-06
    mysql连接查询
  • mysql全连接和oracle全连接查询的区别是什么
    本篇内容介绍了“mysql全连接和oracle全连接查询的区别是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学...
    99+
    2023-03-20
    mysql oracle
  • 连接查询(多表查询)——MySQL
    连接查询(多表查询) 又称多表查询,当查询的字段涉及多个表的时候,就要用到连接查询 分类: 为表起别名: 提高语句的简洁度区分多个重名字段注意:如果为表起了别名,则查询的字段就不能使用原来的别名去限定 内连接 查询A、B 交集部分数据 语...
    99+
    2023-08-18
    数据库 mysql 多表查询
  • MYSQL自连接查询
    MYSQL自连接查询 概念:左表和右表是同一个表,根据连接查询条件查询两个表中的数据. 说明: ​ (1)自连接查询必须对表起别名; ​ 2) 自连接的使用方法和内连接,左连接,右连接完全相同,只不过连接的左表和右表是同一张表. 案例 CR...
    99+
    2023-08-20
    mysql 数据库 sql
  • mysql 连接查询(俗称连表查询)内连接、外连接、自然连接
    连接查询的分类 本文讨论中用到的测试数据``create table student(id int primary key auto_increment,name varchar(10));ins...
    99+
    2022-10-18
  • MySQL之连接查询和子查询
    多表连接的基本语法 多表连接,就是将几张表拼接为一张表,然后进行查询 select 字段1, 字段2, ... from 表1 {inner|lift|right} join 表2 on 连接条件; 有如下两张表:部门表和员工...
    99+
    2015-01-24
    MySQL之连接查询和子查询
  • mysql中外连接与内连接查询有什么区别
    mysql中外连接与内连接查询有什么区别?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。左外连接左外连接的结果集包含左表的所有记录和右表中满足连接条件的记录,结果...
    99+
    2023-06-15
  • Mysql Join-连接查询(中)
    Mysql Join-连接查询(中) 认识 就我平时的数据接触来看, 连接查询也没有很复杂,不够是非常需要耐心和逻辑的, 一点点将数据查出来, 拼接等. 没有什么技巧, 多练习就会了. 无非就是表之间根据共同key来连接, 查询时结合uni...
    99+
    2016-09-20
    Mysql Join-连接查询(中)
  • mysql连接查询详解
    目录1.连接查询2、连接类型内连接定义:语法1: 语法2: 3个表连接显示指定列左连接定义:语法:右连接  定义:语法:自关联定义 ...
    99+
    2022-11-13
  • mysql外连接查询怎么用
    本篇内容主要讲解“mysql外连接查询怎么用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“mysql外连接查询怎么用”吧!说明外连接不仅返回符合连接和查询条件的数据行,还返回一些不符合条件的行。...
    99+
    2023-06-20
  • MySQL中的连接查询(等值连接)
    目录1. 笛卡尔乘积2. 分类(1)按年代分类(2)按功能分类3. 等值连接4. 总结1. 笛卡尔乘积 表1有m行数据,表2有n行数据,查询结果有m*n行数据。 2. 分类 (1)按年代分类 sql92标准:仅支持内连接...
    99+
    2022-07-20
    MySQL连接查询 MySQL等值连接 MySQL中的查询
  • mysql连接查询中and与where的区别是什么
    小编给大家分享一下mysql连接查询中and与where的区别是什么,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!1. 建表CREATE TA...
    99+
    2023-06-20
  • Mysql数据库连接查询
        Mysql数据库连接查询连接是关系数据库模型的主要特点。连接查询是关系数据库中最主要的查询,主要包括内连接、外连接等。通过连接运算可以实现多个表查询。当查询数...
    99+
    2022-10-18
  • MYSQL数据库--连接查询
    连接查询 连接是把不同表的记录连到一起的最普遍的方法。一种错误的观念认为由于MySQL的简单性和源代码开放性,使它不擅长连接。这种观念是错误的。MySQL从一开始就能够很好地支持连接,现在还以支持标准的S...
    99+
    2022-10-18
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作