Oracle和SQL Server的语法区别
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 运算符,用于查找学生登记的所有课程的代码和名称。
注意,EXISTS 运算符是如何代替 INTERSECT 运算符的。
返回的数据是相同的。
在此例中,使用 MINUS 运算符,查找那些没有任何学生登记的课程。
INSERT 语句Oracle 和 Microsoft SQL Server 使用的 INSERT 语句语法类似。
Transact-SQL 语言支持对表和视图的插入,但不支持对 SELECT 语句的 INSERT 操作。
如果Oracle 应用程序代码执行对 SELECT 语句的插入操作,则必须对它进行修改。
Transact-SQL values_list参数提供了 SQL-92 标准关键字 DEFAULT,但 Oracle 不支持。
此关键字指定了,执行插入操作时使用列的默认值。
如果指定列的默认值不存在,则插入 NULL。
如果该列不允许 NULL,则返回一个错误消息。
如果该列数据类型定义为 timestamp,则插入下一个有序值。
标识符列不能使用 DEFAULT 关键字。
要生成下一个序列号,拥有 IDENTITY 属性的列不能列在column_list或 values_clause中。
不需使用 DEFAULT 关键字,来获取列的默认值。
正如在Oracle 中,如果列没有在 column_list中引用,并且它有默认值,则默认值存放在列中。
这是迁移时可使用的最兼容的方法。
一个有用的 Transact_SQL 选项 (EXECute procedure_name) 是,执行一个过程并将其结果用管道输出到目标表或视图中。
Oracle 不允许这样做。
UPDATE 语句因为 Transact SQL 支持 Oracle UPDATE 命令使用的绝大多数语法,所以只需要极少的修改。
Transact-SQL UPDATE 语句不支持对 SELECT 语句的更新操作。
如果 Oracle 应用程序代码对SELECT 语句进行更新,则可以把 SELECT 语句转换成一个视图,然后在 SQL Server UPDATE 语句中使用该视图名称。
请参见前面“INSERT 语句”中的示例。
Oracle UPDATE 命令只能使用一个 PL/SQL 块中的程序变量。
要使用变量,Transact-SQL 语言并不需要使用块。
在 SQL Server 中,DEFAULT 关键字可用于将一列设为其默认值。
但不能使用 Oracle UPDATE 命令,将一列设为默认值。
Transact-SQL 和 Oracle SQL 均支持在 UPDATE 语句中使用子查询。
但是,Transact-SQL FROM 子句可用来创建一个基于联接的 UPDATE。
这一功能使 UPDATE 语法可读性更好,在某些情况下还能改善性能。
DELETE 语句在大多数情况下,不需要修改 DELETE 语句。
如果要对 Oracle 中的 SELECT 语句执行删除操作,则必须修改 SQL Server 语法,因为 Transact-SQL 不支持这一功能。
Transact-SQL 支持在 WHERE 子句中使用子查询,以及在 FROM 子句中使用联接。
后者可产生更有效的语句。
请参见前面“UPDATE 语句”中的示例。
TRUNCATE TABLE 语句Oracle 和 Microsoft SQL Server 使用的 TRUNCATE TABLE 语句语法类似。
TRUNCATE TABLE 用于从表中删除所有的行,并且不能回滚。
表结构及其所有索引继续存在。
DELETE 触发器不执行。
如果表被一个 FOREIGN KEY 约束引用,则它不能被截断。
在 SQL Server 中,此语句只能由表的所有者执行。
在 Oracle 中,如果是表的所有者或拥有DELETE TABLE 系统权限,就可以执行此命令。
Oracle TRUNCATE TABLE 命令可以有选择地释放表中行所占用的存储空间。
SQL Server TRUNCATE TABLE 语句总是收回表数据及其相关索引所占用的空间。
标识符列和时间戳列中数据的处理Oracle 序列是与任何给定的表或列均不直接相关的数据库对象。
列和序列之间的关系是在应用程序中实现的,即通过编程的方法将序列值赋给列。
因此,Oracle 使用序列时,并不实施任何规则。
但是,在 Microsoft SQL Server 标识符列中,值不能被更新,并且不能使用 DEFAULT 关键字。
默认情况下,数据不能直接插入到标识符列。
标识符列自动给表中插入的每个新行生成一个唯一的序列号。
可以使用下列 SET 语句改写这种默认设置:SET IDENTITY_INSERT table_name ON将 IDENTUTY_INSERT 设为 ON,用户就可以向新行的标识符列插入任何值。
要防止出现有重复号码的条目,必须为该列创建唯一索引。
这条语句的目的是,允许用户给无意中删除的行重新创建一个值。
@@IDENTITY 函数可用来获取上一个标识值。
TRUNCATE TABLE 语句将标识符列重置为其起始 SEED 值。
如果不想重置列的标识值,则不使用TRUNCATE TABLE 语句,而使用不带 WHERE 子句的 DELETE 语句。
必须评估它对 Oracle 迁移造成的影响,因为 ORACLE SEQUENCE 在 TRUNCATE TABLE 命令之后不被重置。
处理 timestamp列时,只能执行插入和删除。
如果要更新一个 timestamp列,会收到以下的错误信息:Msg 272, Level 16, State 1 Can't update a TIMESTAMP column.锁定请求的行Oracle 使用 FOR UPDATE 子句来锁定 SELECT 命令中指定的行。
不需要在 Microsoft SQL Server 中使用对等的子句,因为这是默认行为。
行合计和 COMPUTE 子句SQL Server COMPUTE 子句用于生成行合计函数(SUM、AVG、MIN、MAX 和 COUNT),它们在查询结果中作为附加行出现。
它允许查看一组结果的详细和汇总信息行。
可以计算子组的汇总值,以及计算同一组的多个合计函数。
Oracle SELECT 命令语法不支持 COMPUTE 子句。
但是,SQL Server COMPUTE 子句与 Oracle SQL*Plus 查询工具中的 COMPUTE 命令作用相似。
联接子句Microsoft SQL Server 7.0 允许在一个联接子句中最多可联接 256 个表,包括临时表和永久表。
在 Oracle 中,则没有联接限制。
在 Oracle 中使用外部联接时,外部联接运算符 (+) 通常放在该联接的子列(外键)旁边。
(+) 标识了具有较少唯一值的列。
情况一般是这样,除非外键允许空值,在这种情况下,(+) 被放在父(PRIMARY KEY 或 UNIQUE 约束)列上。
(+) 不能放在等号 (=) 两边。
在 SQL Server 中,可以使用 *= 和 =* 外部联接运算符。
* 用于标识有较多唯一值的列。
如果子(外键)列不允许空值,则 * 放在等号的父(PRIMARY KEY 或 UNIQUE 约束)列一边。
* 的位置和 Oracle 完全相反。
* 不能放在等号 (=) 两边。
*= 和 =* 被认为是旧式联接运算符。
SQL Server 也支持下面列出的 SQL-92 标准联接运算符。
建议使用这种语法。
SQL-92 标准语法功能更强大,并且比*运算符的限制要少。
下面的代码示例返回所有学生登记的课程列表。
外部联接定义在学生 (student) 和成绩 (grade) 表之间,成绩表允许所有的学生出现在上面,甚至那些没有登记任何课程的学生也是如此。
外部联接也加到课程表上,以返回课程名称。
如果外部联接不加到课程表上,就不会返回那些没有登记任何课程的学生,因为他们的课程代码 (CCODE ) 为空。
将 SELECT 语句做为表名使用Microsoft SQL Server 和 Oracle 均支持在执行查询时,把 SELECT语句作为表的来源使用。
SQL Server 需要一个别名;对 Oracle ,别名的使用是可选的。
读取和修改 BLOBMicrosoft SQL Server 使用 text 和 image 列,来实现二进制大型对象 (BLOB)。
Oracle 使用 LONG 和 LONG RAW 列实现 BLOB 。
在 Oracle 中,SELECT 命令可以查询 LONG 和 LONG RAW 列中的值。
在 SQL Server 中,可以使用标准的 Transact-SQL 语句或专门的 READTEXT 语句读取 text和image列中的数据。
oracle和sqlserver查询语句
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_MSSQLServrer数据库区别
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’)转换成年月日的方式的字符串。
Oracle与SQLServer的SQL语法差异总结
项目
Oracle 10g
SQLServer 2008
备注
存储过程格式
CREATEORREPLACEPROCEDURE存储过程名(参数列表) IS
Begin
---存储过程内容
End存储过程名;
CREATEPROCEDURE存储过程名(参数列表) AS
--存储过程内容
From person
2、流控制语句
流控制与表达式结构很相似,只是结果表达式换成语句块
Case表达式when匹配表达式then {语句块1} else {语句块2} end case;
Eg:
case v_name
when‘张三’then
v_number := 1;
when‘李四’then
v_number:=2;
Eg:
Set @result =‘abcd’
2、通过SQL语句赋值
Select变量=表达式from表
Eg:
Select @code=code,@name=name from sysc01 where id = 1000
语句结束符
SQL语句使用分号;作为语句的结束
SQL语句不需要加分号;作为结束符(加也可)
3、动态存储过程(带入、出参)
Eg:
DECLARE@resultVARCHAR(50);
DECLARE@sqlNVARCHAR(1000);
DECLARE@paraNVARCHAR(200);
SET@sql='p_test @code,@name,@result output'
SET@para='@code varchar(10),@name varchar(10),@result varchar(50) output'
oracle与SQL_SEVER的语法区别
浮点数类型 FLOAT FLOAT
实数类型 REAL REAL
ORACLE内部函数大全以及与SQLSERVER的区别:
下面是Oracle支持的字符函数和它们的Microsoft SQL Server等价函数。
ORACLE和SQL语法区别归纳
数据类型比较
类型名称
Oracle
SQLServer比较
字符数据类型 CHAR CHAR 都是固定长度字符资料但oracle里面最大度为2kb,SQLServer里面最大长度为8kb
变长字符数据类型 VARCHAR2 VARCHAR Oracle里面最大长度为4kb,SQLServer里面最大长度为8kb
WHEN 'B+' THEN 3.3
WHEN 'B-' THEN 2.7
WHEN 'C' THEN 2
WHEN 'C+' THEN 2.3
WHEN 'C-' THEN 1.7
WHEN 'D' THEN 1
WHEN 'D+' THEN 1.3
WHEN 'D-' THEN 0.7
ELSE 0
列表中最小的字符串 LEAST --------------------N/A
如果为NULL则转换字串 NVL-------------------- ISNULL
日期函数
下面是Oracle支持的日期函数和它们的Microsoft SQL Server等价函数。
函数 Oracle --------------------Microsoft SQL Server
Access、SQLServer、Oracle三种数据库的区别
Access、SQL Server、Oracle的区别在做公司一个产品中,需要有Access、SQL Server、Oracle三个版本;编写SQL语句的过程中,尽量使用一些通用的语句,但还是有些方面有些区别避免不了,现简单总结一下。
以下A代表Access,S代表SQL Server,O代表Oracle1、取当前系统时间A:Select Now()S:Select Getdate()O:Select Sysdate From Dual2、连接字符串A:&S:+O:||3、字符串函数(截取字符串、大写、小写、查找字符串位置)A:Mid、UCase、LCase、InStrS:SubString、Upper、Lower、CharIndexO:SubStr、Upper、Lower、InStr4、判断取值语句A:IIFS:Case When ThenO:Decode5、时间字段A:要用#号分隔,或者转换为日期SELECT * FROM Books WHERE RegDate = #2007-5-1# 或SELECT * FROM Books WHERE RegDate = CDate(’2007-5-1′)S:可以直接用''SELECT * FROM Books WHERE RegDate = ‘2007-5-1′O:To_DateSELECT * FROM Books WHERERegDate=To_Date('2007-05-01','yyyy-mm-dd')6、数据类型转换A:CStr,CInt,CDateS:ConvertO:To_Char,To_Number,To_Date7、Inser Into …..Select …From 语句Insert Into a(ii,jj,kk) (Select ii,jj,kk From b)这样的语句,在SQL Server以及Oracle中都不会有错,但在Access中会报:INSERT INTO 语句的语法错误。
Oracle和SQLServer的主要区别
ORACLE提供了7种备份机制,具有联机备份功能 Oracle的日志默认有3个,先写入1号日志,满了后再写入2号日志,2号满了再写 入3号日志,3号满了后Oracle将自动备分1号日志的内容,然后清空后写入新的 日志信息,且Oracle的日志有多路复用功能,我们可以为日志创建多个镜像,把 相同的日志信息同时写入多个日志文件中,这样可以防止磁盘损坏造成的数据丢
SQL Server可用涵数比比较少,而且名称、调用语法跟Oracle差别比较大。 SQL Server的初如花费比较少,而且Microsoft提供免费的SQL Server工具软 件。因此价格会比Oracle低很多。 SQL Server提供全图形界面操作,很少见到DOS窗口。它的企业管理器给用户 提供一个全图形界面的集成管理控制台来集中管理多个服务器,使用比较方 便,安装也比较简单。 Sql server 只是关系型数据库管理系统(RDBMS) Ms Sql Server的扩展叫Transact-SQL,主要的结构化查询工具就是自带的查 询分析器
SQL中的错误机制比较复杂,没有提供错误描述。
SQL只能是本机备份本机的数据库,无法联机备份,而且备份压缩很低,占用 了大量空间 SQL Server对每个数据库只能分配一个日志文件。且当日志填满后,日志将停 止工作,等待人工干预,而无法自动重用。
1.SQL Server中的数据类型比较简单,只有一些简单的基本数据类型,无法提 供事务操作。 2.SQL Server包含的数据类型比较少,无法定义结构体,数组,对象。 3.SQL Server无法定义流程机制,类型转换也极不方便,SQL Server中对游标 定义十分复杂,且当用户定义的多个游标同时打开时系统却只有一个游标变 量,这是SQL SERVER中一个严重的缺陷。 4.SQL Server在保存大文件时,是一次将整个大文件写入内存,然后在一次性 存到数据库里面,很容易引起内存溢出。
SQLServerMySqlOracle语法对比及区别
SQLServerMySqlOracle语法对⽐及区别操作SQLServer Oracle Mysql查看表结构exec sp_help 表名desc 表名在command window看desc 表名或 describe 表名或show columns from 表名;修改数据库名称exec sp_renamedb ‘旧数据库名’,’新数据库名’不详修改表名exec sp_rename ‘旧表明’,’新表明’rename 旧表名 to 新表名alter table 表名 rename to 新表名修改列名exec sp_rename ‘表.旧列名’,’新列名’alter table 表名 rename column 旧列名 to 新列名alter table test change column address address1 varchar(30)--修改表列名删除数据库drop database 数据库名不详Drop database添加表中⼀列alter table 表名 Add 列名数据库类型alter table 表明 add(列名数据类型) 或alter table 表名 Add 列名数据库类型alter table test add column name varchar(10); --添加表列删除表中⼀列alter table 表名 drop column 列名alter table 表名 drop column 列名alter table test drop column name;修改表现有列alter table 表名 alter column 列名新数据库类型⼤⼩alter table 表明 modify(列名数据类型)alter table test modify address char(10) --修改表列类型||alter table test change address address char(40)删除约束alter table 表名 drop constraint约束名完全⼀样添加主键约束alter table 表名add constraint 主键约束名primary key (列名)完全⼀样alter table 表明add primary key (列名)删除主键约束alter table 表名 drop primary key添加唯⼀约束alter table 表名add constraint 唯⼀约束名unique (列名)完全⼀样alter table 表名 add unique (列名)添加默认约束alter table 表名add constraint default (值) for 列名完全⼀样添加检查约束alter table 表名add constraint check (列名 > 10)完全⼀样添加外键约束alter table ⼦表add constraint 外键约束名foreign key(⼦表的列名) references 主表 (列名)on update cascade / on updateaction注意:默认和加 on update action 表⽰更新受限加on update cascade 表⽰更新不受限,多项操作时⽤逗号隔开完全⼀样添加索引约束alter table 表名 add index 索引名 (列名)添加普通索引:create index 索引名 ON 表名 (列名)添加唯⼀索引:create unique索引名 ON 表名 (列名)删除索引drop index 索引名 on 表名alter table 表名 drop index 索引名⾝份: exec sp_grantlog域名\密码’⾝份: exec sp_addlogin ‘登陆’,’密码’SET PASSWORD FOR'username'@'host'= PASSWORD('newpassword');数据库名⾝份: Exec域名密码’,’数据库⽤户名’⾝份: Exec sp_grantdbaccess登陆帐户’,’数据库⽤户名’create user HDEAM_TYMBidentified by ""default tablespace HDEAM_TYMBtemporary tablespace TEMPprofile DEFAULT;mysql>insert intoer(Host,User,Password,ssl_cipher,x509_issuer,x509_subject) values("localhost","pppadmin",password("passwd"),'','','');CREATE USER 'dog'@'localhost' IDENTIFIED BY '123456';CREATE USER 'pig'@'192.168.1.101_' IDENDIFIED BY'123456';CREATE USER 'pig'@'%' IDENTIFIED BY '123456';CREATE USER 'pig'@'%' IDENTIFIED BY '';CREATE USER 'pig'@'%';权限 [on 表明] to 数据库grant dba to HDEAM_TYMB with admin option;-- Grant/Revoke system privilegesgrant unlimited tablespace to HDEAM_TYMBwith admin option;“abc”;grant all privileges on phplampDB.* to phplamp@localhostidentified by '1234';mysql>flush privileges;权限 [on 表名] from 数据REVOKE SELECT ON*.* FROM'pig'@'%';数据库’drop user HDEAM_SBFF cascade;mysql>Delete FROM user Where User="phplamp" andHost="localhost";mysql>flush privileges;⾝份: exec sp_droplogin⾝份: exec sp_revokelogin 登分离数据库:数据库名附加数据库:数据库名,主数据⽂件路径’,⽇志⽂件路径’exp hdeam_product/d3B68Apk29v34Dj@orclfile=E:/tymb.dmp log=E:/tymb.logimp HDEAM_LHSH/HDEAM_LHSH@orcldevfile=E:\TYMBHDEAM_BAK_2013-03-25.dmpfull=Y;mysqldump -h localhost -u root -pmysql oa >d:\oa.sqlmysql -h localhost -u root -p jira<d:\jira.sql:Select *select * from表)Exec Sp_helpExecExec数据库名exec表名exec sp_helpindex注意: 下⾯都是通过( select * from 对象 ) 来查看信息触发器 user_triggers过程 user_procedures查看源代码 user_source查看数据库对象 user_objects查看错误信息 show errors查看索引信息 user_indexes查看分区索引 user_ind_partitions查看有关基于列创建的索引 user_ind_columns查看表空间 -- user_tablespaces查看所有数据库 show databases;查看库所有表 show tables;查看表结构和属性use information_schema;select * from columns where table_name=’表名’查看表源代码show create table 表名;查看存储过程源代show create procedure 过程名查看视图源代码show create procedure 过程名查看视图资代码show create VIEW 视图名查看表的索引show index from 表名查看表的索引show keys from 表明表储蓄过/空过程,函数,视图,表的源代码:对象名::查看序列 -- user_sequences查看同义词 -- user_ind_columns查看⽤户表信息 -- user_tables查看⽤户所有的表信息 user_all_tables查看表的索引show keys from 表明sysdate NOW()varchar2(20)不⼀定要指定具体列名必须指定具体列名标识的开始值, 标识种右)create sequence 序列名1.序列名.nextval 获取下⼀个序列的值2.序列名.currval 获取当前的序列的值: *.mdf =1 :*.ndf >=0 : *.log >=1数据⽂件: *.dbf >=1⽇志⽂件: *.log >=11位置开始查找t字符串(默认从1开始)从pos位置len获取字符串的长度把字符串全部转换成把字符串全部转换成清除左边的空格清楚右边的空格从左边返回指定长度的从右边返回指定长度将s t替换成字符串我的⾳乐我’)A我的⾳乐我的世界EFG2位置开3的字符串,并在该位置索引从1开始substr(char, pos, len) 截取字符串length(char) 返回字符串的长度lower(char) 转换为⼩写upper(char) 转换为⼤写trim() 截取左右空格initcap(char) ⾸字母⼤写ltrim(char,set) 左剪裁rtrim(char,set) 右剪裁replace(char oldchar, newchar) 字符串替换concat(char1, char2) 连接字符串cha(67) 根据ASCII码返回对应的字符lpad()和rpad() 在字符串的左边或右边添加东西需要3个参数第⼀个是字符串第⼆个是返回值的总长度, 第三个是⽤来填充的字符值 as varchar) 不需指定长度to_char(d|n, fmt)将数字或⽇期转换为指定格式的值 as varchar) 不需指定长度值) 必须指to_char(d|n, fmt)将数字或⽇期转换为指定格式的字符串to_date(char,frm)将char 或varchar 转换为⽇期数据类型to_number() 将包含数字的字符转换为number数据类型取绝对值取上界最⼩整取下界最⼤整数取幂四舍五⼊,正数返回1 ,负数返-1求平⽅根获取计算机名称nvl(ex1,ex2)如果ex1为null则返回ex2;如果ex1不为null则返回ex1;nvl2(ex1,ex2,ex3)如果ex1不为null则返回ex2如果ex1为null则返回ex3nullif(ex1,ex2)如果ex1=ex2则返回null 否则返回ex1;聚合)列名) 求这列的平均值列名) 求这列的最⼩值列名) 求这列的最⼤值统计所有的⾏包括重复列名) 统计指定列中⾮空值列名) 统计不是重复右句⽤于将信息表划分,按组进⾏聚合运算avg(列名) 求这列的平均值min(列名) 求这列的最⼩值max(列名) 求这列的最⼤值count(*) 统计所有的⾏包括重复值和空值count(列名) 统计指定列中⾮空值的个数count(distinct 列名) 统计不是重复值的个数group by右句⽤于将信息表划分为组,按组进⾏聚合运算返回当前系统时间返回指+指定部分后的⽇期返回返回指a. add_months(d,n) 返回给指定的⽇期加上指定的⽉数后的⽇期值 selectadd_months(sysdate,2) from dual;b. months_between(d,d) 返回2个⽇期之间的⽉数select months_between (date '2005-05-06',date '2005-9-01') from dual;c. last_day(d) 返回指定⽇期当⽉的最后⼀天的⽇期select last_day(sysdate) from dual;d. round(d, [fmt]) 返回⽇期值⽇期四舍五⼊为格式模型指定的单位 select round(date'2005-09-08','year') from dual; 返回 2005-01-01 selectround(date'2005-09-08','month') from dual; 返回2005-09-01 select round(date'2005-09-08','day')from dual; 返回最靠近的⼀个星期⽇e. next_day(d, day) 返回指定的下⼀个星期⼏的⽇期 select next_day(sysdate,'星期⼆') fromdualf.trunc 语法与round 相同区别:trunc 是只舍不⼊g.extract 提取⽇期时间类型中的特定部分|| 连接字符串⽤于将2个或多个字符串合并成⼀个字符串两个)重复的⾏select orderno from order_master union select orderno from order_detail;b.union all 合并2个查询选定的所有⾏包括重复的⾏c.intersect 返回2个查询都有的⾏d.minus 第1个查询在第2个查询中不存在的数据)个,⾄n-个条)::对1 :)左别名.列名,右别名.列from 左表 as 左别名 inner右表 as 右别名on 左别名.列= 右别名.列名左表名.列名,右表名.列from 左表 ,右表 where 左表.列名 = 右表名.列名左外连接:(返回左表的所有⾏,如null代替,存在则显⽰具体数,显⽰出来的总⾏数由左表决定)左别名.列名,右别名.列名左表 as 左别名 left join 右as 右别名on 左别名.列名 = 右.列名右外连接:(返回右表的所有⾏,如null代替,存在则显⽰具体数,显⽰出来的总⾏数由右表决定)左别名.列名,右别名.列名左表 as 左别名 right join右表 as 右别名on 左别名.列名 =完全⼀样连接分类:1内连接:条件2外连接1)左外连接: left join 或 left outer join2)右外连接:right join 或 right outer join3)完整外连接: Full join 或 Full outer join3交叉连接: from …4. 交叉连接:(返回左右表的所有⾏,如果左表没有与右表匹配的⾏则全部⽤null代替,如果右表没有与左表匹配的⾏则全部⽤null代替,存在则显⽰具体数据,显⽰出来的总⾏数=左表和右表⾏数和决定)Select 左别名.列名,右别名.列名 from 左表 as左别名 right join 右表 as 右别名on 左别名.列名= 右别名.列名完全拷贝: insert into ⽬标表源表部分拷贝: insert into ⽬标表 (列) select 列名 from 源表表不存完全拷贝: select * into 新表源表部分拷贝: select 列名 into 新from 源表拷贝表结构: select * into 新表源表 Where 1=2emp;b.拷贝⼀部分create table temp as select 列1,列2 from 表c.只拷贝⼀个空表(根据⼀个假条件)create table temp as select * from 表 where 1=2d.使⽤列别名: select stu_id, stu_name as "学⽣姓名" from student;A表,B1:⽬标表 set 列 = a.列 froma where a.关联列 = ⽬标表.2:列 = a.列 from 源a , ⽬标表b where a.关联列 =关联列3:⽬标表 set 列 = a.列 froma , ⽬标表b where a.关联列关联列4:⽬标表 set ⽬标表.列 = a.from 源表 a , ⽬标表 b where关联列 = b.关联列5:⽬标表 set⽬标表.列 = a.from 源表 a where a.关联列 =update ⽬标表a, 源表b set a.列 =b.列 where a.关联列 = b.关联列update ⽬标表a, 源表b set a.列 =b.列 where a.关联列 = b.关联列from 源表 a where a.关联列 = .关联列6:update语创建⼀个新表修改表中的列表名 alter column 列新数据库类型⼤⼩添加表中的列表名 Add 列名数据库删除表中的列表名 drop column 列删除表中的记录⽽不删除表的truncate table student只是查看表的结构删除表中的数据及表的结构a.创建⼀个新表create table student(stu_id int, stu_name varchar2(20)) tablespace lijiaob.修改表中的列alter table student modify(stu_name varchar2(40))c.添加表中的列alter table student add(stu_age int)d.删除表中的列alter table student drop column stu_agee.删除表中的记录⽽不删除表的结构truncate table studentf.只是查看表的结构desc studentg.删除表中的数据及表的结构drop table student;:.必须)a. commit 命令(⽤于提交并结束事务处理)commitb.savepoint 保存点类似于标记它将很长的事务处理划分为较⼩的部分他们⽤来标记事务中可以应⽤回滚的点save point savepoint_idc.rollbace work ,rollbackd.回滚到某个保存点rollback to savepoint伪列,但a.rowid(可以唯⼀的标识数据库中的⼀⾏)b.rownum (代表⾏的序号)rownum 不跟> , = , >= 操作使⽤储在,)变量名 = 值变量名 = 列名 from 表明列名 =⽤户)最后⼀个T-SQL错误号最后⼀次插⼊的标识本地服务器的名值’ 只出现在查询分析器中值’,16,1) 能在前台⽤条件) begin … end条件) begin …end else begin表名 where= 值)表名列名 = 值) begin …. enda) if condition then exp_bodyend if;b) if condition then exp_bodyelse exp_body end if;c) if condition then exp_bodyelsif condition then exp_bodyelse exp_body end if;1) loop condition end loop2) while condition Loop exp_body end loop3)for varable in [REVERSE] value1...value2 (varable 变量不需声明 , ... 是范围连接符 )loop exp_body end loop别名=case条件 then 值条件 then 值值表列名值 then 值值 then 值值表a) select case 列名when 值 then 值when 值 then 值else 值end case from 表明b) select casewhen 列名=值 then 值when 列名=值 then 值else 值end case from 表:1.列类型: %TYPEvarable tableName.columnName%TYPE;varable tableName.columnName%TYPE;2.⾏类型: %ROWTYPEvarable tableName%ROWTYPE;3.使⽤⾏类型:varable.列名;异常信息’,16,1) 能在 1)⾃定义异常:a)定义异常:(位 declare和 begin之间)DECLARE varable EXCEPTION;b)显⽰引发异常(为 begin 和 end 之间):RAISE varable;2)处理预定义异常:(位 begin 和 end 之间)EXCEPTIONwhen Too_Many_ROWS thenDBMS_OUTPUT.PUT_LINE('返回多⾏');when others thenDBMS_OUTPUT.PUT_LINE('全部处理');3) 引发应⽤程序错误:RAISE_APPLICATION_ERROR(error_number,error_message);原理: ):(重复⼦查询,不能单)(只执⾏⼀次,能单独执, 查询原理: 从外(外sql⼀次查出sql)到⾥把外不查出来的值传):查询到结果可以作为表来使⼀样切套⼦查询:Select * from AuthorBook a where CopyRight =(select Max(CopyRight) from AuthorBookwhere BookName = a.BopokName)(效率低)>连接查询(效), ⽽连. 右查询有连接查完全⼀样返回多⾏⼀列完全⼀样完全⼀样:只能出现在Group by分组,不能单独使⽤group by 就没有Having完全⼀样完全⼀样相对于mssql oracle显著的书写特点:1.代码⽚段必须放到begin end .. 中2.虚拟表 dual 的使⽤3.每⾏代码强制分号";"结束,包括end4.赋值符号 :=;(select xx into xx from daul;也可以⽤于赋值)5.省略了 as...补充:⼏种关系数据库中字符编码和存储长度需要注意的⼏个问题1.mysql中char(n) varchar(n) 中再utf8编码存储⽅式下数字表⽰的是字符数,但是在其他⽅式下就根据情况定,需要再相应环境下探索⼀下。
ORACLE与SQL SERVER的区别
ORACLE与SQL SERVER的区别整理人:张震1、开放性 (2)2、可伸缩性,并行性 (2)3、安全性 (2)4、性能 (2)5、客户端支持及应用模式 (3)6、操作简便 (3)7、使用风险 (3)8、文件体系结构 (3)9、存储结构 (4)10、参数文件 (5)11、日志文件 (5)12、控制文件 (5)13、数据类型 (5)14、回滚事务 (6)15、操作方式 (6)16、游标 (6)17容错机制 (6)1、开放性SQL Server 只能在windows 上运行,没有丝毫的开放性,操作系统的系统的稳定对数据库是十分重要的。
Windows9X系列产品是偏重于桌面应用,NT server只适合中小型企业。
而且windows平台的可靠性,安全性和伸缩性是非常有限的。
它不象unix那样久经考验,尤其是在处理大数据量的关键业务时.Oracle 能在所有主流平台上运行(包括 windows)。
完全支持所有的工业标准。
采用完全开放策略。
可以使客户选择最适合的解决方案。
对开发商全力支持。
2、可伸缩性,并行性SQL server 并行实施和共存模型并不成熟。
很难处理日益增多的用户数和数据卷。
伸缩性有限。
Oracle 平行服务器通过使一组结点共享同一簇中的工作来扩展windownt的能力,提供高可用性和高伸缩性的簇的解决方案。
如果windowsNT不能满足需要, 用户可以把数据库移到UNIX中。
3、安全性SQL server 没有获得任何安全证书。
Oracle Server 获得最高认证级别的ISO标准认证。
4、性能SQL Server中以页为单位或使用扩展类型以页为一单位进行空间分配而无法人工干预,当遇到频繁存储或大数据量存储时,系统将频繁进行I/O操作使工作效率低下;SQL Server 多用户时性能不佳。
Oracle以块为最小存储单位,以区为单位分配空间,用户可以根据需要自己定义块的大小,且区可以按等额或递增进行分配,这可以大大减少系统的I/O操作提高数据库的性能;ORACLE性能最高,保持windowsNT下的TPC-D和TPC-C的世界记录。
Oracle和SQL_Server的语法区别
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与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 局部变量名 …” 。
