MySql join联表


连接分类

连接语法作用
左外连接left join返回左表中所有的记录以及右表中连接字段相等的记录
右外连接right join返回右表中所有的记录以及左表中连接字段相等的记录
全外连接full join返回两个表中的行:left join + right join(重合部分的相等数据只保留一份)
笛卡尔积cross join(不带 WHERE 子句)结果是笛卡尔积,第一个表的行数乘以第二个表的行数,通常,如果每个表分别具有n和m行,则结果集将具有n*m行
内连接inner join又叫等值连接,只返回两个表中连接字段相等的行
自然连接natrual join和内连接很类似,区别在于结果的重复列上:自然连接重复列只保存一列(列去重),内连接重复列都保存(列不去重)
  • left joinleft outer join 只是写法不同,没有本质的区别

on 和 where 的区别

数据库在通过连接两张或多张表来返回记录时,都会生成一张中间的临时表,然后再将这张临时表返回给用户

  • on 条件是在生成临时表时使用的条件,它不管 on 中的条件是否为真,都会返回左边表中的记录
  • where 条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有 left join 的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉
  • 如果条件中同时有onwhere条件,第一步根据on条件得到一个临时表,第二步根据where条件对上一步的临时表进行过滤,得到最终返回结果
  • 如果条件中只有on,那么得到的临时表就是最终返回结果

临时表

  • join_buffer
    无序数组,专门用于多表联查未用到索引时辅助查询的,如果不足以装下驱动表就会分多次进行
  • sort_buffer
    有序数组,在排序时优先使用的区域,如果要排序返回的总字段长度超过设置的区域就会用到内存临时表,如果再超过 tmp_table_size 设置的值就会转成磁盘临时表
  • 内存临时表
    二维表结构,无序
  • 磁盘临时表
    默认是B+结构,可以是数组,有序

文章作者: 江湖义气
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 江湖义气 !
  目录