ORACLE SQL SET运算符

**

ORACLE SQL SET运算符

**

开发工具与关键技术:Oracle sql*plus  PLSQL Developer
作者:何任贤
撰写时间:2019年01月01日

SET运算符,主要是对两个查询或多个查询的结果进行运算,不过只有加减,意思是能把结果进行加减,不过该加减不是数字的加减而是集的加减。
SET运算符四大关键字(UNION 、 UNION ALL、INTERSECT、MINUS),意思分别是并集
(去重复)、并集(不去重复)、交集、差集。
注意事项:使用SET运算符时,要保证两个查询或多个查询数据数据类型一致,列数一致,但必须保证列数和数据类型一致,若列名不一致则默认为第一个查询的列名。
1、 UNION,合并数据并且把重复的数据去掉
2、 UNION ALL, 只合并数据不会把重复的数据去掉
可以理解为UNION只是比UNION ALL多了一个去重复,具体如示例一
示例一:
图1  图2

  图1                                  图2

图1是表数据 、图2是表结构,其中SNO代表学号、CNO代表科目号、SCORE代表成绩。

题目:获取每个科目成绩的最小值和每个科目成绩的最大值,并且要求把成绩的最大值和成绩的最小值合并,然后再列出科目号、成绩。

代码1:
SELECT CNO,MAX(SCORE) as SCORE FROM SC GROUP BY CNO
UNION
SELECT CNO,MIN(SCORE) as SCORE FROM SC GROUP BY CNO
代码2:
SELECT CNO,MAX(SCORE) as SCORE FROM SC GROUP BY CNO
UNION ALL
SELECT CNO,MIN(SCORE) as SCORE FROM SC GROUP BY CNO
图3 图4

    图3                图4

代码一的结果为图3 ,代码二的结果为图4,由此可以看出UNION和UNION ALL区别,明显的可以看到UNION不仅会把数据合并,并且会把重复的数据去掉,只保留重复数据中的其中一条,而UNION ALL只是合并数据不并会把数据进行任何的改动。
这就是UNION和UNION ALL的特点,我们可以根据自己的需求来应用。

3、 INTERSECT,获取两个查询或多个查询的数据的相同的数据,意思是保留相同的数据不同的去掉,且只保留一条相同的。
示例二:
图1是表数据 、图2是表结构,其中SNO代表学号、CNO代表科目号、SCORE代表成绩。

题目:获取每个科目成绩的最小值和每个科目成绩的最大值,并且要求把它们之间相同的数据保留出来,然后再列出科目号、成绩。

代码:
SELECT CNO,MAX(SCORE) as SCORE FROM SC GROUP BY CNO
INTERSECT
SELECT CNO,MIN(SCORE) as SCORE FROM SC GROUP BY CNO
结果为图5
图5
图5
从结果可以看到INTERSECT的特点,它代表交集,它是把相同的部分保留一份出来,不同的全部去掉,该特点跟数学的交集非常相似。

4、 MINUS,差集,意思是集合一减去集合二所剩下的数据,叫做差集,差是被减数-减数=差,集是集合的意思。
示例三:
图1是表数据 、图2是表结构,其中SNO代表学号、CNO代表科目号、SCORE代表成绩。

题目:获取每个科目成绩的最小值和每个科目成绩的最大值,并且要求将最大值的数据减去最小值的数据,然后再列出科目号、成绩。
代码:
SELECT CNO,MAX(SCORE) as SCORE FROM SC GROUP BY CNO
MINUS
SELECT CNO,MIN(SCORE) as SCORE FROM SC GROUP BY CNO

结果为图6、最大值的数据为图7、最小值数据为图8
图6图7 图8

	图6			     	图7   				图8

由图6、图7、图8,我们可以明显的看出MINUS的特点,图7减去图8等于图6,可以看到的是科目C003被去掉了,只保留了科目C001和C002的最大值,MINUS的特点就是把相同的数据去掉只保留第一个查询的数据,而第二个查询的数据不管有没有重复都不要。
上面我们说到SET 运算符是加减法,由示例一、二、三,我们可以看到的是UNION和UNION ALL都是加法,只不过是UNION只保留一条相同的数据,UNION ALL保留两条或多条相同的数据,而INTERSECT和MINUS是减法,INTERSECT则是减去不同的数据,且只保留一条相同的数据,而MINUS则是把数据一的数据减去和数据二相同的数据,保留和数据二不同的数据,不保留数据二的任何数据。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值