一、前期准备

建立一张user表和一张order表,并填充相应的数据
SQL内外链表详情 - 图1 SQL内外链表详情 - 图2

表1: user 表 表2:order表

二、左连接(Left Join和Right Join)

  • 运行代码:

SELECT * FROM user LEFT JOIN order ON user.id = order.uid;

  • 查询结果为:

SQL内外链表详情 - 图3

  • 总结

(1)Left join 会查出左表中的所有数据,查出右表中符合连接条件的部分数据;
(2)当右侧数据没有时,会以null显示(如上图的最后一行);
(3)当右侧数据比左侧数据多的时候,左侧数据会出现重复;
SQL内外链表详情 - 图4 SQL内外链表详情 - 图5
图1:Left Join 图2:Right Join

三、内连接(Inner Join)

join是 inner join 的简便写法;

SELECT * FROM user INNER JOIN order ON user.id = order.uid;

  • 执行结果

SQL内外链表详情 - 图6

  • 总结:

(1)Inner Join 会仅仅返回两个表匹配上的结果
SQL内外链表详情 - 图7

图3:Inner Join

四、全连接(Union 和 Union All)

MySQL中没有Full Join,但是用过Union 和 Union All也能够实现

SELECT FROM user LEFT JOIN order ON user.id = order.uid UNION SELECT FROM user RIGHT JOIN order ON user.id = order.uid

  • 执行结果

SQL内外链表详情 - 图8
Union 结果集
SQL内外链表详情 - 图9
Union All结果集

  • 总结

(1)Union 会使结果集进行合并,并去除重复数据;
(2)Union ALL 同样会合并结果集,但是不去除重复数据;
SQL内外链表详情 - 图10

图4:Union

五、左(右)表独有

SELECT * FROM user LEFT JOIN order ON user.id = order.uid WHERE order.uid IS NULL

执行结果:
SQL内外链表详情 - 图11

  • 总结:

(1)返回左侧独有的数据;

SQL内外链表详情 - 图12 SQL内外链表详情 - 图13
图5:左侧独有数据 图6:右侧独有数据

六、两表独有数据集合

SELECT FROM user LEFT JOIN order ON user.id = order.uid WHERE order.uid IS NULL UNION SELECT FROM user RIGHT JOIN order ON user.id = order.uid WHERE user.id IS NULL

SQL内外链表详情 - 图14

  • 总结

(1)取出两者独有的数据
SQL内外链表详情 - 图15
图7:两表独有的数据集合