TA的每日心情 | 开心 2021-3-12 23:18 |
---|
签到天数: 2 天 [LV.1]初来乍到
|
外连接(OUTER JOIN)(下载用到的表数据)
不管是内连接还是带WHERE子句的多表查询,都组合自多个表,并生成结果表。换句话说,如果任何一个源表中的行在另一个源表中没有匹配,DBMS 将不把该行放在最后的结果表中。 而外连接告诉ODBC生成的结果表,不仅包含符合连接条件的行,而且还包括左表(左外连接时)、右表(右外连接时)或两个边接表(全外连接)中的所有数据行。 SQL的外连接共有3种类型:左外连接,关键字为LEFT OUTER JOIN、右外连接,关键字为RIGHT OUTER JOIN和全外连接,关键字为FULL OUTER JOIN。外连接的用法和内连接一样,只是将INNER JOIN关键字替换为相应的外连接关键字即可。 说明 使用外连接时,关键字OUTER是可选的,如可用LEFT JOIN替代LEFT OUTER JOIN。 下面分别介绍一下这几种外连接方式。
1.左外连接
左外连接,LEFT OUTER JOIN,告诉DBMS生成的结果表中,除了包括匹配行外,还包括JOIN关键字(FROM子句中)左边表的不匹配行。左外连接实际上可以表示为: 左外连接 = 内连接 + 左边表中失配的元组 其中,缺少的右边表中的属性值用NULL表示。图给出了典型的左外连接示意图。

实例 左连接STUDENT表和COURSE表
左连接STUDENT表和COURSE表,查询所有同学的学号、姓名、课程代码、课程名称、考试时间和成绩信息。
实例代码: SELECT S.SNO, SNAME, S.CNO, CNAME, CTEST, MARK FROM STUDENT AS S
LEFT OUTER JOIN COURSE AS C ON S.CNO = C.CNO ORDER BY SNAME
可见,最终得到的结果表中,除了包括两个表匹配的行,还包括了左边表STUDENT中的不匹配行(1行),缺少的右边表,即 COURSE表中的属性值用NULL表示。 技巧
在SQL Server中,可以在WHERE子句中使用“*=”符号实现左外连接。
在WHERE子句,使用“*=”符号实现左外连接,代码如下。 SELECT S.SNO, SNAME, S.CNO, CNAME, CTEST, MARK FROM STUDENT AS S, COURSE AS C
WHERE S.CNO*= C.CNO ORDER BY SNAME
说明:在Oracle数据库系统中,只需将“*=”替换成“+=”可以得到相同的结果。
2.右外连接
右外连接(RIGHT OUTER JOIN)告诉DBMS生成的结果表中,除了包括匹配行外,还包括JOIN关键字(FROM子句中)右边表的不匹配行。右外连接实际上可以表示为:
右外连接 = 内连接 + 右边表中失配的元组
其中,缺少的左边表中的属性值用NULL表示。图给出了典型的右外连接示意图

实例 右外连接STUDENT表和COURSE表 右外连接STUDENT表和COURSE表,查询所有同学的学号、姓名、课程代码、课程名称、考试时间和成绩信息。
实例代码: SELECT S.SNO, SNAME, S.CNO, CNAME, CTEST, MARK FROM STUDENT AS S
RIGHT OUTER JOIN COURSE AS C ON S.CNO = C.CNO ORDER BY SNAME 运行结果如图所示。

可见,最终得到的结果表中,除了包括两个表匹配的行,还包括了右边表COURSE表中的不匹配行(1),缺少的左边表,即 STUDENT表中的属性值用NULL表示。
技巧
在SQL Server数据库系统中,可以在WHERE子句中使用“=*”符号实现右外连接。 实例 在WHERE子句中使用“=*”符号实现右外连接.在WHERE子句,使用“=*”符号实现上例,代码如下。 SELECT S.SNO, SNAME, S.CNO, CNAME, CTEST, MARK FROM STUDENT AS S,COURSE AS C
WHERE S.CNO=* C.CNO ORDER BY SNAME 3.全外连接 全外连接,FULL OUTER JOIN,告诉DBMS生成的结果表中,除了包括匹配行外,还包括JOIN关键字(FROM子句中)左边表和右边表的不匹配行。全外连接实际上可以表示为:
全外连接 = 内连接 + 左边表中失配的元组 + 右边表中失配的元组。
其中,缺少的左边表或者右边表中的属性值用NULL表示。图给出了典型的全外连接示意图。

实例 全外连接STUDENT表和COURSE表 全外连接STUDENT表和COURSE表,查询所有同学的学号、姓名、课程代码、课程名称、考试时间和成绩信息。实例代码: SELECT S.SNO, SNAME, S.CNO, CNAME, CTEST, MARK FROM STUDENT AS S
FULL OUTER JOIN COURSE AS C ON S. CNO = C. CNO ORDER BY SNAME 运行结果(略,mysql目前不支持。) 可见,最终得到的结果表中,除了包括两个表匹配的行, 还包括了右边表COURSE表中的不匹配行,缺少的左边表,
即 STUDENT表中的属性值用NULL表示。以及左边表,STUDENT表中的不匹配行, 缺少的右边表,即COURSE表中的属性值用 NULL表示。
源码下载:http://file.javaxxz.com/2014/10/30/000032843.zip |
|