昨天要在前台页面的表格中新增加一列
,调用接口的时候发现没有这列数据,需要修改后台接口,后台接口添加一列,然后进行连表查询
,将新增匹配的数据添加到结果表中,但是新列数据全为空,导致结果中之前表格的数据也出不来,添加外连接
即可;
一. 什么是外连接?
外连接(Outer Join);
outer join
会返回每个满足第一个(顶端)输入与第二个(底端)输入的连接的行
;同时它还会
返回任何在第二个输入中没有匹配行的第一个输入中的行
;上面这句话,并不好消化,写个栗子用用好理解;
1.2 外连接有哪几种?
外连接分为三种
:
左外连接
(简称左连);-
左
边的表不加限制
,数据全部显示,右
边匹配
的表数据不全的,用null
替代;
-
右外连接
(右连);-
右
边的表不加限制
,数据全部显示,左边匹配的表数据不全的,用null替代;
-
全外连接
(全连);-
左右
两边的表都不限制
,即两边
的表,数据全显示
,没有
数据的用null
替代;
-
在
左外连接
和右外连接
时都会以一张表为基表
,该表的内容会全部显示
,然后加上
两张表匹配
的内容。 如果基表的数据在另一张表没有记录
, 那么在相关联
的结果集行
中列
显示为空值(NULL)
;
1.3 使用SQL语法表示:
// 左 / 右 / 全 外连接
LEFT / RIGHT / FULL (OUTER) JOIN
注意:
- 通常我们
省略outer
这个关键字。 写成:left / right / full join
; - SQL语法
不区分大小写
,对大小写不敏感
;
二. 详细说一下左外连接
left join
是以左表
的记录为基础
的,它的结果集
是左表中的数据
,在加上左
表和右
表匹配
的数据;
直白点说就是,左
表的记录将会全部表示
出来,而右
表只会显示符合搜索条件的记录
,同时右表中没有记录
的地方均用NULL
替代;
2.1 (左外连接标准写法)写法1:
select * from leftTable l left join rightTable r on l.id = r.id;
leftTable l
左表名称,后跟的是表的别名
,可写可不写
,如果写了
话,后面可以用别名来代替
左表名称,同理是右表;from
表1…left join
表2…on
关联匹配条件;left join
必须跟在from
语句后,必须带on
;
同理,
右外连接
,全外连接
,写法同上,只用修改连接关键字
即可;
2.2(使用”(+)”表示)写法2:
对于外连接, 也可以使用(+)
来表示,(+)
放在哪边(左、右)
表示另一边外连接
;
2.2.1(+)的使用及注意事项:
(+)操作符只能出现在
where
子句中,并且不能
与outer join语法同时使用;当使用(+)操作符执行外连接时,如果在where子句中包含有多个条件,则必须在所有条件中都包含(+)操作符;
(+)操作符只适用于列,而不能用在表达式上;
(+)操作符不能与or和in操作符一起使用;
(+)操作符只能用于实现左外连接和右外连接,而不能用于实现完全外连接;
2.2.2 用(+)来实现(左、右)外连,看栗子, 这样理解+号比较好理解,栗子如下:
即 你可以把
+
当做补充
,也就是说哪个表有加号,哪个表就是匹配表
,这个表就是用来作补充的;
所以加号写在右表,左表就是全部显示,故是左连接;
// 左连
select * from table1 a, table2 b where a.id=b.id(+);
同理,加号写左表,就是右连接;
// 右连
select * from table1 a, table2 b where a.id(+)=b.id;
注意:
(+)号必须放到
where
后面;(+)
只
能表示左外连接或右外连接
,不能
表示全外
连接,即:(+)要么放
左
边,要么放右
边;(+)
不能两边都放
;