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 谁是驱动表的主要内容,如果未能解决你的问题,请参考以下文章