MySQL JOIN链接查询知识点

MySQL JOIN链接查询知识点

MySQL支持的join操做:JOIN、STRAIGHT_JOIN、LEFT JOIN、RIGHT JOIN。不支持FULL OUTER JOIN。html

在MySQL中,JOIN, CROSS JOIN, 和INNER JOIN相互等价。可是在正常的SQL标准中,他们是不等价的。INNER JOIN一般和ON字句一块儿使用,CROSS JOIN以其余方式使用。mysql

MySQL使用大名鼎鼎的Nested-Loop Join算法来执行Join操做的。算法

在使用join查询时须要考虑的因素

  • 当没有链接条件的时候,INNER JOIN和','在语义上是等价的:在指定的表之间生成笛卡尔积(也就是说,第一个表中的每行跟第二个表的每行做链接)。
  • 在ON子句指定如何链接两个表,在where子句约束要返回的结果集。
  • 经过STRAIGHT_JOIN能够强制指定两个表的链接顺序,即左边的表在右边的表以前加载。

LEFT JOIN和RIGHT JOIN优化

MySQL以以下方式执行 A LEFT JOIN B join_condition:sql

  • 表B被设置为依赖于表A和表A依赖的全部表。
  • 表A被设置为依赖于left join条件中使用的全部表(除了表B)。
  • left join条件被用来决定如何从表B检索行。(也就是说,不会使用where子句中的条件)
  • 执行全部的标准join优化,一个表老是在他所依赖的全部表被读取以后才会被读取。若是有表循环依赖,MySQL会提示错误。
  • 执行全部的标准where优化。
  • 若表A中的某行匹配where子句,可是表B中没有匹配ON子句的行,则表B会生成一个全部列都为NULL的行。
  • 若使用left join查询表中不存在的行,例如:where子句包含条件 col_name IS NULL,col_name列被声明为NOT NULL,MySQL在匹配到LEFT JOIN条件的一行后会中止查询更多的行。

注意:使用left join的时候先使用on子句的条件检索行,最后再根据where子句条件过滤结果集。而不会在检索表B的时候使用where条件过滤。可是在使用join的时候,过滤条件放在on子句和放在where子句是同样的。oop

STRAIGHT_JOIN说明

STRAIGHT_JOIN is similar to JOIN, except that the left table is always read before the right table. This can be used for those (few) cases for which the join optimizer puts the tables in the wrong order.优化

这句话的意思就是:除了STRAIGHT_JOIN能够指定左表在右表以前被读取以外,STRAIGHT_JOINJOIN是相似的。当MySQL的join优化器载入表的顺序不是最优的时候,可使用STRAIGHT_JOIN来指定。code

联表查询的基础知识

  • 因为MySQL索引是基于B-Tree的,因此组合索引有”字段顺序“概念。当查询条件中有cat2 in (1,2),而组合索引是(cat1,cat2),则该查询没法使用到这个组合索引。
  • MySQL表关联的算法是Nest Loop Join
  • Join,是经过驱动表的结果集做为循环基础数据,而后一条一条地经过该结果集中的数据做为过滤条件到下一个表中查询数据,而后合并结果。
  • EXPLAIN 结果中,对于序号相同的记录第一行出现的表就是驱动表(Important!)
  • 驱动表能够直接排序,对非驱动表(的字段排序)须要对循环查询的合并结果(临时表)进行排序!(Important!)
  • 当进行多表链接查询时,驱动表的定义为:
    1. 指定了联接条件时,知足查询条件的记录行数少的表为[驱动表];
    2. 未指定联接条件时,行数少的表为[驱动表](Important!)。

参考:htm

相关文章
相关标签/搜索