oracle中的minus,union

来源:互联网 发布:fanuc编程 编辑:程序博客网 时间:2024/06/06 09:40

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
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 邻居装修太吵怎么办 楼下装修太吵怎么办 长得太丑怎么办 嫌弃自己太丑怎么办 平板支撑撑不住怎么办 醒发箱湿度乱了怎么办 老人迷信保健床怎么办 老人被骗买保健怎么办 骗老人买保健品怎么办 被怀疑是举报人怎么办 孩子写作业慢怎么办 打狂犬疫苗发烧怎么办 婚姻出现小三怎么办 老公小三生孩子怎么办 后妈对孩子不好怎么办 被后妈打的孩子怎么办 梦到拉不出来怎么办 拉水怎么办在学校 尿急又没厕所怎么办 尿急上不了厕所怎么办 胃着凉了拉肚子怎么办 小孩拉肚子拉水怎么办 拉痢疾带血怎么办 肚子痛拉稀带血怎么办 小孩肚子受凉拉肚子怎么办 心难受还拉肚子怎么办 突然拉肚子拉水怎么办 突然拉稀拉水怎么办 孕妇拉稀拉水怎么办 小孩太笨了怎么办 孩子头磕出大包怎么办 宝宝头有点歪怎么办 很重打孩子头了怎么办 腰脊椎侧弯怎么办 打篮球戳到手指怎么办 荨麻疹脸上也有怎么办 慢性荨麻疹很痒怎么办 广电录制观众票怎么办 泪点低怎么办能治疗吗 妈妈不在了我该怎么办 如果妈妈去世了怎么办