SQL Server和Oracle的差异

所有关系型数据库都采用标准SQL语法,在使用上非常相似。但是它们毕竟是由不同的公司开发,存在一些差异也是必然的。本文,我将举例说明SQL Server数据库和Oracle数据库之间的差异。

 

1、前N行

SQL Server使用top关键字查询,如下

select top 5 * from emp;

Oracle使用rownum进行查询,如下

select * from emp where rownum <6;

 

2、字符串拼接

SQL Server使用操作符“+”完成字符串拼接,如下

select ename + ’A’ + job from emp;

Oracle使用操作符“||”完成字符串拼接,如下

select ename || ’A’  || job from emp;

 

3、获取系统时间

SQL Server使用函数getdate()获取系统时间,如下

select getdate()

Oracle使用函数sysdate获取系统时间,如下

select sysdate from dual;

 

4、空字符串

SQL Server数据库中‘’和null表示两种不同的结果,而Oracle数据库中‘’等价于null。

 

5、表别名

SQL Server数据库中表、列的别名可以直接空格然后命名,或者使用as关键字命名;而Oracle数据库中别名不能使用as,直接空格后命名。

 

6、null值排序

SQL Server数据库认为null无穷小,Oracle数据库认为null无穷大。所有SQL Server数据库中升序排序,null值的记录在最前面,而Oracle的null值记录在最后面;另Oracle数据库中提供了nulls first 和nulls last 来调整null值的排序,而SQL Server数据库中没有提供相关关键字。

 

7、update引起select阻塞

SQL Server数据库和Oracle数据库中默认隔离级别都是read committed。对同一条记录进行update操作,SQL Server数据库中会引起select的阻塞,而Oracle数据库不会。

 

8、SQL、T-SQL和PL/SQL

SQL是国际公认的关系型数据库的标准语言,几乎所有关系型数据库都采用SQL语言。

T-SQL即Transact-SQL,是SQL在SQL Server上的扩展。T-SQL提供了标准SQL的DDL和DML功能,加上延申的函数、系统预存储过程以及程序设计结构,让程序设计更由弹性。

PL/SQL(Procedural Language/SQL)是一种过程化语言,它是Oracle对SQL的扩展。PL/SQL的基本单位叫做一个区段,由3个部分组成:一个声明部分,一个可运行部分和一个异常处理部分。

 

9、视图定义中出现排序

Oracle数据库中允许在创建视图时按照某列进行排序,而SQL Server数据库中是不允许的,除非配合top一起使用。SQL Server数据库不支持的原因是,视图本身是虚表,排序没有任何意义,要排序也是查询时排序。但是视图查询时的排序是由局限性的,排序字段必须是视图中包含的字段。

另说明一点,如Oracle中视图里面由排序,而查询的时候又加上排序,那会不会排序两次呢?答案是不会。当视图查询中没有指定排序字段时,查询结构按照视图中定义的排序字段进行排序,而当视图查询中指定了排序字段,查询结构按照视图查询定义的排序字段查询,因此不会出现两场排序。

 

10、对视图非键值保存表的更新

对多表关联的视图进行update操作,Oracle数据库比较严格,只能更新键值保存表的列,而SQL Server比较宽松,可以更新非键值保存表对应的列。

 

11、内联视图

有时候,我们需要将一个查询结果作为一个整体供再次查询使用,这种情况下第一次查询结果非常类似要给视图,我们称为内联视图。Oracle数据库中可以直接放到from后进行查询操作,如下

select * from (select * from emp)

而SQL Server数据库中不允许这样,但是可以通过别名处理,如下

select * from (select * from emp) as a

 

12、关联表删除

SQL Server数据库中可以通过关联查询,删除其中一张表中的记录,即多表from删除。如下

delete from emp_bak from emp_bak,emp where emp_bak.empno = emp.empno

而Oracle数据库中是不允许,但是可以exists关键字实现,如下

delete from emp_bak where exists(select * from emp where emp_bak.empno = emp.empno)

关联表更新也是类似的操作。

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值