SQL JOINS
MySQL外连接
先上结论
学习内外连接要把这几个图记在心里.
集合A不包含集合B(外连接)
select * from TableA A left join TableB B ON A.KEY = B.KEY WHERE B.KEY IS NULL;
复制代码
集合A部分(外连接)
select * from TableA A left join TableB B ON A.KEY = B.KEY;
复制代码
集合A交集合B部分(内连接)
select * from TableA join TableB ON A.KEY = B.KEY;// 内连接写法
select * from TableA left join TableB ON A.KEY = B.KEY WHERE B.KEY IS NOT NULL;// 外连接写法
复制代码
外特点(left join为例)
应用场景: 一个表有一个表没有, 即集合A中不包含集合B的部分
特点:
分主表和从表,A是主表, B是从表.
查询结果为主表中所有记录
如果从表有符合条件的匹配值, 直接显示
如果从表没有匹配上, 显示null(集合A中不包含集合B部分为null)
查询结果 = 内连接结果(可以用B.Key is Null剔除) + 主表有从表没有部分
左外, 右外
左外 - left join左边是主表
右外 - right join右边是主表
左外右外可互相转化
具体案例
数据表
beauty表
boys表
测试
案例一 查询女神的男朋友, 不存在的为null
这里beauty女神表是主表, boys表为从表, 女神的男朋友也就是, 拿出每一条女神记录和其对应的男朋友id 去 boys表匹配, 如果匹配上了则加入结果集, 没有匹配上则设置值为null.(也就是前面所说的, 结果集是主表的所有记录)
select a.id ,a.name, b.id, b.boyName from beauty a left join boys b on a.boyfriend_id = b.id;
复制代码
id是主键(主键通常不能为null).说明条件判断的时候没找到结果, 因此可以剔除.
select a.id ,a.name, b.id, b.boyName from beauty a left join boys b on a.boyfriend_id = b.id where b.id is not null;
复制代码
最终结果
对比内连接, 可见剔除了id = null后 结果是一样的
全外
全外 = 左外 + 右外取并集, mysql不支持, 但可以用union达到相同的效果不再赘述.