8、外连接 •MS SQL SERVER 支持两种形式表间连接 ①从Sybase继承来的形式: 字段1 *= 字段2 (左连接) 字段1 =* 字段2 (右连接) 没有这种形式的全外连接语法 ②标准的外连接语法 left [outer] join on 逻辑表达式 right [outer] join on 逻辑表达式 full [outer] join (全外连接) on 逻辑表达式 这里的逻辑表达式 可以是很复杂的表达式例如 :A.ID=B.ID AND (A.Parebt_ID=1 OR A.Parent_ID=2)
需要提醒大家的是:你写的查询语句报告过这样的错误 Joined tables cannot be specified in a query containing outer join operators. Joined tables cannot be specified in a query containing outer join operators. View or function 'dbo.VU_CAF_BILLS' contains joined tables 这句话告诉你,你查询语句引用的视图或者子查询也用到了外连接,但是引用视图或者子查询外连接语法与你的外连接语法不一直导致的 例如:select A.[ZONE],A.FLAG,A.FlagDesc,A.CAF_NO from dbo.VU_CAF_BILLS A,TU_Flag where A.CAF_NO*=TU_Flag.ObjNo 视图dbo.VU_CAF_BILLS的外连接语法是标准的SQL语法,而本语句中的外连接语法却是Sybase式的外连接语法。 •Oracle不支持标准的外连接语法,也没有全外连接,这是它的缺陷 字段1 = 字段2(+) (左连接) 字段1(+) = 字段2 (右连接) •使用外连接语句的用处 ①不想因为表连接而使主表数据行丢失,这一点毋庸多说 ①找某条记录在A表存在,而在B表不存在,按常规做法使用not in (select 查询子句)语法, 使用not in 最大的缺点速度慢,原因是每个数据行都去做:select 查询子句 而使用下面的语法: select TU_COMPANY.* from TU_COMPANY left join TU_Comp_Agent on TU_COMPANY.ID=TU_Comp_Agent.CompCode where TU_Comp_Agent.Id is null
10、表数据复制 •库内数据复制 •MS SQL Server Insert into 复制表名称 select 语句 (复制表已经存在) select 字段列表 into 复制表名称 from 表 (复制表不存在) •Oracle Insert into 复制表名称 select 语句 (复制表已经存在) create table 复制表名称 as select 语句 (复制表不存在)
•文本文件转入、转出的批量处理 •MS SQL Server BCP命令行程序 •Oracle SQLLDR命令行程序 11、多表更新、删除 一条更新语句是不能更新多张表的,除非使用触发器隐含更新,我这里说的意思是:根据其他表数据更新你要更新的表 一般形式: •MS SQL Server update A SET 字段1=B表字段表达式, 字段2=B表字段表达式 from B WHERE 逻辑表达式 •Oracle update A SET 字段1=(select 字段表达式 from B WHERE ...), 字段2=(select 字段表达式 from B WHERE ...) WHERE 逻辑表达式
从以上来看,感觉oracle没有ms sql好,主要原因:假如A需要多个字段更新,MS_SQL语句更简练 你知道刚学数据库的人怎么做上面这件事情吗,他们使用游标一条一条的处理 12、关于存储过程或函数中使用的临时表,两者都提供了这个功能 临时表,最主要的好处是,操作不留任何痕迹、不产生日志, 所以速度快 •MS SQL SERVER CREATE TABLE #表名称(........) 或者 SELECT 字段表达式列表 INTO #表名称 FROM 表名称前加#即可,这些临时表都是只在一个数据库连接会话期间有效
•Oracle create [Global] Temporary Table ,加上[Global]就是全局的临时表(所有数据库连接会话都是可见的), 不则为私有的(在一个数据库连接会话期间有效)13、两者都提供了自己的桌面版的数据库 •MS SQL SERVER 毋庸我多说了 基本上桌面版的数据库提供的功能跟服务器版的功能没多大区别 缺少的全文搜索服务功能 •Oracle Oracle Lite 8,我就看过人家用Oracle lite 8做过海关报关系统 补充:Sybase 提供了桌面版的Sybase SQL anywhere 14、动态执行SQL语句 •MS SQL SERVER 7.0好象没有这个功能,MS SQL SERVER 2000已经这个功能。 你是不是想在存储过程的参数中传递一个表名或者在过程体里动态 生成一个SQL语句,你会发现很难办到。看了下面的例子:你以前的问题全解决了 declare @count int declare @SQL nvarchar(200) set @SQL = N'select count(*) from sysobjects' exec sp_executesql @SQL,N'@i int output',@count output
开放性:
SQL Server 只能在windows 上运行,没有丝毫的开放性,操作系统的系统的稳定对数据库是十分重要的。Windows9X系列产品是偏重于桌面应用,NT server只适合中小型企业。而且windows平台的可靠性,安全性和伸缩性是非常有限的。它不象unix那样久经考验,尤其是在处理大数据量的关键业务时.
Oracle 能在所有主流平台上运行(包括 windows)。完全支持所有的工业标准。采用完全开放策略。可以使客户选择最适合的解决方案。对开发商全力支持。
DB2 能在所有主流平台上运行(包括windows)。最适于海量数据。DB2在企业级的应用最为广泛,在全球的500家最大的企业中,几乎85%以上用DB2数据库服务器,而国内到97年约占5%. 可伸缩性,并行性
SQL server DB2 并行实施和共存模型并不成熟。很难处理日益增多的用户数和数据卷。伸缩性有限。
Oracle 平行服务器通过使一组结点共享同一簇中的工作来扩展windownt的能力,提供高可用性和高伸缩性的簇的解决方案。 如果windowsNT不能满足需要, 用户可以把数据库移到UNIX中。
DB2 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 完全重写的代码,经历了长期的测试,不断延迟,许多功能需要时间来证明。并不十分兼容早期产品。使用需要冒一定风险。
Oracle 长时间的开发经验,完全向下兼容。得到广泛的应用。完全没有风险。
DB2 在巨型企业得到广泛的应用,向下兼容性好。风险小。 仅供参考
这种对照,从我个人认为觉得不需要做过多的这种比较,一个如果从来没有学过其他
数据库管理的人,可能更容易学习Oracle.现在我来说一下两者的区别和联系1、关于数据库的概念
我怎么找到或者创建自己的数据库
Oracle的数据库的概念已经完全不同于MS SQLOracle的服务和数据库,相当于MS SQL的数据库服务
Oracle的服务=后台进程+相关内存数据库=数据文件的集合
而且Oracle的服务是完全可以与数据文件脱离开来的
那么MS SQL的数据库,在Oracle哪儿能找到呢,
Oracle的Schema,Schema的中文意思:方案,意思是一个用户所拥有所有对象的集合
这里的对象包括表、视图、实例化视图、序列、过程、函数、程序包、同义词
(下面我会详细解释这其中的一些陌生的概念)所以我们要建立一个在Oracle中的类似于MS SQL的数据库:大致过程
•建立数据表空间(相当于MS SQL的数据库的数据文件)
•建立临时表空间(相当于MS SQL的数据库的事务日志文件)
•建立用户,他的却省表空间和临时表空间是刚建立的两个表空间
•给用户授权,最起码的角色权限是Connect 的角色
•以该用户登陆,创建自己的表、视图、实例化视图、序列、过程、函数、程序包、同义词等2、关于Oracle Manager Server与MS SQL的Enetrprise manager
应该说这两者有很大的差别,DBA Studio工具提供了与MS SQL的Enetrprise manager同样的功用,
DBA Studio工具对一般使用来说已经足够了。
但这里有必要对Oracle Manager Server解释一下
•它是Oracle 管理分布式数据库的服务,注意他是服务
•它却省并不安装
•它需要有自己管理所需要的资料库,在某个数据库中需要建立相应的用户
•它的等录需要身份验证,注意这里的身份验证,与管理所需要的资料库的用户是不是一个概念,
也不是数据库中的Sys和、system用户,它的却省用户是oemtemp
•它的功能有
•使用它,在管理端要启动Manager Server服务和智能代理服务(OracleAgent),被管理的数据库服务器
要启动智能代理服务(OracleAgent)3、关于Oracle 的Sys、System的用户与MS SQL的master的比较
MS SQL的master数据库存储了当前数据库服务的一些配置信息如
数据库设备(在MS SQL已经弱化)、字符集、数据文件、登陆帐号、拥有的数据库、整个服务参数配制等信息Oracle的Sys存储Oracle服务或者实例的信息及所有用户的数据字典信息
这一点不同于MS SQL,MS SQL每一个数据库拥有自己的对象的数据字典信息
System用户拥有数据字典是视图信息,有了这些视图,我们的查询数据库的信息就特别方便
却省情况下,system用户拥有DBA系统角色权限,而sys不仅拥有DBA 的权限还拥有SysDBA的权限DBA、SysDBA这两个系统角色有什么区别呢在说明这一点之前我需要说一下Oracle服务的创建过程
•创建实例
•启动实例
•创建数据库(system表空间是必须的)
启动过程
•实例启动
•装载数据库
•打开数据库SysDBA,是管理Oracle实例的,它的存在不依赖于整个数据库完全启动,
只要实例启动了,他就已经存在,以SysDBA身份登陆,装载数据库、打开数据库
只有数据库打开了,或者说整个数据库完全启动后,DBA角色才有了存在的基础!4、Oracle中新的数据库对象:实例化视图、快照、序列、程序包、同义词、抽象的数据类型•实例化视图又称显形图:实例化说明他有自己的存储空间,视图:说明他的数据来源于其他表数据。
实例化视图中的数据,设置为隔一段时间更新数据,更新的模式可以定义为完全更新和增量更新
•快照基本上同实例化视图,只不过数据来源不同,快照数据来愿于远程数据库,而实例化视图
则来源于本地数据表
•序列,相当于MS SQL中的identity列,他是一个数字顺序列表
•程序包:他是过程、函数、全局变量的集合,他封装了私有变量、私有过程和私有函数
如:dbms_out包
•同义词:是对数据库中的对象的别名,同义词可以是全局的也可以是私有的(属于某个用户的)
如:Tab,col等
•抽象的数据类型,类似于C中的结构体或Pascal记录类型
关于类型,这里还有一个题外话:A Tab%RowType,这是一个特别的抽象的数据类型,该类型的分量就是TAB的字段
B Tab.TName%Type,这定义了一个和tab的字段TNAME相同的数据类型的变量,
想想他有什么好处5、Oracle数据库连接和MS SQL远程连接
两者都是为了实现分布式数据库的操作。
两者都能实现分布式事务,参见MS SQL的联机帮助6、Oracle回滚段和MS SQL的数据库事务日志文件
回滚段提供了事物回滚需要使用的数据变化以前的映象.这些映象是按条目存储的,
如果这些条目过少,一个事务等待另一个事务的几率增大,就会影响数据库的性能
却省安装时,提供一个系统回滚段他在System表空间.为了提高性能system 表空间
不应存储有任何数据字典信息以外的信息.MS SQL数据库事务日志文件功能雷同于回滚段,只不过他是同特定的数据库密切相关的7、关于数据表的管理
•超大型数据表的管理
一个数据表,尤其是那种流水帐表,长年累月后急剧膨胀,最后影响查询性能
怎么办,Oracle和MS SQL都提供了一种方法,把数据文件及其索引存放在一个特定的
数据文件或表空间里,但这个还是不能解决问题,怎么办,开发人员只能给表添加
时间的标志:如CWSJ2000(财务数据2000),CWSJ2001,CWSJ2002, 这种命名方式,
确实能提高查询性能,但是给开发带来了不少的麻烦(浪潮财务就是这样做的),
而且当你不知道数据在哪个表中的时候,你要联合这么表进行查询,岂不长哉!
Oracle提供了很好的手段解决了这个问题:表及索引分区存储。按字段值的范围
进行分区存储.具体做法不在说明。•Oracle索引组织表和MS SQL簇索引表
两者的数据存放顺序都是按照索引值的顺序存放的。•无事务回滚概念的表,对这种表的操作不村在事务的概念
记得以前MySQL是不提供事务的回滚(不知现在有否变化)
而Oracle提供了建表参数nologging,使对该表的操作不参与事物的回滚•索引
Oracle提供了多种MS SQL没有的索引类型
••位图索引,
比方说性别:仅有男女
第1条记录:男
第2条记录:男
第3条记录:女
第4条记录:男
第5条记录:女
第6条记录:男
.........
那它的索引:110101............看这种索引多节省空间,它适用于字段值是的已知几个中的一个••基于函数或者说表达式的索引,这个功能可谓强大
•MS SQL SERVER 支持两种形式表间连接
①从Sybase继承来的形式:
字段1 *= 字段2 (左连接)
字段1 =* 字段2 (右连接)
没有这种形式的全外连接语法
②标准的外连接语法
left [outer] join on 逻辑表达式
right [outer] join on 逻辑表达式
full [outer] join (全外连接) on 逻辑表达式
这里的逻辑表达式 可以是很复杂的表达式例如 :A.ID=B.ID AND (A.Parebt_ID=1 OR A.Parent_ID=2)
需要提醒大家的是:你写的查询语句报告过这样的错误
Joined tables cannot be specified in a query containing outer join operators. Joined tables cannot be specified in a query containing outer join operators. View or function 'dbo.VU_CAF_BILLS' contains joined tables
这句话告诉你,你查询语句引用的视图或者子查询也用到了外连接,但是引用视图或者子查询外连接语法与你的外连接语法不一直导致的
例如:select A.[ZONE],A.FLAG,A.FlagDesc,A.CAF_NO
from dbo.VU_CAF_BILLS A,TU_Flag
where A.CAF_NO*=TU_Flag.ObjNo
视图dbo.VU_CAF_BILLS的外连接语法是标准的SQL语法,而本语句中的外连接语法却是Sybase式的外连接语法。 •Oracle不支持标准的外连接语法,也没有全外连接,这是它的缺陷
字段1 = 字段2(+) (左连接)
字段1(+) = 字段2 (右连接) •使用外连接语句的用处
①不想因为表连接而使主表数据行丢失,这一点毋庸多说
①找某条记录在A表存在,而在B表不存在,按常规做法使用not in (select 查询子句)语法,
使用not in 最大的缺点速度慢,原因是每个数据行都去做:select 查询子句
而使用下面的语法:
select TU_COMPANY.*
from TU_COMPANY left join TU_Comp_Agent on TU_COMPANY.ID=TU_Comp_Agent.CompCode
where TU_Comp_Agent.Id is null
9、触发器
•从我了解到的,MS SQL SERVER,仅有表的触发器,而且触发时机不够丰富
如插入触发在子,不区分单条插入还是多条插入,也不区分插入前触发还是插入后触发
碰到多条数据的插入,需要使用游标处理每条插入的数据 •Oracle提供的触发器不仅有基于表的触发器,而且其他类型的,例如数据库级的触发器:数据库启动、数据库关闭
对于表级的触发器,区分单条插入还是多条插入,也区分插入前触发还是插入后触发
10、表数据复制
•库内数据复制
•MS SQL Server
Insert into 复制表名称 select 语句 (复制表已经存在)
select 字段列表 into 复制表名称 from 表 (复制表不存在)
•Oracle
Insert into 复制表名称 select 语句 (复制表已经存在)
create table 复制表名称 as select 语句 (复制表不存在)
•文本文件转入、转出的批量处理
•MS SQL Server
BCP命令行程序
•Oracle
SQLLDR命令行程序
11、多表更新、删除
一条更新语句是不能更新多张表的,除非使用触发器隐含更新,我这里说的意思是:根据其他表数据更新你要更新的表
一般形式:
•MS SQL Server
update A
SET 字段1=B表字段表达式,
字段2=B表字段表达式
from B
WHERE 逻辑表达式
•Oracle
update A
SET 字段1=(select 字段表达式 from B WHERE ...),
字段2=(select 字段表达式 from B WHERE ...)
WHERE 逻辑表达式
从以上来看,感觉oracle没有ms sql好,主要原因:假如A需要多个字段更新,MS_SQL语句更简练 你知道刚学数据库的人怎么做上面这件事情吗,他们使用游标一条一条的处理
12、关于存储过程或函数中使用的临时表,两者都提供了这个功能
临时表,最主要的好处是,操作不留任何痕迹、不产生日志,
所以速度快
•MS SQL SERVER
CREATE TABLE #表名称(........) 或者 SELECT 字段表达式列表 INTO #表名称 FROM
表名称前加#即可,这些临时表都是只在一个数据库连接会话期间有效
•Oracle
create [Global] Temporary Table ,加上[Global]就是全局的临时表(所有数据库连接会话都是可见的),
不则为私有的(在一个数据库连接会话期间有效)13、两者都提供了自己的桌面版的数据库
•MS SQL SERVER 毋庸我多说了
基本上桌面版的数据库提供的功能跟服务器版的功能没多大区别
缺少的全文搜索服务功能
•Oracle
Oracle Lite 8,我就看过人家用Oracle lite 8做过海关报关系统
补充:Sybase 提供了桌面版的Sybase SQL anywhere
14、动态执行SQL语句
•MS SQL SERVER 7.0好象没有这个功能,MS SQL SERVER 2000已经这个功能。
你是不是想在存储过程的参数中传递一个表名或者在过程体里动态
生成一个SQL语句,你会发现很难办到。看了下面的例子:你以前的问题全解决了
declare @count int
declare @SQL nvarchar(200)
set @SQL = N'select count(*) from sysobjects'
exec sp_executesql @SQL,N'@i int output',@count output
•Oracle提供了两种方法实现这个功能
①程序包DBMS_SQL,执行一个语句的过程:
打开游标(open_cursor,对于非查询语句,无此过程)
分析语句(Parse)
绑定变量(bind_variable)
执行语句(execute)
关闭游标(close_cursor,对于非查询语句,无此过程)
②execute immediate ls_SQL15、数据库备份和恢复
两者都提供了很强的数据库的备份和恢复能力,Oracle提供了更多的手段,
Orace宣称她的数据库是不可摧毁的也不是瞎吹牛
•MS SQL SERVER
①数据库的倒入倒出DTS工具,如果数据源和目的都是MS SQL SERVER则可以完全复制数库的结构
(包括表、视图、索引、触发子、规则、默认、存储过程、用户定义函数、表数据)
②数据库备份和恢复命令
backup database
restore database
倒出的数据文件还可以压缩的,这一点不同于Sybase
而且这种数据库备份和恢复的方式可以是增量的和完全的
③数据库的附加Attach
只要数据库的原始数据和日志文件没有损坏,就可以
命令:SP_ATTACH_DB
这种情况,有时候会出问题:比方说你键了登陆帐号,不是使用缺省的登陆帐号sa,
由于登陆帐号的信息存放在master数据库中,所以你使用原来建立的帐号就登陆不上,
所以要做一些后补工作•Oracle
①倒出倒入工具exp和imp工具
倒入倒出的参数何其多
②冷备份或者称脱机备份,备份的时候数据库是停止的
备份所有的数据文件、日志文件、控制文件
③热备份或者联机备份
数据库处在ARCHIVELOG模式,注意缺省情况下都是ARCHIVELOG
恢复时可以选择完全恢复、时间点恢复、SCN点恢复、用户自由干预的CANCEL恢复
可以说他的热备份的恢复功能是非常之强大的
④RMAN恢复管理器,本人正在研究中,不好乱说
>DB2 获得最高认证级别的ISO标准认证。
请问Oracle和DB2获得的"最高认证级别的ISO标准认证"是什么?>SQL Server 多用户时性能不佳
>Oracle 性能最高, 保持windowsNT下的TPC-D和TPC-C的世界记录。
>DB2 适用于数据仓库和在线事物处理 性能较高。
有具体的数据吗? 高到什么程度?>SQL Server 操作简单,但只有图形界面.
SQL Server也支持命令行,但没有Oracle那么丰富