db2和oracle齿轮,DB2 与ORACLE对比

本文详细比较了DB2与Oracle在专用寄存器、临时表定义、数据查询、插入、更新、合并查询等方面的语法差异。DB2支持INTERSECT、EXCEPT和UNION操作,并提供了与Oracle类似的多行插入功能,但存在一些细微区别。在更新语法中,DB2允许直接设置多个字段,而Oracle则需要使用子查询。此外,DB2的截断操作与Oracle的TRUNCATE命令有不同选项。文章还探讨了DB2的WITH AS语法与Oracle的差异。

DB2专用寄存器

values(currentdate)

values(currentrefresh age)

values(currentdefaulttransformgroup)

values(currentschema)

values(currentdegreecurrentserver)

values(currentexplainmode)

values(currenttime)

values(currentexplain snapshot)

values(currenttimestamp)

values(currentnode)

values(currenttimezone)

values(currentpathuser)

values(currentquery optimization)

DB2临时表定义规则

declare global temporary table session.templ --定义临时表templ

like employee--定义临时表类型与employee表名类似

on commit preserve rows--定义当数据提交后写入临时表

not logged--不记录历史

in mytempspace--定义表空间

与Oracle区别在与create declare

具体语法可以参考官方:

应用举例:

declare global temporary table session.templ --定义临时表templ

like a--定义临时表类型与employee表名类似

on commit preserve rows--定义当数据提交后写入临时表;与Oracle一致的

not logged--不记录历史

in test--定义表空间

declare global temporary table session.test --定义临时表templ

like a--定义临时表类型与employee表名类似

on commit delete rows--数据在Transaction期间有效,一旦COMMIT后,数据就被自动TRUNCATE掉了;与Oracle一致的

not logged--不记录历史

in test--定义表空间

DB2访问前10行数据与Oracle区别

DB2 --select*fromtestfetchfirst10rows only

Oracle -- select * from test where rownum<=10

DB2 Insert into与Oracle区别

DB2允许有类似这样多行插入insert into staff values(1212,'cemy',20,'sales',3,90000,30000),

(1212,'cemy',20,'sales',3,90000,30000);

举例:

SQL> insert into staff values(1212,'cemy',20,'sales',3,90000,30000);

已创建1行。

SQL> insert into staff values(1212,'cemy',20,'sales',3,90000,30000),(1212,'cemy'

,20,'sales',3,90000,30000);

insert into staff values(1212,'cemy',20,'sales',3,90000,30000),(1212,'cemy',20,'

sales',3,90000,30000)*

第1行出现错误:

ORA-00933: SQL命令未正确结束

DB2 Update与Oracle区别

DB2 update staff set (salary,comm)=(80000,50000);

DB2 update staff set salary=80000,comm=50000;

举例:

SQL> update staff set (salary,comm)=(80000,50000);

update staff set (salary,comm)=(80000,50000)*

第1行出现错误:

ORA-01767: UPDATE ...SET表达式必须是子查询

SQL> update staff set salary=80000,comm=50000;

已更新1行。

DB2合并查询与Oracle区别

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貌似Oracle没有求交集,项目暂时还没有留意到

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与Oracle的minus一致

--求差集: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与Oracle时等效的

DB2与Oracle类似语法

如:existscase when in

DB2 With as语法与Oracle区别

DB2WITH TMP_MON(MON) --(MON)必须加上否则会有错误

AS (VALUES 1,2,3,4,5,6,7,8,9,10,11,12) SELECT * FROM TMP_MON

如:WITH TMP_MONAS (VALUES 1,2,3,4,5,6,7,8,9,10,11,12)

SELECT * FROM TMP_MON

DB2 Database Error: ERROR [42908] [IBM][DB2/NT64] SQL0153NThe statement does not include a required column list.SQLSTATE=42908

Oraclewith a as (select * from test)

select * from a;

Oracle其实就是把一大堆重复用到的SQL语句放在with as里面,取一个别名,后面的查询就可以用它

这样对于大批量的SQL语句起到一个优化的作用,而且清楚明了

DB2截断与Oracle truncate区别

DB2:ALTER TABLE TEST ACTIVATE NOT LOGGED INITIALLY WITH EMPTY TABLE

Oracle:truncate table

Truncate语法:TRUNCATE TABLE name [DROP/REUSE STORAGE]

DROP STORAGE:显式指明释放数据表和索引的空间

REUSE STORAGE:显式指明不释放数据表和索引的空间[@more@]

据说 DB2 V9.7 开始与ORACLE语法兼容。ITPUB 上也有人开始研究。

我这里是项目用的DB2V9.5版本还是有很多不同,简单记录在这里备忘

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值