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

相关推荐
lusklusklusk几秒前
SQL Server补丁版本号为什么“日期新反而版本低”?——GDR、CU、CU+GDR 版本号规则与升级路径详解
数据库
key_3_feng17 分钟前
评估与对齐:Agent 自我进化的护栏
前端·数据库·agent
TangGeeA18 分钟前
数据库、SQL 与 DB AI
数据库·人工智能·sql
IvorySQL18 分钟前
开源数据库进校园| 11 月 3 日,IvorySQL 校园行走进浙大宁波校区:从 PostgreSQL 扩展生态到 AI 实战
数据库·postgresql·开源
福建佰胜张工34 分钟前
深度解析 Allen-Bradley 150-B135NBDA 智能电机控制器:选型、参数与工业应用
运维·数据库·单片机·嵌入式硬件·安全·自动化
`Levie38 分钟前
MySQL-数据库服务日志管理与数据闪回
数据库·mysql
香蕉大香蕉(06敬畏市场)42 分钟前
MySQL 单点详解(01)
java·数据库·mysql·面试·博客·实习
LaughingZhu1 小时前
Product Hunt 热榜 2026-10-30:Empacer、Scape、Floot in ChatGPT
java·前端·数据库·人工智能·chatgpt·notion
standxy1 小时前
即时库存同步实战:从旺店通拉取库存详情落库 MySQL 的完整策略
数据库·集成·电商
麦壳饼1 小时前
SonnetDB:工业 IoT 中的 PID 历史分析与 PLC 协作
数据库·sonnetdb