MySQL 如何执行关联查询


步骤

在MySQL中任何一个查询都是一个关联。

  • 先执行子查询生成临时表;
  • 在最外层表中循环取出单条数据;
  • 嵌套循环到下内层表中寻找匹配的行,直到找到内层表所有匹配的行为止;
  • 根据各个表匹配的行,返回查询中需要的各个列。
  • MySQL会尝试在最后一个关联表中找到所有匹配的行,如果最后一个表无法找到更多的行,MySQL返回到上一层关联表,看是否能够找到更多的匹配记录,依此类推迭代执行。

joinflow

内连接

SQL语句:

SELECT tbl1.col1, tbl2.col2
       FROM tbl1 INNER JOIN tbl2 USING(col3)
       WHERE tbl1.col1 IN(5,6)

MySQL伪代码:

outer_iter = iterator over tbl1 where col1 IN(5,6)
outer_row  = outer_iter.next
while outer_row
   inner_iter = iterator over tbl2 where col3 = outer_row.col3
   inner_row  = inner_iter.next
   while inner_row
      output [ outer_row.col1, inner_row.col2 ]
      inner_row = inner_iter.next
   end
   outer_row = outer_iter.netxt
end

swimlane

外连接

SQL语句:

SELECT tbl1.col1, tbl2.col2
       FROM tbl1 LEFT OUTER JOIN tbl2 USING(col3)
       WHERE tbl1.col1 IN(5,6)

MySQL伪代码:

outer_iter = iterator over tbl1 where col1 IN(5,6)
outer_row  = outer_iter.next
while outer_row
   inner_iter = iterator over tbl2 where col3 = outer_row.col3
   inner_row  = inner_iter.next
   # 如果内层表没有匹配的行,左外连接要返回外层字段,内层字段为NULL
   if inner_row
      while inner_row
         output [ outer_row.col1, inner_row.col2 ]
         inner_row = inner_iter.next
      end
   else
      output [ outer_row.col1, NULL ]
   end
   outer_row = outer_iter.next
end