外部联接包括左连接
和右连接
.
MySQL实现了一个
具体如下:A.
左连接B
连接规范
表
B
设置为依赖于表A.
所有的桌子A.
视情况而定。表
A.
设置为依赖于所有表(除了B
)用于左连接
条件。这个
左连接
条件用于决定如何从表中检索行B
. (换句话说,在哪里
不使用子句。)所有标准的连接优化都会执行,但表总是在它所依赖的所有表之后读取。如果存在循环依赖,则会发生错误。
所有标准
哪里
执行优化。如果有一排
A.
符合哪里
子句,但中没有行B
符合在
条件,额外的B
在所有列都设置为的情况下生成行无效的
.如果你使用
左连接
要查找某些表中不存在的行,您需要进行以下测试:
在列名称
为空哪里
部分,在哪里列名称
是声明为不为空
,MySQL在找到一行与左连接
条件。
这个右连接
实现类似于左连接
与表角色相反。右连接将转换为等效的左连接,如中所述第8.2.1.10节,“外部连接简化”.
为了一个左连接
,如果哪里
对于生成的无效的
世界其他地区左连接
更改为内部联接。例如哪里
如果t2.1列
是无效的
:
选择*FROM t1 LEFT JOIN t2 ON(column1),其中t2.column2=5;
因此,将查询转换为内部联接是安全的:
从t1,t2中选择*其中t2.column2=5和t1.column1=t2.column1;
在MySQL8.0.14及更高版本中哪里
由常量文字表达式产生的条件在准备过程中被删除,而不是在优化的后期阶段,此时联接已经被简化。早期移除琐碎条件允许优化器将外部连接转换为内部连接;这可以改进查询的计划,这些查询的外部联接在哪里
条款,例如:
选择*从t1左连接t2开条件1哪里条件2或0=1
优化器现在在准备过程中看到0=1总是false,这使得或0=1
冗余,并将其删除,留下以下内容:
选择*从t1左连接t2开条件1哪里条件2
现在,优化器可以将查询重写为内部联接,如下所示:
从t1选择*连接t2,其中条件1以及条件2
现在优化器可以使用表t2级
餐桌前t1级
如果这样做会产生更好的查询计划。要提供关于表连接顺序的提示,请使用优化器提示;看见第8.9.3节,“优化器提示”. 或者,使用直螺纹联接
; 看见第13.2.10节,“选择语句”. 然而,直螺纹联接
可能会阻止使用索引,因为它禁用了半连接转换;看见第8.2.2.1节,“使用半连接转换优化IN和EXISTS子查询谓词”.