有你在真好 的个人博客
高效SQL性能之:最完整的sql表连接
阅读:2194 添加日期:2021/3/27 23:16:36 原文链接:https://www.toutiao.com/item/6916358776186585611/
高效SQL性能之:最完整的sql表连接


表连接类型可分为外连接、内连接和交叉连接 三种,接下来我们来展开总结。


示例表

高效SQL性能之:最完整的sql表连接

简单的建表,只为演示

一、外连接

外连接可分为:左连接、右连接、完全外连接。

1、左连接 left join 或 left outer join(左表独有)

SQL语句

select * from t_student s LEFT JOIN t_course c on s.id=c.id;  -- where c.id is null;

执行结果如图

高效SQL性能之:最完整的sql表连接

说明:左外连接包含left join左表所有行,如果左表中某行在右表没有匹配,则结果中对应行右表的部分全部为空NULL。


2、右连接 right join 或 right outer join(右表独有)

SQL语句

select * from t_student s RIGHT JOIN t_course c on s.id=c.id;  -- where s.id is null;

执行结果如图

高效SQL性能之:最完整的sql表连接

说明:右外连接包含right join右表所有行,如果左表中某行在右表没有匹配,则结果中对应左表的部分全部为空NULL。


3、完全外连接 full join 或 full outer join

SQL语句

select * from t_student s full join t_course c on s.id=c.id;

执行结果如图

高效SQL性能之:最完整的sql表连接

说明:LEFT JOIN返回左表的全部行和右表满足ON条件的行,如果左表的行在右表中没有匹配,那么这一行右表中对应数据用NULL代替。


二、内连接 join 或 inner join

SQL语句

select * from t_student s inner join t_course c on s.id=c.id;

执行结果如图

高效SQL性能之:最完整的sql表连接

inner join 是比较运算符,只返回符合条件的行,等同于我们常用的:select * from t_student s , t_course c where s.id=c.id;


三、交叉连接 cross join

没有where条件的交叉连接将产生连接所涉及的表的笛卡尔积:第一个表的行数乘以第二个表的行数等于笛卡尔积结果集的大小。有where条件时则等同于inner join。

SQL语句

select * from t_student s cross join t_course c;

执行结果如图

高效SQL性能之:最完整的sql表连接


自然连接

通过MySql自己的判断完成连接过程,不需要指定连接条件。MySql会使用表内的,相同的字段,作为连接条件。

自然连接分为内外之分。

如果两个表有多个相同字段,或者没有相同字段,则自然连接返回为空。

可分为:自然内连接、自然左连接、自然右连接

SQL语句

select * from t_student s NATURAL [left | right] JOIN t_course c;

执行结果如图

高效SQL性能之:最完整的sql表连接

(注意列命的变化)


补充部分

mysql数据库不支持full join,可以用UNION来达到目的,语法如下:

[SQL 语句 1]
    UNION 
[SQL 语句 2][SQL 语句 1]
   UNION ALL
[SQL 语句 2]


效率 / 区别:

UNION和UNION ALL关键字都是将两个结果集合并为一个,但这两者从使用和效率上来说都有所不同。

1、对重复结果的处理:UNION在进行表链接后会筛选掉重复的记录,Union All不会去除重复记录。

2、对排序的处理:Union将会按照字段的顺序进行排序;UNION ALL只是简单地将两个结果合并后就返回。

3、从效率上说,UNION ALL 要比UNION快很多,所以,如果可以确认合并的两个结果集中不包含重复数据且不需要排序时的话,那么就使用UNION ALL。

ICP备案号:苏ICP备14035786号-1 苏公网安备 32050502001014号