MySQL 左右外连接

2,309 阅读2分钟

SQL JOINS

MySQL外连接

先上结论

学习内外连接要把这几个图记在心里.

  1. 集合A不包含集合B(外连接)
select * from TableA A left join TableB B ON A.KEY = B.KEY WHERE B.KEY IS NULL;
  1. 集合A部分(外连接)
select * from TableA A left join TableB B ON A.KEY = B.KEY;
  1. 集合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的部分
  • 特点:
  1. 分主表和从表,A是主表, B是从表.
  2. 查询结果为主表中所有记录
    • 如果从表有符合条件的匹配值, 直接显示
    • 如果从表没有匹配上, 显示null(集合A中不包含集合B部分为null)
  3. 查询结果 = 内连接结果(可以用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达到相同的效果不再赘述.