mysql驱动语句 mysql的连接驱动是什么

关注我,不迷路,以便看分享 。

mysql驱动语句 mysql的连接驱动是什么

文章插图
什么是straight_join
join的类别
说到straight_join,就不提起我们平时在写SQL语句的关联的时候,经常使用到的几种关联方式 。具体有如下几中join的方式:
inner join:内连接 。最后返回的数据行数是在inner join前后两张表中同时存在的数据行数 。任何一条只存在于某一张表中的数据,都不会返回,left join:左连接,又称为left outer join,我们平时都把outer省略 。简写为left joinleft左边的表为主表,left右边的表为从表 。返回结果行数以left左边的表的行数为最后的数据行,对于左表中有些数据行在右表中找不到它所匹配的数据行记录时候,返回结果的时候这些行后面通常会以null来填充 。right join:右连接,又称为right outer join,我们平时都把outer省略 。简写为right joinright右边的表为主表,right坐标的表为从表 。返回结果行数以right右边的表的行数为左后的数据行,对于主表中有些数据行在从表中找不到它所匹配的数据行记录时候,返回结果的时候这些行后面通常会以null来填充 。full join:全连接 。最后返回的数据行数是full join前后两张表的数行数的笛卡尔积 。但是MySQL中没有这种写法,它直接使用select * from A,B;这样的写法就可以实现全连接 。Oracle中有full join这种写法 。理解了上面的几个join的区别后,接下来我们来创建两个表student和score来实际操一下 。下面是我们实际操作的时候,需要使用到的SQL语句,其中包括的表的DDL语句和DML语句 。
CREATE TABLE `student` (`id` int PRIMARY KEY auto_increment NOT NULL,`code` varchar(20) DEFAULT NULL,`name` varchar(20) DEFAULT NULL) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;CREATE TABLE `score` (`id` int PRIMARY KEY auto_incrementNOTNULL,`code` varchar(20) DEFAULTNULL,`chinese` double(4,0) DEFAULT NULL,`math` double(4,0) DEFAULT NULL,`engilsh` double(4,0) DEFAULT NULL) ENGINE=InnoDB DEFAULTCHARSET=utf8mb4;insert into student values(1,'0001','张三');insert into student values(2,'0002','李四');insert into student values(3,'0003','王五');insert into score values(1,'0001',98,92,94);insert into score values(2,'0002',90,93,97);insert into score values(3,'0004',78,77,80);insert into score values(4,'0005',66,87,99);insert into score values(5,'0006',87,90,96);insert into score values(6,'0007',78,88,99);select * from student;select * from score;select * from student as a left join score as b on a.code = b.code;select * from student as a right join score as b on a.code = b.code;select * from student as a inner join score as b on a.code = b.code;select * from student as a cross join score as b on a.code = b.code;select * from student as a, score as b;
student表中的数据如下:
mysql驱动语句 mysql的连接驱动是什么

文章插图
score表中的数据如下:
mysql驱动语句 mysql的连接驱动是什么

文章插图
student inner jion score的结果如下:
mysql驱动语句 mysql的连接驱动是什么

文章插图
student left join score的结果如下:
mysql驱动语句 mysql的连接驱动是什么

文章插图
student right join score的结果如下:
mysql驱动语句 mysql的连接驱动是什么

文章插图
student full join score的结果如下:
mysql驱动语句 mysql的连接驱动是什么

文章插图
straight_join
而我们要讨论的straight_join的含义和上面的inner join有些类似,它也是对两个表进行inner join的操作,但是它属于一种特殊的inner join 。
在关联查询的时候,inner join会根据两个关联的表的大小自动的选择哪一个表作为驱动表,哪一个表作为被驱动表 。这个由MySQL内部的优化器自己去选择的 。但是MySQL的优化器也不是100%靠谱,有时候由于我们对表频繁的CURD操作,表的统计信息也可能不够准确,所以它也会选择错误的优化方案 。比如选择了错误的表作为驱动表,这样将导致我们的查询效率变得很低 。
对于上述的这种情况,我们可以手动的去指定让MySQL去选择哪个作为驱动表哪个作为被驱动表吗?答案是肯定的,此时的straight_join就上场了 。
它的功能是可以指定在straight_join前面的表作为驱动表,在straight_joion后面的表作为被驱动表 。这样我们就可以指定让MySQL选择哪个表作为驱动表哪个表作为被驱动表了 。
MySQL官网给straight_join的解释是下面这样的:
STRAIGHT_JOIN is similar to JOIN, except that the left table is always read before the right table. This can be used for those (few) cases for which the join optimizer processes the tables in a suboptimal order.


推荐阅读