注册 | 登录 忘记密码? 51cto首页 | 博客 | 论坛 | 招聘
热点文章 如何系统的学习linux?
 帮助

DB2 INTERSECT、EXCEPT、UNION集合操作测试


2007-08-09 18:26:04
版权声明:原创作品,如需转载,请与作者联系。否则将追究法律责任。
DB2 INTERSECT、EXCEPT、UNION集合操作测试
 
 
说明:DB2支持三种集合操作INTERSECT(交集)、EXCEPT(差集)、UNION(合集),在ORACLE等数据库里面也有类似的操作,但是细微的地方可能有些差别,现在专门测试一下,以求准确!玩数据千万要细心啊,否则会带来难以意料的结果,呵呵!
 
 
测试环境:
 
DROP TABLE  AA_WEEK;
CREATE TABLE AA_WEEK(
CODE SMALLINT NOT NULL,
EN_NAME VARCHAR(20) NOT NULL,
ABB VARCHAR(20),
CONSTRAINT P_AA_WEEK_CODE PRIMARY KEY (CODE)
);
COMMENT ON TABLE AA_WEEK IS
'星期';
COMMENT ON AA_WEEK
 (CODE IS '星期代码',
  EN_NAME IS '英文星期名',
  ABB IS '英文缩写'
 );
INSERT INTO AA_WEEK VALUES
(1,'Monday','Mon'),
(2,'Tuesday','Tues'),
(3,'Wednesday','Wed'),
(4,'Thursday','Thurs'),
(5,'Friday','Friday'),
(6,'Saturday','Sat'),
(7,'Sunday','Sun');
COMMIT;
 
查询一把,看看所有数据:
SELECT * FROM AA_WEEK;
+------+-----------+--------+
| CODE | EN_NAME   | ABB    |
+------+-----------+--------+
|    1 | Monday    | Mon    |
|    2 | Tuesday   | Tues   |
|    3 | Wednesday | Wed    |
|    4 | Thursday  | Thurs  |
|    5 | Friday    | Friday |
|    6 | Saturday  | Sat    |
|    7 | Sunday    | Sun    |
+------+-----------+--------+
 

一、交集运算:INTERSECT、INTERSECT ALL
 
-- 求交集:A交B
SELECT * FROM AA_WEEK X WHERE X.CODE IN (1,2,3) -- 集合A
INTERSECT                                       -- 集合B
SELECT * FROM AA_WEEK X WHERE X.CODE IN (2,3,4);
---------------------------------
2       'Tuesday'       'Tues'
3       'Wednesday'     'Wed'
 
说明:INTERSECT和INTERSECT ALL是等效的。
 
二、差集运算:EXCEPT、EXCEPT ALL
 
-- 求差集:A减B
SELECT * FROM AA_WEEK X WHERE X.CODE IN (1,2,3) -- 集合A
EXCEPT                                          -- 集合B
SELECT * FROM AA_WEEK w WHERE w.CODE IN (2,3,4);        
 
说明:EXCEPT和EXCEPT ALL是等效的。
---------------------------------
1       'Monday'        'Mon'
 
三、合集运算:UNION、UNION ALL
 
-- 求合集:A+B(不消除重复行)
SELECT * FROM AA_WEEK X WHERE X.CODE IN (1,2,3) -- 集合A
UNION ALL                                       -- 集合B
SELECT * FROM AA_WEEK X WHERE X.CODE IN (2,3,4);
---------------------------------
2       'Tuesday'       'Tues'
3       'Wednesday'     'Wed'
4       'Thursday'      'Thurs'
1       'Monday'        'Mon'
2       'Tuesday'       'Tues'
3       'Wednesday'     'Wed'
 
-- 求合集:A+B(消除重复行)
SELECT * FROM AA_WEEK X WHERE X.CODE IN (1,2,3) -- 集合A
UNION                                   -- 集合B
SELECT * FROM AA_WEEK X WHERE X.CODE IN (2,3,4);
---------------------------------
1       'Monday'        'Mon'
4       'Thursday'      'Thurs'
2       'Tuesday'       'Tues'
3       'Wednesday'     'Wed'
 
说明:UNION和UNION ALL是不同的。UNION消除重复行记录,UNION ALL不消除重复行记录。
 
--------《完》

本文出自 “熔 岩” 博客,转载请与作者联系!





    文章评论
 
2007-08-09 21:26:11
数据确实为很重要的东西,一般没有把握千万别动
万一出个什么事,很难交待的
要向博主学习,先好好看看,以后再动

2008-09-01 10:58:43
EXCEPT和EXCEPT ALL是等效的?
INTERSECT和INTERSECT ALL是等效的?
笑话

2008-09-01 11:00:27
你看看等效吗?
最好在postgres上执行,因为oracle和sql不支持次语法
drop table t1;
drop table t2;
create table t1(name varchar(10));
insert into t1 values('wxz');
insert into t1 values('wq');
insert into t1 values('xwp');
insert into t1 values('gg');
insert into t1 values('wq');

create table t2(name varchar(10));
insert into t2 values('xwp');
insert into t2 values('qd');
insert into t2 values('zhdk');
insert into t2 values('wq');

2008-09-02 09:07:54
我昔日测试的环境并非你的环境,不同数据库对这块支持是有差异的。集合运算仅仅是数据库MS的一个特性。不可一概而论,写这篇文章,希望大家了解到数据库有集合运算的功能。

看看运算符单词的意思,一般人都能猜个八九不离十。至于是否是那样,就不一定了,也许是数据库实现的问题,也许是自己的问题。

现在拿着另外一个环境的测试和结果,无异于刻舟求剑,缘木求鱼!

2008-09-02 09:11:13
如果你真需要得到与我同样的测试结果,你可以试试安装db2 v9 r1 企业版 ,这个版本并非正式发布版。虽然这个结果出乎我的意料,但是在当时哪个环境下,我就要遵循实际环境的测试结果。

 

发表评论

昵   称:
验证码:  点击图片可刷新验证码  博客过2级,无需填写验证码
内   容: