外连接是左外连接(LEFT OUTER JOIN),右外连接(RIGHT OUTER JOIN),全外连接(FULL OUTER JOIN)的统称。

一般情况下直接忽视掉OUTER就可以,直接统称:

  • 左外连接为:左连接(LEFT JOIN)
  • 右外连接为:右连接(RIGHT JOIN)
  • 全外连接为:全连接(FULL JOIN)

左连接和右连接,在结果中除了交集,还包含左/右表中的全部记录。

具体查看图片会比较清楚点:

mysql全连接和外连接 sql 全外连接_sql

1. 左连接(LEFT JOIN)

  • 定义:左连接就是将JOIN前面的表中所有记录都展示出来。

实例1:将学生表和教师表通过教师编号Tid连接起来

select * 
from teachers as t
left join students as s
on t.Tid = s.Tid

执行结果:

  • 从结果上看,将教师表中全部的教师都查询出来了,对于学生表中对应不上的,以Null填充

mysql全连接和外连接 sql 全外连接_外连接_02

2 . 右连接(RIGHT JOIN)

  • 定义:右连接就是将JOIN后面的表中所有记录都展示出来。跟左连接是对应互通的。

例如,还是将第一个实例中的teachers 表 和 students 表 进行互换,再将LEFT JOIN 改成RIGHT JOIN,可以看到执行的结果,输出的记录是一样的。

实例2:将学生表和教师表通过教师编号Tid连接起来

select * 
from students as s
right join teachers as t
on s.Tid = t.Tid

执行结果:

mysql全连接和外连接 sql 全外连接_数据库_03


可以看到所输出的记录是一样的,唯一的区别是在右连接中:

  • students 表中的(Sid、Sname)在前面
  • Teachers表中的(Tid、Tname)在后面

3 . 全连接(FULL JOIN)

  • 全连接的结果集结合了右连接和左连接的结果集
  • 在MySQL中是不支持FULL JOIN,在实际的业务中,全连接用的比较少,大多数是使用右连接和左连接。

4 . 多表外连接

  • 定义:多表外连接与多表内连接类似,都是可以对多个表(3个及以上)进行外连接查询。
  • 当合并的表较多时,同时用LEFT JOIN 和 RIGHT JOIN 会比较混乱,不容易理解,因此,我们最好只是用JOIN 和 LEFT JOIN,不用 RIGHT JOIN。

基本语法:

select <字段名>
from <表a>
left join <表b>
on a.<字段名> = b.<字段名> 
left join <表c>
on a.<字段名> = c.<字段名>

实例3:教师表同时连接学生表和课程表,通过教师编号Tid连接起来,老师需要全部显示出来

select * 
from teachers as t
left join students as s
on t.Tid = s.Tid
left join suject as u
on t.Tid = u.Tid

执行结果:

mysql全连接和外连接 sql 全外连接_mysql全连接和外连接_04

5 . 自外连接

  • 定义:自外连接是指,通过LEFT JOIN 将表自己连接起来

例如:有一个users表,求出次日留存用户数:某日活跃的用户在次日仍旧活跃的用户数

mysql全连接和外连接 sql 全外连接_sql_05

select 
a.log_date as '日期',
count(DISTINCT b.user_id) as '次日留存用户数'
from users a 
left join users b
on a.user_id = b.user_id
and DATEDIFF(b.log_date,a.log_date)=1
GROUP BY a.log_date;

实例解析:这个用到了聚合函数,日期函数,GROUP BY语句这些。

  • DATEDIFF函数是用来计算两个日期间隔天数的
  • 聚合函数COUNT是返回匹配条件的行数。
  • GROUP BY语句是对最后的结果集进行分组,通过与聚合函数搭配使用
  • DISTINCT 这个是用来进行去重