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

相关推荐
OceanBase数据库官方博客7 分钟前
亮相“十五五”公积金高质量发展大会“AI 数据库”助力智慧公积金升级
数据库·人工智能
龙虾PRO1 小时前
高并发场景数据库调优实操:目标定位、监控方法与优化维度全解析
数据库·oracle
达梦产品与服务1 小时前
SQLark 实战 | 高频 SQL 脚本的导入、管理与复用
数据库·sql·数据库开发·数据库运维·脚本管理·sqlark百灵连接·sql脚本
InfinitePlus1 小时前
redis数据持久化
数据库·redis·缓存
忧郁的橙子.2 小时前
深入浅出etcd与Raft:从核心组件到数据一致性原理
数据库·etcd
柒和远方2 小时前
V079: Milvus 向量数据库:AI 日记本的三组件部署、集合字段建模与余弦索引
javascript·sql
鱼鳞_2 小时前
热门八股-MySQL
数据库·mysql
小尘要自信2 小时前
软件远控失效以后怎么办?玩客云 + One-KVM 实现 BIOS 级远程画面与键鼠控制
服务器·网络·数据库
这个DBA有点耶2 小时前
数据库“家谱”系列之一:关系型数据库的4大核心组件详解
数据库·mysql·架构
ClouGence2 小时前
数据库迁移同步工具 CloudCanal v6.4.0.0 发布,Oracle、SAP Hana 等同步能力再升级
数据库