外连接包括LEFT JOIN和
RIGHT JOIN。
MySQL 实现如下:
A LEFT
JOIN B
join_specification
表
B被设置为依赖于表A和依赖于它的所有表A。表
A设置为依赖于条件B中使用的所有表(除了 )LEFT JOIN。LEFT JOIN条件用于决定如何从表中检索 行B。(换句话说,WHERE不使用子句中的任何条件。)执行所有标准连接优化,但始终在读取它所依赖的所有表之后读取表除外。如果存在循环依赖,则会发生错误。
执行所有标准
WHERE优化。如果其中有与子句
A匹配的行WHERE,但没有与条件B匹配的 行,则会生成ON一个额外的 行,并将所有列设置为。BNULL如果你
LEFT JOIN用来查找某个表中不存在的行,并且你有以下测试:在col_nameIS NULLWHERE部分中,wherecol_name是一个声明为的列NOT NULL,MySQL 在找到后停止搜索更多行(对于特定的键组合)符合LEFT JOIN条件 的一行。
RIGHT JOIN实现类似于LEFT JOIN表角色颠倒
的实现。右连接转换为等效的左连接,如第 8.2.1.9 节“外部连接简化”中所述。
对于 a LEFT JOIN,如果
生成的行的WHERE条件始终为假,则将更改为内部联接。例如,如果是,则该
子句
在以下查询中将为假:
NULLLEFT
JOINWHEREt2.column1NULL
SELECT * FROM t1 LEFT JOIN t2 ON (column1) WHERE t2.column2=5;因此,将查询转换为内部联接是安全的:
SELECT * FROM t1, t2 WHERE t2.column2=5 AND t1.column1=t2.column1;
现在优化器可以在表t2之前使用表,t1如果这样做会产生更好的查询计划。要提供有关表连接顺序的提示,请使用STRAIGHT_JOIN; 参见
第 13.2.9 节,“SELECT 语句”。但是,
STRAIGHT_JOIN可能会阻止使用索引,因为它会禁用半连接转换;请参阅
第 8.2.2.1 节,“使用半连接转换优化子查询、派生表和视图引用”。