)
第 16.1 节:连接的可视化如果你是一个视觉型的人,下面的维恩图可能有助于理解 MySQL 中存在的不同类型的JOIN。[图片占位符:维恩图展示了 INNER JOIN、LEFT JOIN、RIGHT JOIN、OUTER JOIN 等]第 16.2 节:带子查询的连接(派生表)SELECTx,...FROM(SELECTy,...FROM...)ASaJOINtblONtbl.x=a.yWHERE...;这将把子查询的结果计算到一个临时表中,然后将其与tbl进行连接。在 MySQL 5.6 之前,临时表上不能有索引。因此,以下写法可能非常低效:SELECT...FROM(SELECTy,...FROM...)ASaJOIN(SELECTx,...FROM...)ASbONb.x=a.yWHERE...;从 5.6 开始,优化器会找出最佳索引并即时创建它(这有一定的开销,所以仍然不是“完美”的)。另一个常见的范式是使用子查询来初始化某些内容:SELECT@n:=@n+1,...FROM(SELECT@n:=0)ASinitializeCROSSJOINthe_real_tableORDERBY...;(注意:从技术上讲,这是一个CROSS JOIN(笛卡尔积),因为没有ON子句。但由于子查询只返回一行,需要与the_real_table的 n 行匹配,所以效率很高。)第 16.3 节:完全外连接(FULL OUTER JOIN)MySQL 不支持FULL OUTER JOIN,但有一些方法可以模拟它。设置数据表结构owners:DROPTABLEIFEXISTS`owners`;CREATETABLE`owners`(`own