1.开放性: SQL Server 只能在windows 上运行,没有丝毫的开放性,操作系统的系统的稳定对数据库是十分重要的。Windows9X系列产品是偏重于桌面应用,NT server只适合中小型企业。而且windows平台的可靠性,安全性和伸缩性是非常有限的。它不象unix那样久经考验,尤其是在处理大数据量的关键业务时. Oracle 能在所有主流平台上运行(包括 windows)。完全支持所有的工业标准。采用完全开放策略。可以使客户选择最适合的解决方案。对开发商全力支持。 DB2 能在所有主流平台上运行(包括windows)。最适于海量数据。DB2在企业级的应用最为广泛,在全球的500家最大的企业中,几乎85%以上用DB2数据库服务器,而国内到97年约占5%.
2.可伸缩性,并行性 SQL server DB2 并行实施和共存模型并不成熟。很难处理日益增多的用户数和数据卷。伸缩性有限。 Oracle 平行服务器通过使一组结点共享同一簇中的工作来扩展windownt的能力,提供高可用性和高伸缩性的簇的解决方案。 如果windowsNT不能满足需要, 用户可以把数据库移到UNIX中。 DB2 DB2具有很好的并行性。DB2把数据库管理扩充到了并行的、多节点的环境. 数据库分区是数据库的一部分,包含自己的数据、索引、配置文件、和事务日 志。数据库分区有时被称为节点或数据库节点
3.安全性 SQL server 没有获得任何安全证书。 Oracle Server 获得最高认证级别的ISO标准认证。 DB2 获得最高认证级别的ISO标准认证。
4.性能 SQL Server 多用户时性能不佳 Oracle 性能最高, 保持windowsNT下的TPC-D和TPC-C的世界记录。 DB2 适用于数据仓库和在线事物处理 性能较高。
5.客户端支持及应用模式 SQL Server C/S结构,只支持windows客户,可以用ADO,DAO,OLEDB ,ODBC连接. Oracle 多层次网络计算,支持多种工业标准,可以用ODBC, JDBC,OCI等网络客户连接 DB2 跨平台,多层结构,支持ODBC,JDBC等客户
6.操作简便 SQL Server 操作简单,但只有图形界面. Oracle 较复杂, 同时提供GUI和命令行,在windowsNT和unix下操作相同 DB2 操作简单,同时提供GUI和命令行,在windowsNT和unix下操作相同
7.使用风险 SQL server 完全重写的代码,经历了长期的测试,不断延迟,许多功能需要时间来证明。并不十分兼容早期产品。使用需要冒一定风险。 Oracle 长时间的开发经验,完全向下兼容。得到广泛的应用。完全没有风险。 DB2 在巨型企业得到广泛的应用,向下兼容性好。风险小。
8、文件体系结构 ORACLE的文件体系结构为: 参数 .ORA (参数文件) 数据文件 .DBF (真实数据) 日志文件 .RDO (用来做灾难性的数据备份) 控制文件 .CTL (将数据库的物理文件映射到了数据字典中的逻辑表空间和连机重做日志文件上去,确保数据的一致性) SQL SERVER的文件体系结构为: .MDF (主要数据文件) .NDF (扩展文件,可以有多个) .LDF (日志文件,可以有多个,存放在联机重做日志数据,这里的日志文件有一个缺点就是如果日志文件已填小巧玲珑的话,SQL将自动停止运行并等待人工干预,所以要经常监控日志的情况保证系统的稳定运行)。 9、存储结构 ORACLE有以下基本表空间: SYSTEM表空间(存放数据字典和数据管理自身所需的信息) UNDOTBS回滚表空间 TEMP临时表空间 TOOLS交互式表空间 USERS用户默认表空间 INDX索引表空间 不同的数据分别放在不同的表空间(数据字典与真实数据分开存放);基表(存储系统 参数信息)是加密存储,任何人都无法访问,只能通过用户可视视图查看。 SQL SERVER有五个基本数据库: master(数据字典) mode(存放样版) tempdb(临时数据库) msdb(存放调度信息和日志信息) pubs(示例数据库) 真实数据与数据字典存放在一起;对系统参数信息无安全机制。
10、参数文件 Oracle的参数文件init.ora是可调的,既我们可以根据数据库的规模调整Oracle对系统资源的使用情况,以达到最合理的资源分配,让Oracle达到最佳的性能。 SQL Server的配置参数是内定的不可调整,它对系统资源的分配是固定的,不受拥护控制,因此无法同时处理大量用户的需求,这限制了它只能作为中,小型数据库。
11、日志文件 Oracle的日志默认有3个,先写入1号日志,满了后再写入2号日志,2号满了再写入3号日志,3号满了后Oracle将自动备分1号日志的内容,然后清空后写入新的日志信息,且Oracle的日志有多路复用功能,我们可以为日志创建多个镜像,把相同的日志信息同时写入多个日志文件中,这样可以防止磁盘损坏造成的数据丢失。 SQL Server对每个数据库只能分配一个日志文件。且当日志填满后,日志将停止工作,等待人工干预,而无法自动重用。
12、控制文件 Oracle的控制文件记录了数据库文件的物理位置和有效性,在每次打开Oracle系统都将自动对数据进行验证,查看其有效性,防止数据的丢失,这体现了Oracle对数据管理的严密性。 SQL Server无此安全机制,只用在使用到了数据库的信息后,系统才去查找数据是否存在。
13、数据类型 ORACLE的数据类型比较复杂,有基本数据类型,衍生型,列对象型,表对象型,结构体型 SQL中的数据比较简单,只有一些简单的基本数据类型无法提供事务操作。
SQL Server和Oracle的常用函数对比
---------数学函数
1.绝对值 S:select abs(-1) value O:select abs(-1) value from dual
2.取整(大) S:select ceiling(-1.001) value O:select ceil(-1.001) value from dual
3.取整(小) S:select floor(-1.001) value O:select floor(-1.001) value from dual
4.取整(截取) S:select cast(-1.002 as int) value O:select trunc(-1.002) value from dual
5.四舍五入 S:select round(1.23456,4) value 1.23460 O:select round(1.23456,4) value from dual 1.2346
6.e为底的幂 S:select Exp(1) value 2.7182818284590451 O:select Exp(1) value from dual 2.71828182
7.取e为底的对数 S:select log(2.7182818284590451) value 1 O:select ln(2.7182818284590451) value from dual; 1
8.取10为底对数 S:select log10(10) value 1 O:select log(10,10) value from dual; 1
9.取平方 S:select SQUARE(4) value 16 O:select power(4,2) value from dual 16
10.取平方根 S:select SQRT(4) value 2 O:select SQRT(4) value from dual 2
11.求任意数为底的幂 S:select power(3,4) value 81 O:select power(3,4) value from dual 81
12.取随机数 S:select rand() value O:select sys.dbms_random.value(0,1) value from dual;
13.取符号 S:select sign(-8) value -1 O:select sign(-8) value from dual -1
----------三角函数相关
14.圆周率 S:SELECT PI() value 3.1415926535897931 O:不知道
15.sin,cos,tan 参数都以弧度为单位 例如:select sin(PI()/2) value 得到1(SQLServer)
16.Asin,Acos,Atan,Atan2 返回弧度
17.弧度角度互换(SQLServer,Oracle不知道) DEGREES:弧度-〉角度 RADIANS:角度-〉弧度
---------数值间比较
18. 求集合最大值 S:select max(value) value from (select 1 value union select -2 value union select 4 value union select 3 value)a
O:select greatest(1,-2,4,3) value from dual
19. 求集合最小值 S:select min(value) value from (select 1 value union select -2 value union select 4 value union select 3 value)a
O:select least(1,-2,4,3) value from dual
20.如何处理null值(F2中的null以10代替) S:select F1,IsNull(F2,10) value from Tbl O:select F1,nvl(F2,10) value from Tbl
--------字符串函数
21.求字符序号 S:select ascii('a') value O:select ascii('a') value from dual
22.从序号求字符 S:select char(97) value O:select chr(97) value from dual
23.连接 S:select '11'+'22'+'33' value O:select CONCAT('11','22')||33 value from dual
23.子串位置 --返回3 S:select CHARINDEX('s','sdsq',2) value O:select INSTR('sdsq','s',2) value from dual
23.模糊子串的位置 --返回2,参数去掉中间%则返回7 // 本文转自 C++Builder 研究 - http://www./article.asp?i=996&d=dwn1rn S:select patindex('%d%q%','sdsfasdqe') value O:oracle没发现,但是instr可以通过第四个参数控制出现次数 select INSTR('sdsfasdqe','sd',1,2) value from dual 返回6
24.求子串 S:select substring('abcd',2,2) value O:select substr('abcd',2,2) value from dual
25.子串代替 返回aijklmnef S:SELECT STUFF('abcdef', 2, 3, 'ijklmn') value O:SELECT Replace('abcdef', 'bcd', 'ijklmn') value from dual
26.子串全部替换 S:Replace O:select Translate('fasdbfasegas','fa','我' ) value from dual
27.长度 S:len,datalength O:length
28.大小写转换 lower,upper
29.单词首字母大写 S:没发现 O:select INITCAP('abcd dsaf df') value from dual
30.左补空格(LPAD的第一个参数为空格则同space函数) S:select space(10)+'abcd' value O:select LPAD('abcd',14) value from dual
31.右补空格(RPAD的第一个参数为空格则同space函数) S:select 'abcd'+space(10) value O:select RPAD('abcd',14) value from dual
32.删除空格 S:ltrim,rtrim O:ltrim,rtrim,trim
33. 重复字符串 S:select REPLICATE('abcd',2) value O:没发现
34.发音相似性比较(这两个单词返回值一样,发音相同) S:SELECT SOUNDEX ('Smith'), SOUNDEX ('Smythe') O:SELECT SOUNDEX ('Smith'), SOUNDEX ('Smythe') from dual SQLServer中用SELECT DIFFERENCE('Smithers', 'Smythers') 比较soundex的差 返回0-4,4为同音,1最高
--------------日期函数
35.系统时间 S:select getdate() value O:select sysdate value from dual
36.前后几日 直接与整数相加减
37.求日期 S:select convert(char(10),getdate(),20) value O:select trunc(sysdate) value from dual select to_char(sysdate,'yyyy-mm-dd') value from dual
38.求时间 S:select convert(char(8),getdate(),108) value O:select to_char(sysdate,'hh24:mm:ss') value from dual
39.取日期时间的其他部分 S:DATEPART 和 DATENAME 函数 (第一个参数决定) O:to_char函数 第二个参数决定
参数---------------------------------下表需要补充 year yy, yyyy quarter qq, q (季度) month mm, m (m O无效) dayofyear dy, y (O表星期) day dd, d (d O无效) week wk, ww (wk O无效) weekday dw (O不清楚) Hour hh,hh12,hh24 (hh12,hh24 S无效) minute mi, n (n O无效) second ss, s (s O无效) millisecond ms (O无效) ----------------------------------------------
40.当月最后一天 S:不知道 O:select LAST_DAY(sysdate) value from dual
41.本星期的某一天(比如星期日) S:不知道 O:SELECT Next_day(sysdate,7) vaule FROM DUAL;
42.字符串转时间 S:可以直接转或者select cast('2004-09-08'as datetime) value O:SELECT To_date('2004-01-05 22:09:38','yyyy-mm-dd hh24-mi-ss') vaule FROM DUAL;
43.求两日期某一部分的差(比如秒) S:select datediff(ss,getdate(),getdate()+12.3) value O:直接用两个日期相减(比如d1-d2=12.3) SELECT (d1-d2)*24*60*60 vaule FROM DUAL;
44.根据差值求新的日期(比如分钟) S:select dateadd(mi,8,getdate()) value O:SELECT sysdate+8/60/24 vaule FROM DUAL;
45.求不同时区时间 S:不知道 O:SELECT New_time(sysdate,'ydt','gmt' ) vaule FROM DUAL;
-----时区参数,北京在东8区应该是Ydt------- AST ADT 大西洋标准时间 BST BDT 白令海标准时间 CST CDT 中部标准时间 EST EDT 东部标准时间 GMT 格林尼治标准时间 HST HDT 阿拉斯加—夏威夷标准时间 MST MDT 山区标准时间 NST 纽芬兰标准时间 PST PDT 太平洋标准时间 YST YDT YUKON标准时间
Oracle支持的字符函数和它们的Microsoft SQL Server等价函数:
函数 Oracle Microsoft SQL Server 把字符转换为ASCII ASCII ASCII 字串连接 CONCAT (expression + expression) 把ASCII转换为字符 CHR CHAR 返回字符串中的开始字符(左起) INSTR CHARINDEX 把字符转换为小写 LOWER LOWER 把字符转换为大写 UPPER UPPER 填充字符串的左边 LPAD N/A 清除开始的空白 LTRIM LTRIM 清除尾部的空白 RTRIM RTRIM 字符串中的起始模式(pattern) INSTR PATINDEX 多次重复字符串 RPAD REPLICATE 字符串的语音表示 SOUNDEX SOUNDEX 重复空格的字串 RPAD SPACE 从数字数据转换为字符数据 TO_CHAR STR 子串 SUBSTR SUBSTRING 替换字符 REPLACE STUFF 将字串中的每个词首字母大写 INITCAP N/A 翻译字符串 TRANSLATE N/A 字符串长度 LENGTH DATELENGTH or LEN 列表中最大的字符串 GREATEST N/A 列表中最小的字符串 LEAST N/A 如果为NULL则转换字串 NVL ISNULL
日期函数
函数 Oracle Microsoft SQL Server 日期相加 (date column +/- value) or ADD_MONTHS DATEADD 两个日期的差 (date column +/- value) or MONTHS_BETWEEN DATEDIFF 当前日期和时间 SYSDATE GETDATE() 一个月的最后一天 LAST_DAY N/A 时区转换 NEW_TIME N/A 日期后的第一个周日 NEXT_DAY N/A 代表日期的字符串 TO_CHAR DATENAME 代表日期的整数 TO_NUMBER (TO_CHAR)) DATEPART 日期舍入 ROUND CONVERT 日期截断 TRUNC CONVERT 字符串转换为日期 TO_DATE CONVERT 如果为NULL则转换日期 NVL ISNULL
转换函数
函数 Oracle Microsoft SQL Server 数字转换为字符 TO_CHAR CONVERT 字符转换为数字 TO_NUMBER CONVERT 日期转换为字符 TO_CHAR CONVERT 字符转换为日期 TO_DATE CONVERT 16进制转换为2进制 HEX_TO_RAW CONVERT 2进制转换为16进制 RAW_TO_HEX CONVERT
其它行级别的函数
函数 Oracle Microsoft SQL Server 返回第一个非空表达式 DECODE COALESCE 当前序列值 CURRVAL N/A 下一个序列值 NEXTVAL N/A 如果exp1 = exp2, 返回null DECODE NULLIF 用户登录账号ID数字 UID SUSER_ID 用户登录名 USER SUSER_NAME 用户数据库ID数字 UID USER_ID 用户数据库名 USER USER_NAME 当前用户 CURRENT_USER CURRENT_USER 用户环境(audit trail) USERENV N/A 在CONNECT BY子句中的级别 LEVEL N/A
合计函数
函数 Oracle Microsoft SQL Server Average AVG AVG Count COUNT COUNT Maximum MAX MAX Minimum MIN MIN Standard deviation STDDEV STDEV or STDEVP Summation SUM SUM Variance VARIANCE VAR or VARP
Oracle还有一个有用的函数EXTRACT,提取并且返回日期时间或时间间隔表达式中特定的时间域: EXTRACT(YEAR FROM 日期)
--1.数据类型不同。 --sql server 的数据类型:int ,smallint ,char,varchar,nchar,nvarchar,ntext,datetime,smalldatetime,money,decima, --float,bit…… --oracle 的数据类型:number(p,s),char,varchar2,Date,LOB --注意:insert into table_name values('1','张三','男',date'2012-3-5');---插入字符串日期前加date转换类型 --2.获得当前系统时间的函数不同。 --sql server :getdate() --oracle:sysdate --例如:设定日期格式的函数:to_char(sysdate,'yyy-mm-dd'); --3.在oracle中没有默认约束的说法 --sql server 中添加默认约束:alter table talbe_name add DF_table_name default('男') for sex; --oracle 中添加默认值:alter table table_name modify(sex default('男'));
--4.连接变量和字符串的方式不一样 --sql server 中连接:使用“+”连接,例如:print 'aaaa'+@name; --oracle 中连接:使用“||”连接,例如:dbms_output.put_line('aaa'||name);---name为变量 --5.oracle没有identity自动增长列,而是使用序列实现增长 --sql server 自动增长:在表的主键列中可直接使用identity(1,1)实现增长 --oracle 使用序列自动增长: create sequence se_id start with 1 increment by 1 --使用序列实现自动增长:se_id.nextval --6.条件语句if……else……的语法不同 --sql server中: if 条件 begin ………… end else begin ………… end --oracle中: if 条件1 then …………; elsif 条件2 then …………; else …………; end if; --7.case语句的语法不同 --sql server中: --select ....case.....(else)....end....语句 select stuno '学号',case when grade>=90 and grade<=100 then '★★★★' when grade>=80 and grade<90 then '★★★' when grade>=70 and grade<80 then '★★' when grade>=60 and grade<70 then '★' else '差' end as '等级' from score go --oracle中: declare nums number:=&nos;--&nos表示提示传入值 begin case nums when 100 then dbms_output.put_line('满分也,不错'); when 90 then dbms_output.put_line('90分页很不错了'); end case; end; --8.触发器创建语法不同 --sql server中: --首先判断触发器是否已经存在 if exists (select * from sys.sysobjects where name='tr_delete') --如果存在先删除 drop trigger tr_delete go --创建触发器 create trigger tr_delete on bookInfo instead of delete as --定义变量 declare @bookid int select @bookid=Bookid from deleted---deleted执行删除语句( delete from BookInfo where BookId=1),自动生成的deleted表 --删除与该图书的相关记录(先删除从表再删除主表) delete from borrowinfo where bookid=@bookid delete from backinfo where bookid=@bookid delete from BookInfo where BookId=@bookid --判断 if @@error<>0 begin print '删除失败' rollback transaction end else begin print '删除成功' end go delete from BookInfo where BookId=1 --oracle中: --创建触发器 create or replace trigger tri_test before insert or update or delete on table_name [for each row]---如果要使用 :new /:old 就必须使用行触发器 declare nums varchar2(20); begin select 'F'||lpad('aa',5,0) into nums from dual; end; --9.oracle中的存储过程 --sql server中存储过程: --判断存储过程是否已经存在 if exists(select * from sys.sysobjects where name='proc_name') --如果存在先删除 drop proc proc_name go --创建存储过程语句 create proc/procedure proc_name @参数名1 数据类型 [out/output], @参数名2 数据类型 [out/output] as ………… go --调用存储过程 --如果有输出参数,则需定义变量(假设@参数2为输出参数) declare @变量名 数据类型 exec proc_name @参数名1='aaa',@参数名2=@变量名 out ---oracle中带游标及循环的存储过程 create or replace procedure proc_selCurrent ( names varchar2 ) as cursor cursor_sel is select DepositSum,cardType,name,state from CurrentAccount where name like '%'||names||'%'; dd number; cc number; nn varchar2(20); sta number; begin open cursor_sel; loop fetch cursor_sel into dd,cc,nn,sta; dbms_output.put_line('存款金额:'||dd||'姓名:'||nn); exit when cursor_sel%notfound; end loop; close cursor_sel; end; --调用存储过程 begin proc_selCurrent('a'); end; --10.创建用户的方式不同 --sql server中 --1、创建登陆账号:sa-----123456 create Login 登陆名称 with password='登陆密码' --修改登陆账户: alter Login 登陆名称 with name='新登录名称' and password='新登录密码' --禁用/启用登陆账号 alter Login 登录名称 disable(禁用)/enable(启用) --删除登陆账号 drop Login 登录名称 --2、创建用户: create user 用户名 for/from Login 登陆名称 --修改用户名 alter user 用户名 with name='新用户名' --删除用户名 drop user 用户名 ---授权限 grant select/update/delete/insert on 表名 to 用户名 ---oracle中: ---创建用户语法: create user 用户名 identified by 密码 default tablespace users temporary tablespace temp quota 10M on users --修改密码: alter user 用户名 identified by 新密码 --授予权限: grant create session to 用户名 --删除用户 drop user 用户名 cascade;
|