【SQL】并(UNION)、交(INTERSECT)、差(minus)、除去(EXCEPT)

UNION

查询选修了180101号或180102号课程或二者都选修了的学生学号、课程号和成绩。

sql 复制代码
( SELECT 学号, 课程号, 成绩 FROM 学习 WHERE 课程号= '180101' ) 
UNION
( SELECT 学号, 课程号, 成绩 FROM 学习 WHERE 课程号= '180102' )

与SELECT子句不同,UNION运算自动去除重复。

在本例中,若只输出学生的学号,则相同的学号只出现一次。如果想保留所有的重复,则必须用UNION ALL代替UNION,且查询结果中出现的重复元组数等于两个集合中出现的重复元组数的和。

UNION 和 UNION ALL的区别

结论:

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中,必须使用其它方法实现,其中,嵌套查询是十分有效的一种方法。

相关推荐
这孩子叫逆10 分钟前
6. 什么是MySQL的事务?如何在Java中使用Connection接口管理事务?
数据库·mysql
Karoku06614 分钟前
【网站架构部署与优化】web服务与http协议
linux·运维·服务器·数据库·http·架构
码农郁郁久居人下40 分钟前
Redis的配置与优化
数据库·redis·缓存
MuseLss2 小时前
Mycat搭建分库分表
数据库·mycat
Hsu_kk2 小时前
Redis 主从复制配置教程
数据库·redis·缓存
DieSnowK2 小时前
[Redis][环境配置]详细讲解
数据库·redis·分布式·缓存·环境配置·新手向·详细讲解
程序猿小D2 小时前
第二百三十五节 JPA教程 - JPA Lob列示例
java·数据库·windows·oracle·jdk·jpa
Flerken1012 小时前
数据库语言、SQL语言、数据库系统提供的两种语言
数据库·sql·oracle
掘根2 小时前
【网络】高级IO——poll版本TCP服务器
网络·数据库·sql·网络协议·tcp/ip·mysql·网络安全
消失在人海中2 小时前
oracle 表的外键
数据库·oracle