ORACLE和SQL语法区别归纳(
- 格式:doc
- 大小:78.50 KB
- 文档页数:16
Oracle与sql区别一,字串连接Oracle使用两个竖线符号(||)来作为字串连接操作符,而SQL Server则使用加号(+)。
二,模式匹配SQL Server的LIKE关键字提供了有用的通配符搜索功能,这个功能在Oracle中不支持除了所有的RDBMS都支持的(%)和(_)通配符以外,SQL Server还支持([])和([^])通配符。
([])字符用来查询在一个范围内的所有单个字符。
例如,如果你需要查询包含一个从a到f的字符的数据,三,性能SQL多用户时性能不佳,Oracle在所有的数据库中性能最高,在多用户性能也很强大,执行查询速度也非常快,四,游标的区别Oracle在使用SELECT语句时总是需要游标,不管从数据库中请求多少行。
在Microsoft SQL Server,SELECT语句并不把在返回客户的行上附加游标作为缺省的结果集合。
这是一种返回数据给客户应用程序的有效的方法。
SQL Server为游标函数提供了两种接口。
当在Transact-SQL批处理或者存储过程中使用游标的时候,SQL语句可用来声明、打开、和从游标中抽取,就像定位更新和删除一样。
当使用来自DB-Library、ODBC、或者OLEDB程序的游标时,SQL Server,显式的调用内建的服务器函数来更有效的处理游标。
当从Oracle输入一个PL/SQL过程时,首先判断是否需要在Transact-SQL中采用游标来实现同样的功能。
如果游标仅仅返回,组行给客户程序,就使用非游标的SELECT语句来返回缺省的结果集合。
如果游标用来从行中一次取得一个数据给本地过程变量,你就必须在Transact-SQL中使用游标。
五,语句块Oracle PL/SQL和Microsoft SQL Server Transact-SQL都支持用BEGIN…END术语来标记语句块。
Transact-SQL不需要在DECLARE语句后使用一个语句块。
基本定义1、如果列别名有大小写之分,并包含特殊字符或空格,那么这样的别名必须用双引号引住;2、日期数据的默认显示格式为“DD-MON-YY”,如果希望使用其他格式显示,那么必须调用TO_CHAR函数进行转换。
例:select ename,TO_CHAR(hiredate,’yyyy-mm--dd’) from emp3、使用算术表达式当执行查询操作时,可以在数字列上使用算术表达式,其中乘、除的优先级要高于加减。
如要改变优先级,可以使用括号;4、NVL函数用于将NULL转变为实际值,语法为NVL(表达式1,表达式2),如果表达式1为NULL,则返回表达式2,;如果表达式1不是NULL,则返回表达式1.参数表达式1,表达式2可以是任意数据类型,但二者的数据类型必须要匹配。
例:select ename,sal,comm,sal+nvl(comm,0) from emp;5、在where条件中使用数字值当在where条件中使用数字值时,既可以使用单引号引住数字值,也可以直接引用数字值。
6、在where条件中使用日期值必须要用单引号引住,并且日期值必须要符合日期显示格式。
如果日期值不符合默认日期格式,那么必须使用TO_DATE函数进行转换;7、在where条件中使用between…..and操作符用于指定特定范围条件,在between操作符后指定较小的一个值,在and操作符后指定较大的一个值;例:select * from emp where sal between 100 and 1000;8、在where条件中使用in操作符用于执行列表匹配操作。
当列或表达式结果匹配于列表中的任一个值时,条件字句返回true。
例:select * from emp where sal in(100,200);9、使用order by字句在执行查询操作时,默认情况下会按照数据插入的先后顺序来显示数据。
但在实际应用中经常需要对数据进行排序,以显示更直观的数据。
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和SQL语法区别归纳数据类型比较类型名称OracleSQLServer比较字符数据类型 CHAR CHAR 都是固定长度字符资料但oracle里面最大度为2kb,SQLServer里面最大长度为8kb变长字符数据类型 VARCHAR2 VARCHAR Oracle里面最大长度为4kb,SQLServer里面最大长度为8kb根据字符集而定的固定长度字符串 NCHAR NCHAR 前者最大长度2kb后者最大长度4kb根据字符集而定的可变长度字符串 NVARCHAR2 NVARCHAR 二者最大长度都为4kb日期和时间数据类型 DATE 有Datetime和Smalldatetime两种在oracle里面格式为DMY在SQLSerser里面可以调节,默认的为MDY数字类型 NUMBER(P,S) NUMERIC[P(,S)] Oracle里面p代表小数点左面的位数,s代表小数点右面的位数。
而SQLServer里面p代表小数点左右两面的位数之和,s代表小数点右面的位数。
数字类型 DECIMAL(P,S) DECIMAL[P(,S)] Oracle里面p代表小数点左面的位数,s代表小数点右面的位数。
而SQLServer里面p代表小数点左右两面的位数之和,s代表小数点右面的位数。
整数类型 INTEGER INT 同为整数类型,存储大小都为4个字节浮点数类型 FLOAT FLOAT实数类型 REAL REALORACLE内部函数大全以及与SQLSERVER的区别:下面是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等价函数。
Oracle和SQLServer的语法区别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 子句,实现相同的结果。
Oracle与SQL的区别着信息技术的飞速发展,数据处理不仅在数量上要求越来越大,而且在质量上也要求越来越高。
Oracle数据库在大多数企业中受到广泛使用,而SQL Server数据库也因为和Windows的联系,在企业中的使用也是非常广泛。
操作系统的稳定对数据库来说是十分紧要的,在数据库可操作平台上,Oracle可在所有主流平台上运行,Oracle数据库采用开放的策略目标,它使得客户可以选择一种最适合他们特定需要的解决方案。
客户可以利用很多种第三方应用程序、工具。
对开发商来说是很大的支持。
而SQL Server却只能在Windows上运行了,这个就显得比较单调了,但SQL Sever在Window平台上的表现,和Wind ows操作系统的整体结合程度,使用方便性,和Microsoft开发平台的整合性都比Oracle强的很多。
但Windows操作系统的稳定性及可靠性大家是有目共睹的,再说Microsoft公司的策略目标是将客户都锁定到Windows平台的环境当中,只有随着Windows性能的改善,S QL Server才能进一步提高。
从操作平台这点上Oracle是完全优胜于SQL Server的了。
从资料上可以看到,Oracle的安全认证获得最高认证级别的ISO标准认证,而SQL Server并没有获得什么安全认证。
这方面证明了Oracle的安全性是高于SQL Server的。
购买一个产品,首先考虑的当然是产品的性能了,当考虑性能的同时当然少不了究竟要花多少钱在这产品也是个很关键的问题。
要建立并运行一个数据库系统。
不仅仅包含最初购置软件、硬件的费用,还包含了培训及以后维护的费用。
Orcale数据库的价格是远比SQL Server数据库要高,为什么Oracle数据库比SQL Serve r数据库价格上要高出那么多,一方面Oracle的初始花费相对较高,特别是在考虑工具软件的时候,Oracle很多工具软件需要另外购买,与Microsoft提供免费的SQL Server工具软件相比,Oracle更显价格的不菲。
1.基础语法1.1.时间函数●获取当前日期Oracle:sysdate;SQLSserver:getdate();●转换成字符串Oracle:to_char(sysdate,'yyyy-MM-dd HH24:mi:ss ')SQLSserver:Convert(varchar(19),getdate(),120)●相加/相减Oracle:add_months(sysdate,1)--当前日期加一月sysdate+21---当前日期加21天add_months(sysdate,12);sysdate+interval '1' year---加一年(year)interval 也可以加月(month)/日(day)extract(year from 时间) 或者to_char(时间,'yyyy')--取回日期的指定部分,extract只限年月日SQLSserver:1.2.Oracle中insert into select和select into的用法(异常0RA-00905:missing keyword的解决)两张表进行数据的拷贝,最常用的拷贝语句是:insert into select 和 select into from但是请绝对的注意:在Oracle中select into from不可以使用-----原因很简单:select into 是PL/SQL language 的赋值语句!如果使用则Oracle会抛出0RA-00905:missing keyword的异常!但是可以用create table select代替该功能!!!具体参考下面测试代码!但是在Sql Server中可以正常使用。
先做个小测试:-- 建表create table test1(id number primary key,testname varchar2(20),createtime date,falg varchar2(10));create table test2(id number primary key,testname varchar2(20),createtime date,falg varchar2(10));-- 插入测试数据insert into test1 values(1,'测试数据1....1',sysdate-2,'N');insert into test1 values(2,'测试数据1....2',sysdate-2,'N');insert into test1 values(3,'测试数据1....3',sysdate-2,'N'); commit;-- 使用insert into select 拷贝数据(注意红色部分,可以自动生成id 序列值)insert into test2(id,testname,createtime,falg)select seq_test.nextval,t1.testname,t1.createtime,t1.falg from test1 t1;-- 使用 create table select 创建被拷贝数据(注意要删除test2表先)create table test2 as select t1.id,t1.testname,t1.createtime,t1.falg from test1 t1;-- select into from 不可以,抛异常select t1.id,t1.testname,t1.createtime,t1.falg intotest2(id,testname,createtime,falg)from test1 t1;-- PL/SQL language 中select into赋值语句的测试使用create or replace procedure test1_prodisaa varchar2(100);beginselect t1.testname into aa from test1 t1 where id=1;dbms_output.put_line('t1.testname= '|| aa);end;总结:数据拷贝,建议使用insert into select;使用insert into select时如果对拷贝表生成id序列值,需要在select中以查询出的形式从sequence中查询出,再插入拷贝表;比如:insert into test2(id,testname,createtime,falg)select seq_test.nextval,t1.testname,t1.createtime,t1.falg from test1 t1;典型从test1表查询出数据插入test2表,test2要自动插入id,看上面代码,id要在select中先从sequence中查询出了!!Oracle函数问题,报(ORA-01422: 实际返回的行数超出请求的行数。
001、SQL与ORACLE的内存分配ORACLE的内存分配大部分是由INIT.ORA来决定的,一个数据库实例可以有N种分配方案,不同的应用(OLTP、OLAP)它的配置是有侧重的。
SQL概括起来说,只有两种内存分配方式:动态内存分配与静态内存分配,动态内存分配充许SQL自己调整需要的内存,静态内存分配限制了SQL对内存的使用。
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,后ORACLE003、SQL与ORACLE的日志模式SQL对日志的控制有三种恢复模型:SIMPLE、FULL、BULK-LOGGED;ORACLE对日志的控制有二种模式: NOARCHIVELOG、ARCHIVELOG。
SQL的SIMPLE相当于ORACLE 的NOARCHIVELOG,FULL相当于 ARCHIVELOG,BULK-LOGGED相当于ORACLE大批量数据装载时的NOLOGGING。
经常有网友抱怨SQL的日志庞大无比且没法处理,最简单的办法就是先切换到SIMPLE模式,收缩数据库后再切换到FULL,记住切换到FULL 之后要马上做完全备份。
004、SQL与ORACLE的备份类型SQL的备份类型分的极杂:完全备份、增量备份、日志备份、文件或文件组备份;ORACLE 的备份类型就清淅多啦:物理备份、逻辑备份;ORACLE的逻辑备份(EXP)相当于SQL 的完全备份与增量备份,ORACLE的物理备份相当于SQL的文件与文件组备份。
字串连接Oracle 使用两个管道符号(||)来作为字串连接操作符,SQL Server则使用加号(+)。
这个差别要求你在应用程序中做小小的修改。
Oracle Microsoft SQLSELECT FNAME||' '||LNAME AS NAMEFROM STUDENT_ADMIN.STUDENT-----------------------------------------------SELECT FNAME +' '+ LNAME AS NAMEFROM STUDENT_ADMIN.STUDENT流控制(Control-of-Flow)语言流控制语言控制SQL 语句执行流,语句块以及存储过程。
PL/SQL 和Transact-SQL 提供了多数相同的结构,但是还是有一些语法差别。
关键字这是两个RDBMS支持的关键字。
语句 Oracle PL/SQL ---------------------Microsoft SQL Server Transact-SQL声明变量 DECLARE DECLARE语句块 BEGIN...END; BEGIN...END条件处理IF…THEN,ELSIF…THEN,ELSEENDIF;--------------------------------------------------------IF…[BEGIN…END]ELSE[BEGIN…END]CASE expression无条件结束 RETURN------------ RETURN无条件结束当前程序块后面的语句 EXIT BREAK重新开始一个WHILE循环 N/A CONTINUE等待指定间隔 N/A (dbms_lock.sleep) WAITFOR循环控制WHILE LOOP…END LOOP;------------LABEL…GOTO LABEL;FOR…END LOOP;LOOP…END LOOP;WHILEBEGIN… ENDLABEL…GOTO LABEL程序注释/* … */, -- /* … */, --打印输出 RDBMS_OUTPUT.PUT_LINE PRINT引发程序错误(Raise program error) RAISE_APPLICATION_ERROR --------------------RAISERROR执行程序 EXECUTE----------------------EXECUTE语句终止符 Semicolon (;) ------------------N/A声明变量Transact-SQL 和PL/SQL 的变量是用DECLARE关键字创建的。
Transact-SQL 变量用@标记,并且就像PL/SQL 一样,在第一次创建时,用空值初始化。
Oracle Microsoft SQLVSSN CHAR(9);VFNAME VARCHAR2(12);VLNAME VARCHAR2(20);VBIRTH_DATE DATE;VLOAN_AMOUNT NUMBER(12,2);-----------------------------------------DECLARE@VSSN CHAR(9),@VFNAME VARCHAR2(12),@VLNAME VARCHAR2(20),@VBIRTH_DATE DATETIME,@VLOAN_AMOUNT NUMERIC(12,2)Transact-SQL 不支持%TYPE和%ROWTYPE变量数据类型定义。
一个Transact-SQL 变量不能在DECLARE命令中初始化。
在Microsoft SQL Server数据类型定义中也不能使用Oracle 的NOT NULL和CONSTAN T关键字。
像Oracle 的LONG和LONG RAW数据类型一样。
文本和图形数据类型不能被用做变量定义。
此外,Transact-SQL 不支持PL/SQL 风格的记录和表的定义。
给变量赋值Oracle 和Microsoft SQL Server提供了下列方法来为本地变量赋值。
Oracle Microsoft SQLAssignment operator (:=) ---------------------SET @local_variable = valueSELECT...INTO syntax for selecting column values from a single row-------------------------SELECT @local_variable = expression [FROM…] for assigning a literal value,an expression involving other local variables, or a column value from a sin gle rowFETCH…INTO syntax------------------------------- FETCH…INTO syntax这里有一些语法示例Oracle Microsoft SQLDECLARE VSSN CHAR(9);VFNAME VARCHAR2(12);VLNAME VARCHAR2(20);BEGINVSSN := ?'SELECT FNAME, LNAME INTO VFNAME, VLNAME FROM STUDENTS WHERE SSN=VSSN;END;------------------------------------------------------------------------------ DECLARE @VSSN CHAR(9),@VFNAME VARCHAR(12),@VLNAME VARCHAR(20)SET @VSSN = ?'SELECT @VFNAME=FNAME, @VLNAME=LNAME FROM STUDENTS WHERE SSN = @VSSN语句块Oracle PL/SQL 和Microsoft SQL Server Transact-SQL 都支持用BEGIN…END术语来标记语句块。
Transact-SQL 不需要在DECLARE语句后使用一个语句块。
----------------------------------------------------------------------------------如果在Microsoft SQL Server中的IF语句和WHILE循环中有多于一个语句被执行,则需要使用BEGIN…END语句块。
Oracle Microsoft SQLDECLAREDECLARE VARIABLES ...BEGIN -- THIS IS REQUIRED SYNTAXPROGRAM_STATEMENTS ...IF ...THENSTATEMENT1;STATEMENT2;STATEMENTN;END IF;WHILE ... LOOPSTATEMENT1;STATEMENT2;STATEMENTN;END LOOP;END; -- THIS IS REQUIRED SYNTAX DECLAREDECLARE VARIABLES ...BEGIN -- THIS IS OPTIONAL SYNTAXPROGRAM_STATEMENTS ...IF ...BEGINSTATEMENT1STATEMENT2STATEMENTNENDWHILE ...BEGINSTATEMENT1STATEMENT2STATEMENTNENDEND -- THIS IS REQUIRED SYNTAX条件处理Microsoft SQL Server Transact-SQL 的条件语句包括IF和ELSE,但不包括Oracle PL/SQL 中的ELSEIF语句。
可以用嵌套多重IF语句来到达同样的效果。
对于广泛的条件测试,用CASE表达式也许更容易和可读一些。
Oracle Microsoft SQLDECLAREVDEGREE_PROGRAM CHAR(1);VDEGREE_PROGRAM_NAME VARCHAR2(20);BEGINVDEGREE_PROGRAM := 'U'IF VDEGREE_PROGRAM = 'U' THENVDEGREE_PROGRAM_NAME := 'Undergraduate'ELSIF VDEGREE_PROGRAM = 'M' THEN VDEGREE_PROGRAM_NAME := 'Masters'ELSIF VDEGREE_PROGRAM = 'P' THEN VDEGREE_PROGRAM_NAME := 'PhD'ELSE VDEGREE_PROGRAM_NAME := 'Unknown'END IF;END;-----------------------------------------------------DECLARE@VDEGREE_PROGRAM CHAR(1),@VDEGREE_PROGRAM_NAME VARCHAR(20)SELECT @VDEGREE_PROGRAM = 'U'SELECT @VDEGREE_PROGRAM_NAME = CASE @VDEGREE_PROGRAMWHEN 'U' THEN 'Undergraduate'WHEN 'M' THEN 'Masters'WHEN 'P' THEN 'PhD'.ELSE 'Unknown'END重复执行语句(循环)Oracle PL/SQL 提供了无条件的LOOP和FOR LOOP。
Transact-SQL 则提供了WHILE循环和GOTO语句。
WHILE Boolean_expression{sql_statement | statement_block}[BREAK] [CONTINUE]WHILE循环需要测试一个布尔表达式来决定一个或者多个语句的重复执行。
只要给定的表达式结果为真,这个(些)语句就一直重复执行下去。
如果有多个语句需要执行,则这些语句必须放在一个BEGIN…END块中。
Oracle Microsoft SQLDECLARECOUNTER NUMBER;BEGINCOUNTER := 0WHILE (COUNTER <5) LOOPCOUNTER := COUNTER + 1;END LOOP;END;------------------------------------------------------DECLARE@COUNTER NUMERICSELECT@COUNTER = 1WHILE (@COUNTER <5)BEGINSELECT @COUNTER =@COUNTER +1END语句的执行可以在循环的内部用BREAK和CONTINUE关键字控制。