假设我们有下面两张表。表A在左边,表B在右边。我们给它们各四条记录。

id name             id  name
-- ---- -- ----
1 Pirate 1 Rutabaga
2 Monkey 2 Pirate
3 Ninja 3 Darth Vader
4 Spaghetti 4 Ninja

1、内联合(inner join)只生成同时匹配表A和表B的记录集。结果如下:

SELECT * FROM TableA
INNER JOIN TableB
ON TableA.name = TableB.name id name id name
-- ---- -- ----
1 Pirate 2 Pirate
3 Ninja 4 Ninja

2、全外联合(full outer join)生成表A和表B里的记录全集,包括两边都匹配的记录。如果有一边没有匹配的,缺失的这一边为null。结果如下: 

SELECT * FROM TableA
FULL OUTER JOIN TableB
ON TableA.name = TableB.name id name id name
-- ---- -- ----
1 Pirate 2 Pirate
2 Monkey null null
3 Ninja 4 Ninja
4 Spaghetti null null
null null 1 Rutabaga
null null 3 Darth Vader

3、左外联合(left outer join)生成表A的所有记录,包括在表B里匹配的记录。如果没有匹配的,右边将是null。结果如下:

SELECT * FROM TableA
LEFT OUTER JOIN TableB
ON TableA.name = TableB.name id name id name
-- ---- -- ----
1 Pirate 2 Pirate
2 Monkey null null
3 Ninja 4 Ninja
4 Spaghetti null null

为了生成只在表A里而不在表B里的记录集,我们用同样的左外联合,然后用where语句排除我们不想要的记录。结果如下:

SELECT * FROM TableA
LEFT OUTER JOIN TableB
ON TableA.name = TableB.name
WHERE TableB.id IS null id name id name
-- ---- -- ----
2 Monkey null null
4 Spaghetti null null

4、右外联合(right outer join)生成表B的所有记录,包括在表A里匹配的记录。如果没有匹配的,左边将是null。结果如下:

SELECT * FROM TableA
RIGHT OUTER JOIN TableB
ON TableA.name = TableB.name

id     name     id    name
--    ----       --    ----
null   null        1    Rutabaga
1      Pirate     2    Pirate
null   null        3    Darth Vader
3      Ninja      4    Ninja

5、为了生成对于表A和表B唯一的记录集,我们用同样的全外联合,然后用where语句排除两边都不想要的记录。结果如下:

SELECT * FROM TableA
FULL OUTER JOIN TableB
ON TableA.name = TableB.name
WHERE TableA.id IS null
OR TableB.id IS null id name id name
-- ---- -- ----
2 Monkey null null
4 Spaghetti null null
null null 1 Rutabaga
null null 3 Darth Vader

6、还有一种笛卡尔积或者交叉联合(cross join),这个把“所有”联接到“所有”,产生4乘4=16行,远多于原始的集合。

下表显示每种外部联接(outer join)匹配时保留数据行的情况:

联接类型

保留数据行

A left outer join B

all A rows

A right outer join B

all B rows

A full outer join B

all A and B rows

  

  

  

  

 

最新文章

  1. javaweb初学记录
  2. BZOJ3442: 学习小组
  3. Mac 以太网连接 报无效的服务器地址 BasicIPv6ValidationError
  4. Java泛型01--任意数组中两元素交换
  5. sql 语句 嵌套子查询 执行顺序分析
  6. 在线网络速度测试JAVA程序(一):思路和控制台主程序【转】
  7. SQL 刪除
  8. POJ2209+水题!
  9. BOOST 线程完全攻略 - 扩展 - 事务线程
  10. Linux学习之域名解析命令
  11. python爬行动物集合360联想词搜索
  12. mysql增量ID 启动值更改方法
  13. javascript ES6 新特性之 let
  14. android Camera相机类
  15. [dpdk][hotplug] DPDK网卡设备热插拔
  16. Vue系列之 => webpack基础使用
  17. Spring Boot 静态页面
  18. 将网页设置为允许 XMLHttpRequest 跨域访问
  19. 【linux】grep的使用
  20. Restful API 的设计规范(转)

热门文章

  1. 【Flask】Sqlalchemy 外键
  2. [APIO2013]机器人
  3. canvas 视频音乐播放器
  4. Python多线程循环
  5. 20145239杜文超《网络对抗》- Web安全基础实践
  6. JZ2440专用dnw 支持xp、win7、win8和win10系统【转】
  7. 手把手教你使用eclipse+qemu+gdb来单步调试ARM内核【学习笔记】
  8. win10系统下载地址
  9. springmvc请求参数的绑定和获取
  10. Mysql 利用小工具源码