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