1.集合运算就是把多个查询结果组合成一个结果。
当前数据库中有stuinfo和stuinfo_2018两张表,stuinfo有4条数据:张三、王五、龙七、李四,stuinfo_2018中只有1条王五的数据。
(1)INTERSECT 交集:返回两个查询共有的结果。
(2)UNION ALL 并集重复:返回各个查询的所有结果,包括重复的数据行。
(3)UNION 并集不重复:返回各个查询的所有不重复的结果。
(4)MINUS 补集:返回第一个查询结果减去第二个查询结果的剩余数据行。
2.连接查询
(1)内连接(inner join):两张表通过某个字段进行内连接,查询结果是通过该字段按关系运算符匹配出的数据行。
等值连接:连接条件用‘=’比较被连接的值,查询结果是被连接表中的所有行。(不等连接)
例如,关联查询学生信息表stuinfo和班级信息表class。
不等连接:连接条件用‘=’以外的运算符比较连接。
小插曲:sqlplus的界面实在是太不友好了,所以我去下载了一个sql developer,查询结果看起来清晰一点。
sql developer的下载链接: https://www.oracle.com/tools/downloads/sqldev-v192-downloads.html
为了练习连接查询,我更新了数据库里的表stuinfo 和 stuinfo_2018,所以之前的查询结果都只对应之前的数据,从这开始都使用更新后的数据表。
stuinfo表
stuinfo_2018表
(2)外连接(outer join):返回到查询结果中的不仅包含符合连接条件的行,还包括左表(左外连接)或右表(右外连接)或两个边接表(全外连接)中的所有数据行。
已知表stuinfo中有张三丰,没有龙五和李一天;表stuinfo_2018中有龙五和李一天,但没有张三丰。
例如,左连接(left join)
返回左表中的所有数据和右表中的匹配行,对于左表中有但右表中没有的数据,在右表表的字段下补null值
select a.*, b.stuid, b.stuname
from STUDENT.stuinfo a
left join STUDENT.stuinfo_2018 b
on a.stuid = b.stuid;
因为左表中有张三丰,右表中没有,所以查询结果为:
左连接的另一种写法:相当于在等值连接的基础上给右表后面加(+)
select a.*, b.stuid, b.stuname
from STUDENT.stuinfo a, STUDENT.stuinfo_2018 b
where a.stuid = b.stuid(+);
例如,右连接(right join)
返回右表中的所有数据和左表中的匹配行,对于右表中有但左表中没有的 在左表的字段下补null值。
select a.*, b.stuid, b.stuname
from STUDENT.stuinfo a
right join STUDENT.stuinfo_2018 b
on a.stuid = b.stuid;
另一种写法同理左连接。
为了更好记忆,我暂且死记硬背为:先写的表就是左表,后写的表就是右表,在第二种写法中,谁需要补null值谁后面就跟着(+)。
例如,全外连接(full join)
返回左右表的所有数据,缺失的地方补null值。
select a.*, b.stuid, b.stuname
from STUDENT.stuinfo a
full join STUDENT.stuinfo_2018 b
on a.stuid = b.stuid;
全外连接貌似没有第二种写法,两边都跟(+)报错。如果遇见第二种写法,再更新。