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。
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。