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

相关推荐
nanzhuhe4 分钟前
sql中group by使用场景
数据库·sql·数据挖掘
消失在人海中13 分钟前
oracle sql 语句 优化方法
数据库·sql·oracle
Clang's Blog17 分钟前
一键搭建 WordPress + MySQL + phpMyAdmin 环境(支持 PHP 版本选择 & 自定义配置)
数据库·mysql·php·wordpr
zzc92121 分钟前
MATLAB仿真生成无线通信网络拓扑推理数据集
开发语言·网络·数据库·人工智能·python·深度学习·matlab
未来之窗软件服务42 分钟前
JAVASCRIPT 前端数据库-V1--仙盟数据库架构-—-—仙盟创梦IDE
数据库·数据库架构·仙盟创梦ide·东方仙盟数据库
LjQ20401 小时前
网络爬虫一课一得
开发语言·数据库·python·网络爬虫
烙印6011 小时前
MyBatis原理剖析(二)
java·数据库·mybatis
RestCloud1 小时前
如何通过ETLCloud实现跨系统数据同步?
数据库·数据仓库·mysql·etl·数据处理·数据同步·集成平台
你是狒狒吗1 小时前
TM中,return new TransactionManagerImpl(raf, fc);为什么返回是new了一个新的实例
java·开发语言·数据库
程序员岳焱1 小时前
Java 与 MySQL 性能优化:MySQL 慢 SQL 诊断与分析方法详解
后端·sql·mysql