首先在mysql中,关联查询并不意味着一定要涉及到多个表,基于单表的select也被视为一次关联。但是无论是单表或者多表,在mysql中都以一下方式查询:
//遍历表1的数据行
while(table_1_row.next()!=-1)
//遍历子表表2的数据行
while(table_2_row.next()!=-1)
if(符合连接条件)
......
mysql基本上将所有的关联查询类型(单表查询、子查询、连接查询)都转换为这种嵌套形式(其实全表扫描是mysql最简单最暴力的一种方式,真实情况下还会选择更优的方式,例如索引扫描,但原理基本相通)。例如使用from+子查询的方式查询时,会先将内部查询结果保存到临时表中(可能是内存,也可能是磁盘中),然后将这个临时表作为普通表对待,然后使用上面方法进行查询。
但是,并非关联查询就要用到临时表。举个例子,比如有如下一个查询语句:
select * from teacher inner join student using(teacher_id);
在这个查询中,teacher_id是两个表的索引,mysql会通过索引找到student对应的数据行,而不是直接取出某一个表作为临时表。这样就大大提高了效率,所以合理的索引对于数据库是十分重要的。