oracle中的minus,union

oracle中minus用来做减法操作,对结果集进行减法操作,A minus B就意味着将结果集A去除结果集B中所包含的所有记录后的结果,即在A中存在,而在B中不存在的记录。就是去除A表和B表的交集,对于B表中存在而A表中不存在的数据,不作任何操作,也不会抛出异常。

Oracle的minus是按列进行比较的,所以A minus B的前提条件是两表中有相同的列数,且列的数据类型相同,此外minus会对结果集进行去重,即如果A表中如果存在多条相同记录,在minus B表后对结果集重复的记录去重操作,只会留下一条。

实例:

那么:

       (1)“select id from t_user where id<6 minus select id from t_user where id between 3 and 7”的结果将为:

(2)“select age,level_no from t_user where id<8 minus select age,level_no from t_user where level=3”的结果为:



其实很好理解,可以一步步来,先写出select A表的记录,再写出B表的select记录,minus后得到是:

对于这个结果集最后要进行去重复操作,那么就得到了正确答案。

我们再来看两张表的情况:

测试例子:
s_info 店面营业额表:
s_name     s_date      sales
Angeles   2011-10-20   66.00
Diego     2012-01-20   128.00
angel     2013-01-01   500.00

i_info 网络营业额表:
s_date         sales 
2012-8-9       250.00
2012-01-20     120.98 
2013-02-8      360.00 
2011-10-25     400.68

而我们要知道有哪几天是有店面营业额而没有网络营业额的。要达到这个目的,我们用以下的 SQL 语句:
SELECT s_date FROM s_info
MINUS
SELECT s_date FROM i_info
结果:
s_date
2011-10-20
2013-01-01

说明:"2011-10-20", "2012-01-20", and "2013-01-01" 是 "SELECT Date FROM Store_Information" 所产生的结果。在这里面,"2012-01-20" 是存在于 "SELECT s_date FROM i_info" 所产生的结果中。因此 "2012-01-20" 并不在最后的结果中。
请注意,在 MINUS 指令下,不同的值只会被列出一次。

SQL中的UNION用法
UNION 指令的目的是将两个 SQL 语句的结果合并起来。从这个角度来看, UNION 跟 JOIN 有些许类似,因为这两个指令都可以由多个表格中撷取资料。 UNION 的一个限制是两个 SQL 语句所产生的栏位需要是同样的资料种类。另外,当我们用 UNION这个指令时,我们只会看到不同的资料值 (类似 SELECT DISTINCT)。
UNION 的语法如下:
[SQL 语句 1]
UNION
[SQL 语句 2]
假设我们有以下的两个表格,

表格: Store_Information
store_name       Sales             Date
Los Angeles      $1500          Jan-05-1999
San Diego        $250           Jan-07-1999
Los Angeles      $300           Jan-08-1999
Boston           $700           Jan-08-1999

表格: Internet Sales
Date             Sales
Jan-07-1999      $250
Jan-10-1999      $535
Jan-11-1999      $320
Jan-12-1999      $750

而我们要找出来所有有营业额 (sales) 的日子。要达到这个目的,我们用以下的 SQL 语句:
SELECT Date FROM Store_Information
UNION
SELECT Date FROM Internet_Sales
结果:
Date
Jan-05-1999
Jan-07-1999
Jan-08-1999
Jan-10-1999
Jan-11-1999
Jan-12-1999
有一点值得注意的是,如果我们在任何一个 SQL 语句 (或是两句都一起) 用 "SELECT DISTINCT Date" 的话,
那我们会得到完全一样的结果。
名字可以不一样。但是,数据类型必须相似。
也就是说主表(第一个表)第一列是varchar(100),副表(第一个以外的所有表)的第一列都要是varchar(100&&<100)(char好像也可以你试一下吧,或是可以自动转换数据类型),其它是不行的,
还有几个表的列数必须相同
++++++++++++++++++++++++
与MINUS功能类似的有
第一个
SELECT   表1.*    
FROM     表1,   表2
WHERE    表1.主键=表2.主键(+)  
AND   表2.主键   IS   NULL;
第二个
select   *   from   表1   where   not   exists(select   1   from   表2   where   表1.主键=表2.主键);
第三个
select   *   from   表1   where   表1.主键 not   in (select  主键   from   表2);
当然效率较高的还是MINUS。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值