MySQL连接查询到底什么是驱动表?看了这里你应该就明白了


MySQL连接查询到底什么是驱动表?看了这里你应该就明白了

文章插图
 
作者:阿伟~
链接:https://www.cnblogs.com/sy270321/p/12760211.html
准备我们需要的表结构和数据两张表 studnet(学生)表和score(成绩)表,创建表的SQL语句如下
CREATE TABLE `student` (
  `id` int(11) NOT NULL,
  `no` varchar(20) DEFAULT NULL,
  `name` varchar(20) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE `score` (
  `id` int(11) NOT NULL,
  `no` varchar(20) DEFAULT NULL,
  `chinese` double(4,0) DEFAULT NULL,
  `math` double(4,0) DEFAULT NULL,
  `engilsh` double(4,0) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;MySQL连接查询分为以下三种left join 左连接,用法如下,这种查询会把左表(student)所有数据查询出来,右表不存在的用空表示,结果图如下
select * from student s1 left join score  s2 on  s1.on = s2. on
MySQL连接查询到底什么是驱动表?看了这里你应该就明白了

文章插图
 
right join 右连接, 用法如下,这种查询会把右表(score)所有数据查询出来,左表不存在的用空表示,结果图如下
select * from student s1 right join score s2 on s1.no = s2.no
MySQL连接查询到底什么是驱动表?看了这里你应该就明白了

文章插图
 
inner join 内连接,用法如下,这种查询会把左右表都存在的数据查询出来,不存在数据忽略,结果图如下
select * from student s1 inner join score s2 on s1.no = s2.no
MySQL连接查询到底什么是驱动表?看了这里你应该就明白了

文章插图
 
连接查询中需要注意的点什么是驱动表,什么是被驱动表,这两个概念在查询中有时容易让人搞混,有下面几种情况,大家需要了解 。
  1. 当连接查询没有where条件时,左连接查询时,前面的表是驱动表,后面的表是被驱动表,右连接查询时相反,内连接查询时,哪张表的数据较少,哪张表就是驱动表
  2. 当连接查询有where条件时,带where条件的表是驱动表,否则是被驱动表
【MySQL连接查询到底什么是驱动表?看了这里你应该就明白了】怎么确定我们上面的两种情况呢,执行计划是不会骗人的,我们针对上面情况分别看看执行计划给出的答案
首先第一种情况,student表中3条数据,score表中2条数据,但两张表中只有一条数据是关联的(编号是1),看如下SQL查询
//左连接查询
explain select * from student s1 left join score s2 on s1.no = s2.no
//右连接查询
explain select * from student s1 right join score s2 on s1.no = s2.no
//内连接查询
explain select * from student s1 inner join score s2 on s1.no = s2.no
执行计划中靠前的表是驱动表,我们看下面三种图中,是不是全度符合情况一,第一张图中s1是驱动表,第二张图中s2是驱动表,第三种途中s2是驱动表
MySQL连接查询到底什么是驱动表?看了这里你应该就明白了

文章插图
 

MySQL连接查询到底什么是驱动表?看了这里你应该就明白了

文章插图
 

MySQL连接查询到底什么是驱动表?看了这里你应该就明白了

文章插图
 
其次第二种情况,还是上面三种SQL语句,我们分别加上where条件,再来看看执行计划的结果是什么样呢?
//左连接查询
explain select * from student s1 left join score s2 on s1.no = s2.no
where s2. no = 1
//右连接查询
explain select * from student s1 right join score s2 on s1.no = s2.no
where s1.no = 1
//内连接查询
explain select * from student s1 inner join score s2 on s1.no = s2.no
where s1.no = 1
我们看下面三种执行计划结果,全都以where条件为准了,而且跟上面情况一的都相反了,因此情况二也是得到了验证.
MySQL连接查询到底什么是驱动表?看了这里你应该就明白了

文章插图
 

MySQL连接查询到底什么是驱动表?看了这里你应该就明白了

文章插图
 

MySQL连接查询到底什么是驱动表?看了这里你应该就明白了

文章插图
 
连接查询优化要理解连接查询优化,得先理解连接查询的算法,连接查询常用的一共有两种算法,我们简要说明一下
Simple Nested-Loop Join Algorithms (简单嵌套循环连接算法)比如上面的查询中,我们确定了驱动表和被驱动表,那么查询过程如下,很简单,就是双重循环,从驱动表中循环获取每一行数据,再在被驱动表匹配满足条件的行 。


推荐阅读