介绍
Outer joins包含LEFT JOIN和RIGHT JOIN.
MySQL实现了一个A LEFT JOIN B join_condition,如下所示:
- 表B设置为依赖于表A和A所依赖的所有表。
- 表A设置为依赖于LEFT JOIN条件中使用的所有表(B除外)。
- LEFT JOIN条件用于决定如何从表B中检索行。(换句话说,不使用WHERE子句中的任何条件。)
- 执行所有标准连接优化,但始终在所依赖的所有表之后读取表。 如果存在循环依赖关系,则会发生错误。
- 执行所有标准WHERE优化。
- 如果A中有一行与WHERE子句匹配,但B中没有与ON条件匹配的行,则会生成一个额外的B行,并将所有列设置为NULL。
- 如果使用左联接查找某些表中不存在的行,则进行以下测试:在Where条件里设置col_name is null,在表定义中col_name定义这列is not null,MySQL在找到与LEFT JOIN条件匹配的行后停止搜索更多行(对于特定的键组合)。
RIGHT JOIN实现类似于LEFT JOIN的实现,表格角色颠倒过来。
对于LEFT JOIN,如果生成的空行的WHERE条件总是false,则将LEFT JOIN更改为inner join。则将左连接更改为内部联接。例如,如果t2.column1为NULL,则WHERE子句在以下查询中将为false:
SELECT * FROM t1 LEFT JOIN t2 ON (column1) WHERE t2.column2=5;
因此,将查询转换为inner join是安全的:
SELECT * FROM t1, t2 WHERE t2.column2=5 AND t1.column1=t2.column1;
现在优化器可以在表t1之前使用表t2,如果这样做会导致更好的查询计划。