主流数据库系统支持的SQL语句的差异主要有以下几点:数据类型的差异;运算符的差异;函数的差 异;常用SQL的差异;取元数据信息的差异。
1.1.1数据类型的差异
整数类型:在MYSQL中 整数相关的类型有tinyint、smallint、mediumint、int、integer和bigint;在MSSQLServer中整数相关 的类型有bit、int、smallint、tinyint和bigint;在Oracle中整数相关的类型有number;在DB2中整数 相关的类型有smallint、integer和bigint。
数值类型:在MYSQL中数值相关的类型有float、 double、real、decimal和numeric;在MSSQLServer中数值相关的类型有decimal、numeric、money、 smallmoney、float和real;在Oracle中数值相关的类型有number;在DB2中数值相关的类型有decimal、 numeric、real和double。
字符类型:在MYSQL中字符相关的类型有char、varchar、tinytext、 text、mediumtext、longtext、enum和set;在MSSQLServer中字符相关的类型有char、varchar、text、 nchar、nvarchar和ntext;在Oracle中字符相关的类型有char、varchar2、nvarchar2、clob和nclob; 在DB2中字符相关的类型有CHARACTER、VARCHAR、LONG VARCHAR、CLOB、GRAPHIC、VARGRAPHIC和 LONGVARGRAPHIC。
日期时间类型:在MYSQL中日期时间相关的类型有date、time、datetime、 timestamp和year;在MSSQLServer中日期时间相关的类型有datetime、smalldatetime和timestamp;在 Oracle中日期时间相关的类型有date和timestamp;在DB2中日期时间相
关的类型有DATE、TIME和 TIMESTAMP。
二进制类型:MYSQL、Oracle和DB2都支持Blob类型,而在MSSQLServer中支持image 类型。
1.1.2运算符的差异
在不同的数据库系统中字符串拼接的方式是不同的,下面的主 流数据库系统对字符串拼接的支持:
MYSQL:在MYSQL中进行字符串的拼接要使用CONCAT函数, CONCAT函数支持一个或者多个参数,比如CONCAT('Hello',1,'World');MYSQL中还提 供了另外一个进行字符串拼接的函数CONCAT_WS,CONCAT_WS可以在待拼接的字符串之间加入指定的分
隔符,比如CONCAT_WS ('Hello',1,'World')。
MSSQLServer: MSSQLServer中可以直接使用加号“+”来拼接字符串,比如'Hello'+'World'。
Oracle:Oracle中使用“||”进行字符串拼接,比如'Hello'||'World';除了 “||”,Oracle还支持使用CONCAT()函数进行字符串拼接,不过与MYSQL的CONCAT()函数不同,Oracle的 CONCAT()函数只支持两个参数,不支持两个以上字符串的拼接。
DB2:DB2中使用“||”进行字符 串拼接,比如'Hello'||'World'。
1.1.3函数的差异
不同数据库系统对 函数的差异是非常大的,不仅同样功能的函数在不同数据库系统中的名称不同,而且一些高级的函数也 并不是在所有数据库系统中都有提供支持。比如将一个字符串转换为小写的函数在MYSQL,MSSQLServer和 Oracle中为LOWER,而在DB2中则为LCASE;MYSQL中支持IF函数,而在其他数据库系统中则只有通过变通 方式才能实现。
1.1.4常用SQL的差异
主流数据库系统对SELECT、UPDATE、DELETE、 CREATE、DROP等基本语法的支持是相同,不过在一些高级特性支持方面仍然有差异。
1.1.4.1限 制结果集行数
在实现分页检索、排行榜等功能的时候,需要限制检索的结果集行数,不同的数据 库系统对此的支持是不同的。
MYSQL中提供了LIMIT关键字用来限制返回的结果集,比如:
SELECT * FROM T_Employee
ORDERBY FSalary DESC LIMIT 2,5
MSSQLServer: MSSQLServer中提供了TOP关键字用来返回结果集中的前N条记录,比如:
select top 5 *from T_Employee
order by FSalaryDesc;
在MSSQLServer2005中还可以使用窗口函数 ROW_NUMBER()实现限制结果集行数,比如:
SELECTROW_NUMBER() OVER(ORDER BY FSalary), FNumber,
FName,FSalary,FAge
FROM T_Employee