任何一个关系型数据库都支持关联查询,MySQL中的关联查询中的“关联”的意义要比一般意义上理解的更广泛,MySQL认为任何一个查询都是一次“关联”,并不是一个查询要用到两个以上的表才叫“关联”。所以在MySQL中,每一个查询,每一个片段(包括子查询,甚至是基于单表的select)都可能是关联。
下面我们开一个例子:
查询学生表中计算机科学与技术系(CS)及年龄不大于19岁的学生
select * from student where sdept = 'CS'
union
select * from student where age<=19;
上面这个查询mysql会先将两个查询得到的结果放在一个临时表中,然后在从临时表中读取出数据,读取临时表也是一种关联。
MySQL执行关联的策略:
MySQL对任何关联执行的都是“嵌套循环关联”,就是先在一个表中循环取出单条数据,然后再嵌套到下一个表中寻找匹配的行,依次下去直到找到所有匹配的行为止。然后根据各个表匹配到的行,返回查询结果需要的列。MySQL会尝试在最后一个表中查找所有匹配的行,如果最后一个关联表中没有能够找到跟多的行以后,MySQL会返回到上一层的关联表中,看是否能够找到跟多的匹配的行,依次迭代。全外连接不能使用这种方式。
下面用一个图来展示这种策略:
查询语句:select col3 from table1,table2 where table1.col2 = table2.col2 and col1 in(2,3);