所有关系型数据库都采用标准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)
关联表更新也是类似的操作。