第一、连接操作符可分成:点此下载其中包含了全部说明文档及所需ORACLE与SQLSERVER数据库
1、连接类型:连接类型决定了如何处理连接条件中不匹配的元组。
2、连接条件:连接条件决定了两个关系中哪些元组应该匹配以及连接结果中应该出现哪些属性(控制属性的显示只有在Oracle中才支持)。
连接类型(4个) | |
INNER JOIN | 内连接 |
LEFT (OUTER) JOIN | 左外连接 |
RIGHT (OUTER) JOIN | 右外连接 |
FULL (OUTER) JOIN | 完全连接 |
连接条件(3个) | |
NATURAL | 应写在连接类型的左边(ORACLE才支持) |
ON等值连接条件 | 应写在连接类型的右边 |
USING(A1,A2,….An) | 应写在连接类型的右边(ORACLE才支持) |
下面是与连接操作有关的解释和说明:
1) 连接类型分成内连接和外连接两种。内连接是等值连接,外连接又分成左、右、完全外连接三种。连接类型中INNER、OUTER字样可不写。
1) 连接条件分成三种:
n NATURAL:表示两个关系执行自然连接操作,即在两个的公共属性上作等值连接,运算结果中公共属性只出现一次(这一功能非常好当两个表的字段很多时,就可以不用写字段名称了)。
n ON等值连接条件:具体列出两个关系在哪些相应属性(具有相同域可以是不同列名)上做等值连接。
n USING(A1,A2,…,An): 类似于NATURAL形式,这里A1,A2,…,An是两个关系上的公共属性,但可以不是全部公共属性。在连接的结果中,公共属性A1,A2,…,An只出现一次。
学生信息表(StuInfo):
stuNo stuName stuSex stuAge stuDept
200215121 李勇 男 20 CS
200215122 刘晨 女 19 CS
200215123 王敏 女 21 MA
200215124 张立 男 17 IS
200215125 陆俊飞 男 18 IS
200215126 王东 男 22 CS
200215127 毕晓玉 女 23 MA
200215128 梁晓龙 男 20 IS
200215129 殷宏海 男 23 CS
200215131 万霞 女 24 CS
200215132 李国前 男 24 CS
200215133 陈玲 女 24 CS
200215134 董亮 男 24 CS
200215135 江斌 男 23 CS
200215136 朱长明 男 24 CS
200215137 王庆乐 男 24 CS
200215138 李勇 女 20 CS
200215139 钱进 男 20 CS
200215140 陆洋 男 22 CS
200215141 卢再举 男 26 CS
200215142 段磊 男 24 CS
课程信息表(SC):
stuNo courNo scGrade
----------- ----------- -------
200215121 1 92
200215121 2 79
200215121 3 88
200215122 2 85
200215122 3 80
200215123 1 0
200215124 1 56
在SQLSERVER中事例:
右连接(right)事例:
sql:select * from StuInfo a right outer join SC b on a.stuNo=b.stuNo
stuNo stuName stuSex stuAge stuDept stuNo courNo scGrade
----------- -------------------- ------ ------ -------------------- ----------- ----------- -------
200215121 李勇 男 20 CS 200215121 1 92
200215121 李勇 男 20 CS 200215121 2 79
200215121 李勇 男 20 CS 200215121 3 88
200215122 刘晨 女 19 CS 200215122 2 85
200215122 刘晨 女 19 CS 200215122 3 80
200215123 王敏 女 21 MA 200215123 1 0
200215124 张立 男 17 IS 200215124 1 56
则可以用下面的sql代替这个右连接操作如:
select *,(select b.stuName from StuInfo b where b.stuNo=a.stuNo) stuName,(select c.stuSex from StuInfo c where c.stuNo=a.stuNo) stuSex from SC a
stuNo courNo scGrade stuName stuSex
----------- ----------- ------- -------------------- ------
200215121 1 92 李勇 男
200215121 2 79 李勇 男
200215121 3 88 李勇 男
200215122 2 85 刘晨 女
200215122 3 80 刘晨 女
200215123 1 0 王敏 女
200215124 1 56 张立 男
注意:
1、最外层的表a的是大表(即左连接的左表、右连接的右表)。内层表元组小于外层表a的元组。
2、当子结构查询(select col_name from b where b.colname=a.colname),(select col_name from c where c.colname_a.colname)的结果唯一时这种方法才可替代左连接或右连接即最外面表的元组可不唯一但子查询结构的子查询结果要唯一。
Sql:select * from StuInfo a right outer join SC b on a.stuNo=b.stuNo
左连接(left)事例:
学生表(StuInfo)对选课表(SC)进行左连接事例:
Sql:select * from StuInfo a left outer join SC b on a.stuNo=b.stuNo
stuNo stuName stuSex stuAge stuDept stuNo courNo scGrade
----------- -------------------- ------ ------ -------------------- ----------- ----------- -------
10001 test 女 20 OS NULL NULL NULL
200215121 李勇 男 20 CS 200215121 1 92
200215121 李勇 男 20 CS 200215121 2 79
200215121 李勇 男 20 CS 200215121 3 88
200215122 刘晨 女 19 CS 200215122 2 85
200215122 刘晨 女 19 CS 200215122 3 80
200215123 王敏 女 21 MA 200215123 1 0
200215124 张立 男 17 IS 200215124 1 56
200215125 陆俊飞 男 18 IS NULL NULL NULL
200215126 王东 男 22 CS NULL NULL NULL
200215127 毕晓玉 女 23 MA NULL NULL NULL
200215128 梁晓龙 男 20 IS NULL NULL NULL
200215129 殷宏海 男 23 CS NULL NULL NULL
200215131 万霞 女 24 CS NULL NULL NULL
200215132 李国前 男 24 CS NULL NULL NULL
200215133 陈玲 女 24 CS NULL NULL NULL
200215134 董亮 男 24 CS NULL NULL NULL
200215135 江斌 男 23 CS NULL NULL NULL
200215136 朱长明 男 24 CS NULL NULL NULL
200215137 王庆乐 男 24 CS NULL NULL NULL
200215138 李勇 女 20 CS NULL NULL NULL
200215139 钱进 男 20 CS NULL NULL NULL
200215140 陆洋 男 22 CS NULL NULL NULL
200215141 卢再举 男 26 CS NULL NULL NULL
200215142 段磊 男 24 CS NULL NULL NULL
1) 若连接操作是“INNER JOIN”,未提及连接条件,那么这个操作等价于笛卡儿积SQL2中把定义为“CROSS JOIN”操作。
2) 若连接操作是“FULL OUTER JOIN ON FALSE”,这里连接条件总是false,那么这个操作类似于 “外部并(OUTER UNION)”操作,但也有区别。这里操作结果要把两个关系的属性全部包括进去。SQL2把此操作定义为“UNION JOIN”操作。
内连接(inner)事例:
select * from StuInfo a inner join SC b on a.stuNo=b.stuNo
stuNo stuName stuSex stuAge stuDept stuNo courNo scGrade
----------- -------------------- ------ ------ -------------------- ----------- ----------- -------
200215121 李勇 男 20 CS 200215121 1 92
200215121 李勇 男 20 CS 200215121 2 79
200215121 李勇 男 20 CS 200215121 3 88
200215122 刘晨 女 19 CS 200215122 2 85
200215122 刘晨 女 19 CS 200215122 3 80
200215123 王敏 女 21 MA 200215123 1 0
200215124 张立 男 17 IS 200215124 1 56
全部连接(full)也称完全连接事例:
select * from StuInfo a full join SC b on a.stuNo=b.stuNo
stuNo stuName stuSex stuAge stuDept stuNo courNo scGrade
----------- -------------------- ------ ------ -------------------- ----------- ----------- -------
200215121 李勇 男 20 CS 200215121 1 92
200215121 李勇 男 20 CS 200215121 2 79
200215121 李勇 男 20 CS 200215121 3 88
200215122 刘晨 女 19 CS 200215122 2 85
200215122 刘晨 女 19 CS 200215122 3 80
200215123 王敏 女 21 MA 200215123 1 0
200215124 张立 男 17 IS 200215124 1 56
200215125 陆俊飞 男 18 IS NULL NULL NULL
200215126 王东 男 22 CS NULL NULL NULL
200215127 毕晓玉 女 23 MA NULL NULL NULL
200215128 梁晓龙 男 20 IS NULL NULL NULL
200215129 殷宏海 男 23 CS NULL NULL NULL
200215131 万霞 女 24 CS NULL NULL NULL
200215132 李国前 男 24 CS NULL NULL NULL
200215133 陈玲 女 24 CS NULL NULL NULL
200215134 董亮 男 24 CS NULL NULL NULL
200215135 江斌 男 23 CS NULL NULL NULL
200215136 朱长明 男 24 CS NULL NULL NULL
200215137 王庆乐 男 24 CS NULL NULL NULL
200215138 李勇 女 20 CS NULL NULL NULL
200215139 钱进 男 20 CS NULL NULL NULL
200215140 陆洋 男 22 CS NULL NULL NULL
200215141 卢再举 男 26 CS NULL NULL NULL
200215142 段磊 男 24 CS NULL NULL NULL
在ORACLE中的应用请见下载sql脚本:点此下载