mysql join 谁是驱动表

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql join 谁是驱动表相关的知识,希望对你有一定的参考价值。

首先,mysql join连接可以连接两张或更多的数据表,但是并没有谁是“驱动表”之说。

Join分为"inner join"内连接和"outer join"外连接两种形式,外连接还可以进一步分为左连接和右连接。

内连接(inner join)只输出被连接的表它们的关联字段拥有交集的那些记录行,没交集的记录行将被剔除掉。

外连接(left join左连接/right join右连接):
"left join" 输出左表所有的记录行和右表之间关联字段拥有交集的记录行,对于右表找不到对应记录行的,数据库引擎会将空值Null赋值到右表的各个字段里。

"right join"的情况则于"left join" 刚好相反。

"inner join"——只输出表之间存在交集的那些记录行;
"left join" ——输出左表所有的记录行以及右表与之有交集的记录行,右表找不到对应
记录的,数据库引擎则将Null赋值到右表的各个字段;
"right join"——输出右表所有的记录行以及左表与之有交集的记录行,左表找不到对应
记录的,数据库引擎则将Null赋值到左表的各个字段;
参考技术A 直接使用join的时候,mysql查询优化器会自动选择数据量最小的那张表作为驱动表。
用left join的时候,左边的是驱动表。
考虑到查询效率,能用join就不要用left\right join 使用外连接非常影响查询效率,就算要用也要用数据量最小的表作为驱动表来驱动大表。

MySQL inner join判断驱动表和被驱动表的一个例子

 

下述SQL中,驱动表是S表,因为S表有过滤条件  s.emp_no in (10001,10002)。
 
 
select s.emp_no ,count(distinct e.first_name) as cnt 
      from salaries s 
  inner join employees e on e.emp_no=s.emp_no
  where s.emp_no in (10001,10002)
  group by s.emp_no
  having avg(s.salary) > 1000
  order by avg(s.salary) 
  limit 10 ;

 技术分享

 

以上是关于mysql join 谁是驱动表的主要内容,如果未能解决你的问题,请参考以下文章

关于mysql的join

Mysql Join大表小表到底谁驱动谁

MySQL索引优化(索引三表优化案例)

MySQL--什么情况下不建议使用join查询

MySQL--什么情况下不建议使用join查询

MySQL表连接之驱动表与被驱动表