• 技术文章 >数据库 >Oracle

    db2与oracle的sql语句有什么区别

    长期闲置长期闲置2022-05-30 18:13:30原创377

    区别:1、db2用“create table a like b”创建类似表,oracle用“create table a as select * from b”;2、db2用varchar类型转换,oracle用“to_char”函数转换。

    本教程操作环境:Windows10系统、Oracle 11g版、Dell G3电脑。

    db2与oracle的sql语句有什么区别

    1.创建类似表语法

    Oracle : 
    	create table a as select * from b;
    DB2    : 
    	create table a like b;
    		 
    	(8版本有效,9版本无效)
    	create table new_a as select col1,col2... from a definition only

    2.快速清空大表语法

    Oracle : 
    	truncate table a;
    DB2    :
    	alter table a active not logged initially with empty table;

    3.取前N条数据语法

    Oracle : 
    	select * from a where rownum <= N;
    DB2    :
    	select * from a fetch first N rows only;

    4.取得系统时间语法

    Oracle :
    	select sysdate from dual;
    DB2    :
    	select current timestamp from sysibm.sysdummy1;

    5.空值转换方式不同

    Oracle :
    	select col1,col2,nvl(col3,'0') from tablename; (判断col3字段是否为空,不为空就输出原来的数值,为空就输出0)
    DB2   :
    	select col1,col2,value(col3,'0') from tablename;
    	
    	(mysql和Db2可以使用Coalesce(col3,'0')函数来实现上述功能)
    Coalesce()函数
    这个函数主要用来进行空值处理,其参数格式如下: COALESCE ( expression,value1,value2……,valuen) 
    COALESCE()函数的第一个参数expression为待检测的表达式,而其后的参数个数不定。
    COALESCE()函数将会返回包括expression在内的所有参数中的第一个非空表达式。
    	如果expression不为空值则返回expression;
    	否则判断value1是否是空值,如果value1不为空值则返回value1;
    	否则判断value2是否是空值,如果value2不为空值则返回value2;
    	……以此类推,
    	如果所有的表达式都为空值,则返回NULL。

    6.类型转换方式不同

    oracle :
    	select to_char(sysdate,'YYYY-MM-DD HH24:MI:SS') from dual;
    DB2    :
    	select varchar(current timestamp) from sysibm.sysdummy1;

    解析:

    Oracle数据类型改变函数:to_char()、to_date()、to_number()等;
    	如果仅仅取年,月,日等,可以用
    		to_char(sysdate, 'YYYY'),
    		to_char('MM') ,
    		to_char('DD')取得。
    	只取年月日TRUNC(SYSDATE)。
    	取时分秒TO_CHAR(SYSDATE,'HH24:MI:SS')。
    
    DB2数据类型改变函数:char()、varchar()、int()、date()、time()等;
    	取得年,月,日等的写法:
    		YEAR(current timestamp),
    		MONTH(current timestamp),
    		DAY(current timestamp),
    		HOUR(current timestamp),
    		MINUTE(current timestamp),
    		SECOND(current timestamp),
    		MICROSECOND(current timestamp),
    	只取年月日可以用
    		DATE(current timestamp),
    	取时分秒
    		TIME(current timestamp)。
    	Char()是定长字符串(1-255),varchar()为非定长字符串(1-32672)日期,
    	时间形态变为字符形态: 
    		char(current date),
    		char(current time)
    	将字符串转换成日期或时间形态:
    		TIMESTAMP('2002-10-2012:00:00'),
    		DATE('2002-10-20'),
    		DATE('10/20/2002'),
    		TIME('12:00:00')

    目前DB2 V8也支持to_char和to_date,V9版新增了to_number

    7.字符串转换为日期方式不同(To_Number/cast)

    Oracle:
    	select to_number('123') from dual;
    	select cast('123' as integer) from dual;
    DB2   :
    	select cast('123' as integer) from sysibm.sysdummy1;
    	select cast(current time as char(8)) from sysibm.sysdummy1;

    8.子查询

    Oracle:
    	直接用子查询
    
    Db2:WITH语句
    	WITH  a1 AS(SELECT max(id) AS aa1 FROM test )SELECT id ,aa1 FROM test ,a1

    9.递归查询(分层查询)

    Oracle递归查询:CONNECT BY PRIOR ... START WITH ...
    DB2   递归查询:DB2较难理解,要WITH一个虚拟表
    Oracle:
    //从child是son的数据向上查询出所有的长辈select distinct test_parent from (
           select t.test_parent from t_test t 
                  connect by prior t.test_parent = t.test_child 
                  start with t.test_child = 'son' )

    在这里插入图片描述
    了解更多:Oracle分层查询(递归查询):start with…connect by prior 以及 level关键字

    DB2:
    // Db2递归查询写法with par_test(test_child,test_parent) as(
         select test_child,test_parent from t_test where child='grandchild'  -- 设置递归起点
         union all
         select t.test_child,t.test_parent from par_test pt,t_test t where pt.test_parent = t.test_child ----递归的方向为从子向父)select distinct test_parent from par_test

    在这里插入图片描述
    在这里插入图片描述
    如上图,从grandchild开始查询其所有的父节点,首先设定虚拟表起点,即左边第四行;依次往上推,其父亲是son = 上一行的child,即VT.parent = T.child…

    最后查询结果为:

    test_parent
    son
    father
    grandpa

    10.数据类型有差别

    比较大的差别:
    1. char大小对比
       Oracle: char 2000
       DB2   : char 254
    2. 日期类型
       Oracle: date datetime
       DB2   :date(日期) time(时间)timestamp(日期时间)

    11.关于rowId

    Oracle中它是由数据库唯一产生的,在程序中可以获得
    DB2  在V8版本才有此功能

    12.decode方法

    Oracle: 
    	decode方法(decode(条件,值1,翻译值1,值2,翻译值2,...,值n,翻译值n,缺省值)) 【函数用法在下边有链接】
    	或者
    	case语句
    
    DB2:
    	只有case表达式
    
    	示例语句:
    	select id,name,
    		case when integer(flag)=0 then '假'
    			 when integer(flag)=1 then '真'
    		else '异常' end
    	from test
    	或者
    	select id,name,
    		case integer(flag) when 0 then '假' 
    						   when 1 then '真'
    		else '异常' end
    	from test

    推荐教程:《Oracle视频教程

    以上就是db2与oracle的sql语句有什么区别的详细内容,更多请关注php中文网其它相关文章!

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    专题推荐:oracle
    上一篇:oracle怎么查询归档空间 下一篇:oracle 11g怎么关闭rac
    VIP课程(WEB全栈开发)

    相关文章推荐

    • 【活动】充值PHP中文网VIP即送云服务器• oracle怎么修改directory目录• oracle的用户权限有哪些• oracle的错误959怎么解决• oracle怎么设置数据库只读• oracle中insert会锁表吗
    1/1

    PHP中文网