外连接 (outer join)
Ø 左外连结 (left outer join)
Ø 右外连结 (right outer join)
Ø 全外连结 (full join)
内连接与外连接的区别
Ø 内连接操作在表关系的笛卡尔积中去掉了不匹配的数据记录,只输出满足连接条件的数据记录。
Ø在连接语句中只写join,而不写是哪类连接时,默认是内连接(inner join
Ø 外连接操作是生成笛卡尔积后,在其中按照on连接条件进行数据匹配,以指定表为连接主体,将其中不满足连接条件的记录也保留,对无法匹配的内容用null值填充,一并输出。
内连接的查询结果仅包含符合连接条件的行。如果需要查询结果不仅包含符合连接条件的行,而且还包括左表、右表或两个连接表中的所有数据行,则应该使用外连接。
MySQL支持的外连接有两种类型:
左外连接(左连接 LEFT [OUTER] JOIN)右外连接(右连接 RIGHT [OUTER] JOIN)
MySQL不能直接支持FULL JOIN,要实现FULL JOIN,应该使用 LEFT JOIN UNION RIGHT JOIN 的方式来实现。
一、左连接(LEFT OUTER JOIN)
左连接的查询结果为左表的所有记录以及右表中连接字段相等的记录。执行匹配条件时,以关键字的左边的表为参考表,即相当于将其作为主表。如果左表的某行在右表中没有匹配行,则在相关联的结果行中,右表的所有选择列对应值均为空值(NULL)。
语法形式为:
SELECT tableA.字段列表, tableB.字段列表 FROM tableA LEFT [OUTER] JOIN tableB
ON tableA.连接字段=tableB.连接字段
左连接的主表为左表,即LEFT JOIN左边的表tableA,将会保留主表中的所有记录。
二、右连接(RIGHT OUTER JOIN)
右连接是左连接的反向连接,查询结果为右表中的所有记录以及左表中连接字段相等的记录。执行匹配条件时,以关键字的右边的表为参考表,即相当于将其作为主表。如果右表的某行在左表中没有匹配行,左表的选择列对应值将返回空值(NULL)。
语法形式为:
SELECT tableA.字段列表, tableB.字段列表 FROM tableA RIGHT [OUTER] JOIN tableB
ON tableA.连接字段= tableB.连接字段
注:
右连接主表为右表,RIGHT JOIN右边的表tableB,连接后将会保留主表tableB中的所有记录。
tableA RIGHT JOIN tableB与 tableB left JOIN tableA 是等价,其中 tableB 都是主表,连接后tableB中的所有记录都将会保留。
说明
1.在内连接操作中指定的过滤条件写在on子句中和where子句中没有任何区别。故where过滤条件可以与on合并,都写到on子句中。
2.而在外连接中不能将where过滤条件合并到on子句中.否则返回的结果可能与事实不符.
3.如果on子句中的条件的列是同名的列,可写为using( 列名).如“on a.学号=b.学号”可写为“using(学号)”.
4.在内连接操作中可以省略on子句,结果变为cross join的结果。而外连接中的on子句不可省略,否则会提示 SQL 语句错误。
三、复合连接条件查询计算差集
复合条件连接查询是在连接查询的过程中,通过添加过滤条件,限制查询的结果,也就加WHERE条件。也可以利用表的外查询操作, 返回在第一个表中但不在第二个表中的记录。相当于做两个表的except操作,即求两个集合的差集。
四、完全连接(FULL JOIN)
完全连接返回左表和右表中的所有记录,包括连接字段相等的记 录和不相等的记录。如果左表的某行在右表中没有匹配行,将返回 空值(NULL),反之亦然。
SELECT tableA.select_list, tableB.select_list FROM tableA LEFT [OUTER] JOIN tableB
ON tableA.Key = tableB.Key
UNION
SELECT tableA.select_list, tableB.select_list FROM tableA RIGHT [OUTER] JOIN tableB
ON tableA.Key =tableB.Key