UNION
查询选修了180101号或180102号课程或二者都选修了的学生学号、课程号和成绩。
sql
( SELECT 学号, 课程号, 成绩 FROM 学习 WHERE 课程号= '180101' )
UNION
( SELECT 学号, 课程号, 成绩 FROM 学习 WHERE 课程号= '180102' )
与SELECT子句不同,UNION运算自动去除重复。
在本例中,若只输出学生的学号,则相同的学号只出现一次。如果想保留所有的重复,则必须用UNION ALL代替UNION,且查询结果中出现的重复元组数等于两个集合中出现的重复元组数的和。
结论:
union 去重并排序,union all 直接返回合并的结果,不去重也不排序;
union all 比 union 性能好;
INTERSECT
查询同时选修了180101和180102号课程的学生学号、课程号和成绩。
sql
( SELECT 学号, 课程号, 成绩 FROM 学习 WHERE 课程号= '180101' )
INTERSECT
( SELECT 学号, 课程号, 成绩 FROM 学习 WHERE 课程号= '180102' )
INTERSECT运算自动去除重复,如果想保留所有的重复,必须用INTERSECT ALL代替 INTERSECT,结果中出现的重复元组数等于两集合出现的重复元组数里较少的那个。
intersect运算 返回查询结果中相同的部分既他们的交集
minus (oracle)
返回在第一个查询结果中与第二个查询结果不相同的那部分行记录,
即两个结果的差集
sql
SELECT * FROM abc2
minus
SELECT * FROM abc;
EXCEPT
查询选修了180101号课程的学生中没有选修180102号课程的学生学号、课程号和成绩。
sql
( SELECT 学号, 课程号, 成绩 FROM 学习 WHERE 课程号= '180101' )
EXCEPT
( SELECT 学号, 课程号, 成绩 FROM 学习 WHERE 课程号= '180102' )
EXCEPT运算自动去除重复,如果想保留所有的重复,必须用EXCEPT ALL代替EXCEPT,结果中出现的重复元组数等于两集合出现的重复元组数之差(前提是差是正值)。
在不支持INTERSECT和EXCEPT运算的DBMS中,必须使用其它方法实现,其中,嵌套查询是十分有效的一种方法。