连接分类
连接 | 语法 | 作用 |
---|---|---|
左外连接 | left join | 返回左表中所有的记录以及右表中连接字段相等的记录 |
右外连接 | right join | 返回右表中所有的记录以及左表中连接字段相等的记录 |
全外连接 | full join | 返回两个表中的行:left join + right join(重合部分的相等数据只保留一份) |
笛卡尔积 | cross join(不带 WHERE 子句) | 结果是笛卡尔积,第一个表的行数乘以第二个表的行数,通常,如果每个表分别具有n和m行,则结果集将具有n*m行 |
内连接 | inner join | 又叫等值连接,只返回两个表中连接字段相等的行 |
自然连接 | natrual join | 和内连接很类似,区别在于结果的重复列上:自然连接重复列只保存一列(列去重),内连接重复列都保存(列不去重) |
left join
和left outer join
只是写法不同,没有本质的区别
on 和 where 的区别
数据库在通过连接两张或多张表来返回记录时,都会生成一张中间的临时表,然后再将这张临时表返回给用户
on
条件是在生成临时表时使用的条件,它不管on
中的条件是否为真,都会返回左边表中的记录where
条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有left join
的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉- 如果条件中同时有
on
和where
条件,第一步根据on
条件得到一个临时表,第二步根据where
条件对上一步的临时表进行过滤,得到最终返回结果 - 如果条件中只有
on
,那么得到的临时表就是最终返回结果
临时表
- join_buffer
无序数组,专门用于多表联查未用到索引时辅助查询的,如果不足以装下驱动表就会分多次进行 - sort_buffer
有序数组,在排序时优先使用的区域,如果要排序返回的总字段长度超过设置的区域就会用到内存临时表,如果再超过 tmp_table_size 设置的值就会转成磁盘临时表 - 内存临时表
二维表结构,无序 - 磁盘临时表
默认是B+结构,可以是数组,有序