Sql Server和Oracle语法对比
- 格式:xls
- 大小:34.00 KB
- 文档页数:8
oracle和sqlserver查询语句Oracle和SQL Server是两种常见的关系型数据库管理系统(DBMS),它们在查询语句方面有一些不同之处。
在本文中,我们将一步一步回答关于Oracle和SQL Server查询语句的问题,以帮助您更好地理解它们的区别。
首先,让我们从基本的查询语句开始。
无论是Oracle还是SQL Server,都使用SELECT语句来检索数据。
下面是一个简单的示例查询,从一个名为"employees"的表中选择所有员工的姓名:SELECT name FROM employees;在这个查询中,"name"是要检索的列名,而"employees"是表的名称。
这个查询语句将返回一个包含所有员工姓名的结果集。
在Oracle中,还可以使用表别名来简化查询。
表别名是一个用于替代表名称的临时名称。
例如,我们可以使用表别名"e"来编写上面的查询:SELECT FROM employees e;在SQL Server中,也可以使用表别名。
与Oracle类似,我们可以使用“AS”关键字或直接省略关键字来定义表别名。
下面是一个相同的查询示例:SELECT FROM employees AS e;或SELECT FROM employees e;接下来,让我们来看看在Oracle和SQL Server中如何使用WHERE子句来添加条件筛选。
在Oracle中,WHERE子句用于过滤满足指定条件的行。
以下是一个示例查询,从"employees"表中选择所有薪水大于5000的员工的姓名:SELECT name FROM employees WHERE salary > 5000;在这个查询中,"salary > 5000"是条件表达式,用于指定返回薪水大于5000的员工。
Oracle,MSSQL数据库的比较这几天,采用了Oracle数据库和MSSQL Server数据库,虽然各个数据库都采用标准的SQL语句,但是其语法之间还是有一定的差异,现将使用过程用到的各个功能的差异大致罗列一下。
1.关于建表语句的语法1.Oracle中可以使用Varchar2类型,但是MSSQL,Sybase中只能用Varchar类型2.Oracle中可以使用Number(12,2)表示金额,而MSSQL,Sybase中只能用对用的Numeric(12,2)来表示3.Oracle每条建表语句之间用分好;进行分隔,而MSSQL,Sybase中不能出现分好,每个建表语句之间用go进行区分。
分别举例如下:Oracle的建表语句create table t_SYSINFO(F_COMPANYNAME varchar2(60), --银行分行的名称F_Factor Number(12,2), --每年递增的系数值F_ReviseValue Number(12,2) --修正参数);MSSQLServer的建表语句如下:--系统信息表create table t_SYSINFO(F_COMPANYNAME varchar(60), --银行分行的名称F_Factor numeric(12,2), --每年递增的系数值F_ReviseValue numeric(12,2) --修正参数)Go2.关于存储过程的语法1.Oracle的存储过程的的语法和MSSQLServre的语法不一样Oracle的语法如下:Create or Replace Procedure *****( parm1 in varchar,Param2 out varchar)Is--各个变量定义,每个变量之间用逗号分隔Begin--SQL语句End/存储过程的参数之间用逗号隔开,同时用in或out说明参数的输入输出方式,一般用如下格式: param in varchar2——参数输入/输出参数类型.Oracle每个存储过程之间必须用斜杠‘/’进行分隔,以标明每个存储过程的结束(当然当个存储过程的结尾可以没有/,但是多个存储过程一起运行时,必须有/,否则系统会认为只有一个存储过程)Oracle中变量可以直接采用类似Delphi的语法进行赋值,即采用:=的方式Oracle每条语句之间必须用分号;进行分隔Oracle支持异常处理,比如运行某条select语句,其查询结果为空,此时系统会返回异常,存储过程中要捕获异常进行处理Select语句将字段内容赋值采用into的语法格式,例如:select F_Field1,F_Field2 into P_Parm1,P_Parm2 from TableIf语句必须有then,语法if(condition) then begin ****end;elsif begin *** end;else begin *** end;Oracle中日期类型,系统会当成数据类型进行处理,因此,日期可以直接相减,例如:P_date1=to_char(to_date(‘20140404’,’YYYYMMDD’)+10,’YYYYMMDD’);参数的类型转换,一般有to_date,to_char,to_number,函数参数的说明如下:第一个参数为要转换的字符串,第二个参数为转换后的格式,例如:to_char(sysdate,’YYYYMMDD’)转换成年月日的方式的字符串。
SQL 语言支持这一部分概述了 Transact-SQL 和 PL/SQL 语言语法之间的相同点和不同点,并给出转换策略。
要将 Oracle DML 语句和 PL/SQL 程序迁移到 SQL Server 时,请按下列步骤执行:1.验证所有 SELECT、INSERT、UPDATE 和 DELETE 语句的语法是有效的。
进行任何必要的修改。
2.把所有外部联接改为 SQL-92 标准外部联接语法。
3.用相应 SQL Server 函数替代 Oracle 函数。
4.检查所有的比较运算符。
5.用“+”字符串串联运算符代替“||”字符串串联运算符。
6.用 Transact-SQL 程序代替 PL/SQL 程序。
7.把所有 PL/SQL 游标改为非游标 SELECT 语句或 Transact-SQL 游标。
8.用 Transact-SQL 过程代替 PL/SQL 过程、函数和包。
9.把 PL/SQL 触发器转换为 Transact-SQL 触发器。
10.使用 SET SHOWPLAN 语句,优化查询性能。
SELECT 语句Oracle 和 Microsoft SQL Server 使用的 SELECT 语句语法类似。
SQL Server 不支持 Oracle 特定的基于开销的优化程序提示,它必须被删除。
建议使用的技术是,使用 SQL Server 基于开销的优化程序。
有关详细信息,请参见本章后面的“SQL 语句优化”。
SQL Server 不支持 Oracle 的 START WITHUCONNECT BY 子句。
在 SQL Server 中,可以创建完成相同任务的存储过程替代它。
SQL Server 不支持 Oracle 的 INTERSECT 和 MINUS 集合运算符。
可使用 SQL Server EXISTS 和 NOT EXISTS 子句,实现相同的结果。
在下面示例中,使用 INTERSECT 运算符,用于查找学生登记的所有课程的代码和名称。
ORACLE与SQLSERVER语法区别⼀、数据类型ORACLE与SQL SERVER在数据类型的对⽐如下:SQL SERVER ORACLE数字类型DECIMAL[(P[, S])]NUMBER[(P[, S])]NUMERIC[(P[, S])]NUMBER[(P[, S])]FLOAT[(N)]NUMBER[(N)]INT NUMBERSMALLINT NUMBERTINYINT NUMBERMONEY NUMBER[19,4]SMALLMONEY NUMBER[19,4]字符类型CHAR[(N)]CHAR[(N)]VARCHAR[(N)]VARCHAR2[(N)]⽇期时间类型DATETIME DATESMALLDATETIME DATE其它TEXT CLOBIMAGE BLOBBIT NUMBER(1)⼆、表(主键、外键、CHECK、UNIQUE、DEFAULT、INDEX)在创建表及其主键、外键、CHECK、UNIQUE、DEFAULT、INDEX时,SQL SERVER 与ORACLE的语法⼤致相同。
主要区别如下:(1) Oracle定义表字段的default属性紧跟字段类型之后,如下:Create table MZ_Ghxx( ghlxh number primay key ,rq date default sysdate not null,….)⽽不能写成Create table MZ_Ghxx( ghlxh number primay key ,rq date not null default sysdate,….)三、存储过程/函数过程与函数的区别函数可以返回⼀个值给调⽤环境;⽽过程不能,过程只能通过返回参数(带“OUT”或“IN OUT”)传回去数据。
SQLSERVER中存储过程的结构⼤致如下CREATE PROCEDURE procedure_name/*输⼊、输出参数的声明部分*/ASDECLARE/*局部变量的声明部分*/BEGIN/*主体SQL语句部分*//*游标声明、使⽤语句在此部分*/ENDORACLE中存储过程的结构⼤致如下CREATE OR REPLACE PROCEDURE procedure_name( /*输⼊、输出参数的声明部分*/ )AS/*局部变量、游标等的声明部分*/BEGIN/*主体SQL语句部分*//*游标使⽤语句在此部分*/EXCEPTION/*异常处理部分*/END ;ORACLE端FUNCTION语法说明CREATE [OR REPLACE] FUNCTION function_name[(argument [{IN | OUT | IN OUT }] ) type,…[(argument [{IN | OUT | IN OUT }] ) typeRETURN return_type {IS | AS}BEGIN…END;四、变量赋值在SQL SERVER语句中⽤如下语句对局部变量赋值(初始值或数据库表的字段值或表达式):“SELECT 局部变量名 = 所赋值(初始值或数据库表的字段值或表达式)”;⽽在ORACLE中,将初始值赋给局部变量时,⽤如下语句:“局部变量名 : = 所赋值(初始值或表达式);” ,将检索出的字段值赋给局部变量时,⽤如下语句:“SELECT 数据库表的字段值 INTO 局部变量名 …” 。
Oracle与SQL Server的SQL使用区别整理人:阮淑芳日期:2005-12-15一、数据类型二、自动增长字段以做主键识别2、创建SEQUENCE,将此SEQUENCE与需类ID化的列对应;3、在INSERT语句中对相应列引用其SEQUENCE值:SEQUENCENAME.NEXTVAL三、常用函数3.5其他函数AVGCOUNTMAXMINSUMSTDEVVARISNULL(check_exp,replace_value)CASE AVGCOUNTMAXMINSUMSTDDEVVARIANCENVL(check_exp,replace_value)DECODE1)ISNULL与NVL在MSSQL中ISNULL;在ORACLE中,同样的功能用NVL实现。
2)CASE与DECCODE对某个值进行多个判断分支进行处理.四、常用SQL语法[ELSE{statement|statement_block}] 4>循环语句:WHILEWHILE boolean_condition [{statement|statement_block} ][BREAK][condition]5>RETURN语句用于无条件退出一个批处理、存储过程或触发器;用于存储过程中返回状态值。
LOOP{statement|statement_block};[EXIT[WHEN condition];] END LOOP;B、WHILE循环语句WHILE condition LOOP {statement|statement_block};END LOOP;C、数字式FOR循环语句FOR loop_counter IN[REVERSE]l ow_bound..high_bound LOOP {statement|statement_block};END LOOP;4.3T-SQL中的游标提取循环语句:1)FETCH[NEXT FROM]cursor_na me INTO@variable_1,...@varia ble_n2) WHILE@@FETCH_STATUS=0 BEGINOther_statements FETCH[NEXT FROM]cursor_na me INTO@variable_1,...@varia ble_nEND3)CLOSE cursor_name4.4事务处理语句:1>开始一个事务:BEGIN TRAN[SACTION[transaction_name]]2>提交一个事务:COMMIT TRAN[SACTION[transaction_name]]3>回滚一个事务:ROLLBACK TRAN[SACTION[transaction_name]]4>使用事务保存点:BEGIN TRAN[SACTION[transaction_name]]SAVE TRAN[SACTION]savepoint_nameROLLBACK TRAN[SACTION]savepoint_name在PL/SQL中,事务的开始位置是从前一个事务结束以后执行的第一条SQL语句,或者在连接到该数据库以后所执行的第一条SQL语句。
疯狂SQL之魔兽争霸本人平时比较沉默,但朋友们都说我很疯狂—疯狂地学习、疯狂地工作。
很久就有写点东西的打算啦,一直懒于打字,近来稍有空闲,决定杜撰此文,献给现些喜欢或不喜欢沉默的朋友。
----自序网上已经有很多SQL与ORACLE的对比,但本人要讲的即不是单纯的SQL,也不是单纯的ORACLE,更不是评价谁好谁坏(意思不大),而是两种数据库之相同和异同,本人曾讲授过SQL与ORACLE的课程,讲SQL时说SQL好,讲ORACLE时又说ORACLE棒,现在终于可以平心而评啦。
估计有人现在会嘿嘿冷笑(又一个误人子弟的骗子),老实说,当初每次讲完课,就有这种感觉—教的人不得其法,学的人不得其道。
说点严肃的事吧,据说比尔与艾里森在洗手间相遇,两个又是拥抱,又是KISS,不多久就吵了起来,比尔对查询分析器(SQL QUERY ANALYZE)赞不经绝口,艾里森嘿嘿冷笑,只说了一句话—SQL PLUS内秀。
言归正传,且听我一一道来1.SQL与ORACLE的内存分配ORACLE的内存分配大部分是由INIT.ORA来决定的,一个数据库实例可以有N种分配方案,不同的应用(OLTP、OLAP)它的配置是有侧重的。
SQL概括起来说,只有两种内存分配方式:动态内存分配与静态内存分配,动态内存分配充许SQL自己调整需要的内存,静态内存分配限制了SQL对内存的使用。
1.002、SQL与ORACLE的物理结构总得讲,它们的物理结构很相似,SQL的数据库相当于ORACLE的模式(方案),SQL的文件组相当于ORACLE的表空间,作用都是均衡DISK I/O,SQL创建表时,可以指定表在不同的文件组,ORACLE则可以指定不同的表空间。
CREATE TABLE A001(ID DECIMAL(8,0)) ON [文件组]--------------------------------------------------------------------------------------------CREATE TABLE A001(ID NUMBER(8,0)) TABLESPACE 表空间注:以后所有示例,先SQL,后ORACLE2.003、SQL与ORACLE的日志模式SQL对日志的控制有三种恢复模型:SIMPLE、FULL、BULK-LOGGED;ORACLE对日志的控制有二种模式:NOARCHIVELOG、ARCHIVELOG。
SQLServer与OracleSQL语法差异以下差异将以SQL Server视⾓阐述1. 在创建函数或存储过程时,定义参数名前需要使⽤@符号1. 可以⽤ALTER PROCEDURE/FUNCTION来对已经存在的存储过程和函数的内容进⾏修改,Oracle的ALTER只可以⽤于重编译或debug。
2. 要进⾏Top-N查询时,应该使⽤SELECT TOP N [column_name]3. 进⾏Top-N查询时,以Top 10为例,如果第11、12条数据与第10条相同,也想将其进⾏输出时,应使⽤SELECT TOP N WITH TIES语句4. 如果要查询前10%的数据,可以使⽤SELECT TOP N PERCENT5. ⽤户变量名使⽤@前缀进⾏定义,⽽Oracle中是使⽤:来作为前缀1. SQL Server中没有dual虚表的概念,如果需要进⾏某函数结果的测试,直接SELECT即可。
2. Oracle捕获异常通常分为预定义和⾃定义异常,使⽤exception和when-then来进⾏捕获和异常信息抛出,⽽SQL Server中使⽤try-catch。
1. 两个数据库函数⼤部分相同,⼩部分不同的按照具体情况百度2. SQL Server中的数据库类似于schema,要使⽤哪个数据库,就使⽤use xx语句,如果要显⽰多个查询结果,则每个语句后跟go3. 做聚合分析时,SQL Server中的是grouping,Oracle中是grouping set4. 如果需要同时显⽰查询结果和⼩计,但是由于字段数量不同,⽆法⽤union显⽰,此时可以使⽤compute(Oracle中没有)1. Oracle中的with xx as后跟查询语句,⽽SQL Server中的CTE应该写成with xx (输出字段) as后跟查询语句2. SQL Server中使⽤游标遍历获取数据时,应使⽤fetch next,⽽Oracle中的是fetch,⽽且SQL Server的游标可以前后滚动;关闭游标时Oracle只需要写Close cursor就会关闭并释放资源,⽽SQL Server还需要DEALLOCATE CURSOR来释放资源。
目录1.还原 (4)1.1ORACLE还原 (4)1.1.1创建表空间及用户 (4)1.2SQL SERVER还原 (5)2.函数 (5)2.1 数字函数 (5)2.1.1绝对值 (5)2.1.2取整数(向上舍入) (5)2.1.3取整数(向下舍入) (6)2.1.4取整数(截取) (6)2.1.5四舍五入 (6)2.1.6 e为底的幂(返回指数值) (6)2.1.7 e为底的对数(返回对数值) (6)2.1.8取平方数 (6)2.1.9取平方根 (7)2.2 数值比较 (7)2.2.1取集合最大值 (7)2.2.2取集合最小值 (7)2.2.3处理NULL值 (7)2.3 字符串函数 (8)2.3.1字符串连接 (8)2.3.2返回子字符串位置 (8)2.3.3返回模糊字串的位置 (8)2.3.4截取字符串 (8)2.3.5字符串替换 (8)2.3.6左边加空格 (9)2.3.7右边加空格 (9)2.4 日期函数 (9)2.4.1取当前日期 (9)2.4.2日期转换 (9)2.4.3取当前时间 (9)2.4.4取当月最后一天 (9)2.4.5获取本周的某一天的日期 (10)2.4.6字符串转换为日期 (11)2.4.7常用日期转换语句 (11)2.5 常用ORACLE与SQL SERVER等价函数 (13)3.语法 (13)3.1 取前多少行数据 (13)3.2 做列增长率 (14)3.2.1 ORACLE脚本 (14)3.2.2 SQL SERVER脚本 (14)3.3 条件 (15)4.ORACLE常用函数大全 (15)4.1.1 CONCAT连接字符串 (15)4.1.2 INSTR(C1,C2,start,appearPosition)返回字符串位置 (15)4.1.3 LENGTH返回字符串长度 (16)4.1.4 LOWER小写转化 (16)4.1.5 UPPER大写转化 (16)4.1.6 RPAD(string,padded_length,[pad_string])在字符串右边粘贴字符 (16)4.1.7 LPAD(string,padded_length,[pad_string])在字符串右边粘贴字符 (16)4.1.8 RTRIM(string1,string2)去除右边字符串 (17)4.1.9 LTRIM(string1,string2)去除右边字符串 (17)4.1.10 TRIM(leading|trailing|both string1 FROM string2)去除指定字符串 (17)4.1.11 SUBSTR(sting,start,length)截取字符串 (17)4.1.12 REPLACE(string1,string2,string3)替换字符串 (17)4.1.13 CEIL取整数(向上舍入) (18)4.1.14 FLOOR取整数(向下舍入) (18)4.1.15 MOD(n1,n2)返回余数 (18)4.1.16 POWER(n1,n2)返回n次方根 (18)4.1.17 ROUND(X,Y)四舍五入 (18)4.1.18 TRUNC(X,Y)返回X按精度Y截取后的值 (19)4.1.19 SIGN(n)返回n的符号 (19)4.1.20 SQRT(n)返回n的根 (20)4.1.21 TO_CHAR格式化函数 (20)4.1.22 SYSDATE取当前日期 (22)4.1.23 ADD_MONTHS增加删除月份 (22)4.1.24 LAST_DAY返回当前日期的最后一天 (23)4.1.25 MONTHS_BETWEEN(date2,date1)返回日期差 (23)4.1.26 NEXT_DAY(date,day)获取日期 (23)4.1.27 GREATEST返回集合最大值 (23)4.1.28 LEAST返回集合最小值 (24)4.1.29 USER返回当前用户名称 (24)4.1.30 UID返回当前用户标识的唯一整数 (24)4.1.31 AVG(DISTINCT|ALL)对所有数求平均数 (24)4.1.32 MAX(DISTINCT|ALL)获取最大值 (25)4.1.33 MIN(DISTINCT|ALL)获取最小值 (25)4.1.34 GROUP BY分组统计 (26)4.1.35 HAVING对分组统计再加限制条件 (26)4.1.36 ORDER BY对查询结果进行排序 (27)4.1.37 COUNT统计累计行数 (27)4.1.38 DENSE_RANK (27)4.1.39 FRIST和LAST (28)4.1.40 FIRST_VALUE (29)4.1.41 LAST_VALUE (30)4.1.42 LAG获取增长率 (31)4.1.43 LEAD与LAG相反 (32)4.1.44 NTILE (33)4.1.45 PERCENT_RANK() (34)4.1.46 RATIO_TO_REPORT (35)4.1.47 ROW_NUMBER (36)4.1.48 SUM返回累计和 (37)4.1.49 TRANSLATE (string,from_str,to_str) (38)4.1.50 DECODE[实现if...then逻辑] . (38)4.1.51 CASE[实现SWITH...THEN逻辑] (39)4.1.52 NVL空值处理函数 (39)4.1.53 ABS返回绝对值 (39)5.查询优化 (39)5.1.1数据库方面 (39)5.1.2 SQL语句方面 (40)6.索引 (42)6.1.1 ORACLE (42)6.1.2 SQL SERVER (45)7.分区 (47)7.1.1 ORACLE (47)7.1.2 SQL SERVER (52)1.还原1.1ORACLE还原1.1.1创建表空间及用户1创建表空间语法CREATE bigfile TABLESPACE LTLOBDATA01 DATAFILE 'D:\DATABASE\LTLOBDATA01.dbf' SIZE 1000M autoextend on next 500M MAXSIZE UNLIMITED;2创建用户语法:create user EFMCS_JLP_2014 (用户名‘EFMCS_JLP_2014’)identified by 123 (密码:123)default tablespace EFMCS (默认表空间)temporary tablespace TEMP;3 给用户授权grant connect to EFMCS_JLP_2014;grant dba to EFMCS_JLP_2014;grant resource to EFMCS_JLP_2014;grant create materialized view to EFMCS_JLP_2014;grant create session to EFMCS_JLP_2014;grant create table to EFMCS_JLP_2014;grant global query rewrite to EFMCS_JLP_2014;grant query rewrite to EFMCS_JLP_2014;grant select any table to EFMCS_JLP_2014;grant unlimited tablespace to EFMCS_JLP_2014;4两种还原方式imp标准还原,命令:imp JB_FASP/admin@orcl full=y log=d:\JB_FASP_2015.log;命令:imp cqsky2019/123123@localhost/orcl file=D:\111\marry.dmp full=y其中FROMUSER代表来源用户,TOUSER代表被还原用户,FILE代表需要还原的数据备份名称,LOG代表还原日志。
Oracle和SQL Server的一些区别(函数和存储过程)函数SQLServer和Oracle的常用函数对比1.绝对值S:select abs(-1) valueO:select abs(-1) value from dual2.取整(大)S:select ceiling(-1.001) valueO:select ceil(-1.001) value from dual3.取整(小)S:select floor(-1.001) valueO:select floor(-1.001) value from dual4.取整(截取)S:select cast(-1.002 as int) valueO:select trunc(-1.002) value from dual5.四舍五入S:select round(1.23456,4) value 1.23460O:select round(1.23456,4) value from dual 1.23466.e为底的幂S:select Exp(1) value 2.7182818284590451O:select Exp(1) value from dual 2.718281827.取e为底的对数S:select log(2.7182818284590451) value 1O:select ln(2.7182818284590451) value from dual; 18.取10为底对数S:select log10(10) value 1O:select log(10,10) value from dual; 19.取平方S:select SQUARE(4) value 16O:select power(4,2) value from dual 1610.取平方根S:select SQRT(4) value 2O:select SQRT(4) value from dual 211.求任意数为底的幂S:select power(3,4) value 81O:select power(3,4) value from dual 8112.取随机数S:select rand() valueO:select sys.dbms_random.value(0,1) value from dual;13.取符号S:select sign(-8) value -1O:select sign(-8) value from dual -1----------数学函数14.圆周率S:SELECT PI() value 3.1415926535897931O:不知道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 valueunionselect -2 valueunionselect 4 valueunionselect 3 value)aO:select greatest(1,-2,4,3) value from dual19. 求集合最小值S:select min(value) value from(select 1 valueunionselect -2 valueunionselect 4 valueunionselect 3 value)aO:select least(1,-2,4,3) value from dual20.如何处理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') valueO:select ascii('a') value from dual22.从序号求字符S:select char(97) valueO:select chr(97) value from dual23.连接S:select '11'+'22'+'33' valueO:select CONCAT('11','22') ¦ ¦33 value from dual23.子串位置 --返回3S:select CHARINDEX('s','sdsq',2) valueO:select INSTR('sdsq','s',2) value from dual23.模糊子串的位置 --返回2,参数去掉中间%则返回7S:select patindex('%d%q%','sdsfasdqe') valueO:oracle没发现,但是instr可以通过第四霾问 刂瞥鱿执问?BR> select INSTR('sdsfasdqe','sd',1,2) value from dual 返回624.求子串S:select substring('abcd',2,2) valueO:select substr('abcd',2,2) value from dual25.子串代替返回aijklmnefS:SELECT STUFF('abcdef', 2, 3, 'ijklmn') valueO:SELECT Replace('abcdef', 'bcd', 'ijklmn') value from dual26.子串全部替换S:没发现O:select Translate('fasdbfasegas','fa','我' ) value from dual27.长度S:len,datalengthO:length28.大小写转换 lower,upper29.单词首字母大写S:没发现O:select INITCAP('abcd dsaf df') value from dual30.左补空格(LPAD的第一个参数为空格则同space函数)S:select space(10)+'abcd' valueO:select LPAD('abcd',14) value from dual31.右补空格(RPAD的第一个参数为空格则同space函数)S:select 'abcd'+space(10) valueO:select RPAD('abcd',14) value from dual32.删除空格S:ltrim,rtrimO:ltrim,rtrim,trim33. 重复字符串S:select REPLICATE('abcd',2) valueO:没发现34.发音相似性比较(这两个单词返回值一样,发音相同)S:SELECT SOUNDEX ('Smith'), SOUNDEX ('Smythe')O:SELECT SOUNDEX ('Smith'), SOUNDEX ('Smythe') from dualSQLServer中用SELECT DIFFERENCE('Smithers', 'Smythers') 比较soundex的差返回0-4,4为同音,1最高--------------日期函数35.系统时间S:select getdate() valueO:select sysdate value from dual36.前后几日直接与整数相加减37.求日期S:select convert(char(10),getdate(),20) valueO:select trunc(sysdate) value from dualselect to_char(sysdate,'yyyy-mm-dd') value from dual38.求时间S:select convert(char(8),getdate(),108) valueO:select to_char(sysdate,'hh24:mm:ss') value from dual39.取日期时间的其他部分S:DATEPART 和 DATENAME 函数(第一个参数决定)O:to_char函数第二个参数决定参数---------------------------------下表需要补充year yy, yyyyquarter 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 dual41.本星期的某一天(比如星期日)S:不知道O:SELECT Next_day(sysdate,7) vaule FROM DUAL;42.字符串转时间S:可以直接转或者select cast('2004-09-08'as datetime) valueO: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) valueO:直接用两个日期相减(比如d1-d2=12.3)SELECT (d1-d2)*24*60*60 vaule FROM DUAL;44.根据差值求新的日期(比如分钟)S:select dateadd(mi,8,getdate()) valueO: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 CONVERT16进制转换为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 AVGCount COUNT COUNTMaximum MAX MAXMinimum MIN MINStandard deviation STDDEV STDEV or STDEVP Summation SUM SUMVariance VARIANCE VAR or VARPOracle还有一个有用的函数EXTRACT,提取并且返回日期时间或时间间隔表达式中特定的时间域:EXTRACT(YEAR FROM 日期)存储过程一.多表连接查询,更新存储过程Sql存储过程ALTER PROCEDURE [dbo].[ GetEvent]@SCSWId nvarchar(20)= null ,@ToDate DATETIME,@FromDate DATETIMEASSELECT NOTES.NOTE_ID,NOTES.NOTE,SCSW_CALENDAR.DATE_TIMEFROM SCSW_CALENDARLEFT OUTER JOIN NOTES ON SCSW_CALENDAR.NOTE_ID=notes.note_idWHERE SCSW_CALENDAR.SCSW_ID = SCSWIdORDER BY Patient.PatientIdOracel存储过程1.查询数据的存储过程PROCEDURE GetEvent(SCSWId IN VARCHAR2, FromDate IN DATE, ToDate IN DATE, refOut OUT refcursor)ISBEGINOPEN refOut FORselect NOTES.NOTE_ID,NOTES.NOTE,SCSW_CALENDAR.DATE_TIMEfrom SCSW_CALENDARleft join NOTES on SCSW_CALENDAR.NOTE_ID=notes.note_idwhere SCSW_CALENDAR.SCSW_ID = SCSWIdAND SCSW_CALENDAR.DATE_TIME >= FromDateAND SCSW_CALENDAR.DATE_TIME < ToDateorder by SCSW_CALENDAR.DATE_TIME;END GetEvent;2.更新数据的存储过程:procedure UpdateArticlesubmodel(ArticleSubID number,ArticleTitle nvarchar2,ArticleKeyWord nvarchar2, ArticleContent CLOB,CreatePerson nvarchar2,ChangeDate date,SetTop number,ArticleSubStyleID number,Checked number)asbeginupdate "ArticleSubModel"set "ArticleTitle"=ArticleTitle, "ArticleKeyWord"=ArticleKeyWord, "ArticleContent"=ArticleContent, "CreatePerson"=CreatePerson, "CreateDate"=ChangeDate,"SetTop"=SetTop, "ArticleSubStyleID"=ArticleSubStyleID, "Checked"=Checkedwhere "ArticleSubID"=ArticleSubID; commit;Exception when others thenrollback;end UpdateArticlesubmodel;3.删除数据的存储过程procedure DeleteArticlesubmodel(ArticleSubID number)asbegindelete from "ArticleSubAccessories"where "ArticleSubID"=ArticleSubID;delete from "ArticleSubModel"where "ArticleSubID"=ArticleSubID;commit;Exception when others thenrollback;end DeleteArticlesubmodel;编后:如果您认为有侵权的地方,请来信说明,本人将立即删去。
深度对比Oracle与SQL Server1.概述1.1.产品特点对比开放性SQL Server 只能在Windows 上运行,没有丝毫的开放性,操作系统的稳定对数据库是十分重要的。
Windows9X系列偏重于桌面应用,NT server只适合中小型企业。
而且Windows平台的可靠性,安全性和伸缩性是非常有限的。
它不象UNIX那样久经考验,尤其是在处理大数据量的关键业务时。
Oracle 能在所有主流平台上运行(包括 Windows)。
完全支持所有的工业标准。
采用完全开放策略。
可以使客户选择最适合的解决方案。
对开发商全力支持。
DB2 能在所有主流平台上运行(包括Windows)。
最适于海量数据。
DB2在企业级的应用最为广泛,在全球的500家最大的企业中,几乎85%以上用DB2数据库服务器,而国内到97年约占5%.可伸缩性、并行性SQL server并行实施和共存模型并不成熟,很难处理日益增多的用户数和数据卷,伸缩性有限。
Oracle 平行服务器通过使一组结点共享同一簇中的工作来扩展WindowsNT的能力,提供高可用性和高伸缩性的簇的解决方案。
如果WindowsNT不能满足需要, 用户可以把数据库移到UNIX中。
DB2具有很好的并行性。
DB2把数据库管理扩充到了并行的、多节点的环境。
数据库分区是数据库的一部分,包含自己的数据、索引、配置文件、和事务日志。
数据库分区有时被称为节点或数据库节点。
安全性SQL server 没有获得任何安全证书。
Oracle Server 获得最高认证级别的ISO标准认证。
DB2 获得最高认证级别的ISO标准认证。
性能SQL Server 多用户时性能不佳Oracle 性能最高,保持WindowsNT下的TPC-D和TPC-C的世界记录。
DB2 适用于数据仓库和在线事物处理,性能较高。
客户端支持及应用模式SQL Server C/S结构,只支持Windows客户,可以用ADO,DAO,OLEDB ,ODBC连接.Oracle 多层次网络计算,支持多种工业标准,可以用ODBC, JDBC,OCI等网络客户连接DB2 跨平台,多层结构,支持ODBC,JDBC等客户操作简便SQL Server 操作简单,但只有图形界面Oracle 较复杂,同时提供GUI和命令行,在WindowsNT和UNIX下操作相同DB2 操作简单,同时提供GUI和命令行,在WindowsNT和UNIX下操作相同使用风险SQL server 完全重写的代码,经历了长期的测试,不断延迟,许多功能需要时间来证明。
1create table SYS.CMS_CASE_FEE(CASE_ID NUMBER(15,0) NOT NULL,SOURCE_KIND nvarchar2(1) NOT NULL,SEQ_NO NUMBER(15,0) NOT NULL ,FEE_KIND1 nvarchar2(5) NULL,FEE_AMT1 NUMBER(15,1) NULL,FEE_KIND2 nvarchar2(5) NULL,FEE_AMT2 NUMBER(15,1) NULL,FEE_KIND3 nvarchar2(5) NULL,FEE_AMT3 NUMBER(15,1) NULL,PRIMARY KEY(CASE_ID,SEQ_NO,SOURCE_KIND) )2栏位自增:1 创建表(create table)create table test(autoid number(10,0)......CONSTRAINT test PRIMARY KEY(autoid))2 建立序列(create sequence)create sequence seq_test_autoid increment by 1 start with 1 3 插入数据(insert data)insert into test values(seq_test_autoid.nextval,......)3Oracle 中的表名和列名可以包括字母,数字和下划线,名字长度为1-30个字符.4Oracle 中定义变量及变量使用:declarevar1 number;var2 nvarchar2(10):='test';--初始化var3 nvarchar2(10);begin--处理语句select 'hello' into var3 from dual;var3:='test';insert into tablename(......) values(var1,var2,var3); end;中传多个SQL语句到Oracle中执行:begin--执行语句insert into tablename(......) values(var1,var2,var3); insert into tablename(......) values(var1,var2,var3); end;6在执行insert语句时,如果db中的栏位类型为data类型,不能像sql server中那样insert字符类型的数据,要将此转化为date类型,才可进行新增操作如:sql server:insert into table1(clomn1,clomn2)values(12,'2006/01/02')orcal:insert intotable1(clomn1,clomn2)values(12,to_date('2006/01/02','yyyy/mm/dd'))0.07Oracle 中文占3个字节问题:1 存在表中的欄位類型為Nvarchar2的中文还是占2个字节.select lengthb(strword) from word_test --结果:8( 表word_test存有一条记录,strword2栏位值位:"汉汉汉汉",lengthb()为取字节长度函数).2 存在表中的欄位類型為varchar2(varchar)的中文还是占3个字节.select lengthb(strword) from word_test --结果:12( 表word_test存有一条记录,strword2栏位值位:"汉汉汉汉",lengthb()为取字节长度函数).3 字符串中中文占3个字节.select lengthb('汉汉汉汉') from word_test --结果:124 按字符长度处理栏位(如:SUBSTR()等函数)处理栏位和中文字串时处理方式一样.select SUBSTR('汉汉汉汉',1,3) from dual --结果:汉汉汉select SUBSTR(strword,1,3) from word_test --结果:汉汉汉5 按字节长度处理栏位(如:SUBSTRB()按字节截取)处理栏位和中文字串时方式有差异:select SUBSTRB('汉汉汉汉',1,4) from dual --结果:汉select SUBSTRB(strword,1,4) from word_test --结果:汉汉(strword欄位類型位Nvarchar2)select SUBSTRB(strword,1,4) from word_test --结果:汉汉(strword 欄位類型位varchar2(varchar))8grant create any table to cms --解決建立臨時表的權限問題create or replace procedure cms.lucytest4 isbeginexecute immediate 'CREATE GLOBAL TEMPORARY TABLE lucyT4 ( pid nvarchar2(3),pname nvarchar2(10) ) ON COMMIT delete ROWS';execute immediate 'insert into lucyT4 values(''001'',''A1'')'; execute immediate 'SELECT * FROM lucyT4';--execute immediate 'DELETE * FROM lucyT4';execute immediate 'DROP TABLE lucyT4';end;gobegincms.lucytest4();end;9查询表中TREE_ID栏位最大的值,然后加1,产生最大的ID:select right('00000' + cast((select isnull(max(TREE_ID),0) + 1 from CMS_Problem_Data) as varchar),5) AS TREE_ID转换方式:SELECTSUBSTR('00000' || TO_CHAR(NVL(MAX(TREE_ID),0) + 1),LENGTH('00000' || TO_CHAR(NVL(MAX(TREE_ID),0) + 1))-4,LENGTH('00000' || TO_CHAR(NVL(MAX(TREE_ID),0) + 1))) AS TREE_IDFROMCMS_PROBLEM_DATA10栏位排序:SQL Server 以某栏位升序排序,则会将栏位值为"Null"的数据排在最前面. 而 Oracle 以某栏位升序排序,则会将栏位值为"Null"的数据排在最后面.SQL Server中的查询条件不区分全角,半角;Oracle中的查询条件区分全角,半角.如条件:WHERE USER_ID = '730097'或WHERE USER_ID = '730097'13Oracle中的保留字不可以用作 表名或表的栏位名称.(比如保留字:LEVEL)可以通过加双引号解决该问题("保留字"),但是加上 "" 后表名或表的栏位名称就会区分大小写.而且以后使用该表或表的栏位必须加上"",会给程式撰写带来麻烦.14左连接:select count(*) from CMS_COLLATERAL left join CMS_COLLATERAL_STATUS on CMS_COLLATERAL.COLL_ID = CMS_COLLATERAL_STATUS.COLL_ID或select count(*) from CMS_COLLATERAL ,CMS_COLLATERAL_STATUSwhere CMS_COLLATERAL.COLL_ID = CMS_COLLATERAL_STATUS.COLL_ID(+)位名 称用“[]”括起来2 SYS :为表所在的tablespace(可以不写)3 有默认值的栏位定义方式为: 栏位名称 栏位类型 DEFAULT (value)null/not null.Colton2007/2/7 Oracle 中可通过为建立表的序列实现栏位自增.Colton2007/2/8Colton2007/2/8注意:1 每个语句后面都有";".2 end 后面加 ";",declare/begin 不加Colton2007/2/15注意:1 目前,测出执行多个select语句不可以.2注意 ";" 使用.Colton2007/2/15Colton2007/2/15 Colton在儲存過程中建立臨時表的撰Lucy2007/3/5Gary2007/2/12Gary2007/2/14Gary2007/2/26ColtonColton Colton。