第三节 JET-SQL与ANSI-SQL的区别
一、ANSI SQL的基本内容
ANSI SQL是美国国家标准学会(ANSI)对SQL进行规范化后的标准化SQL语言,1987年,ISO把ANSI SQL作为国际标准,这个标准在1992年进行了修订,即SQL-92,1999年两次修订即SQL-99,目前最新的是SQL-2003。ANSI-SQL由多个相关的文档组成,以后可能还会增加其他文档,以扩展标准来适应新出现的技术。
ANSI-SQL包含了以下内容:
1、SQL结构,指定实现一致性的一般性需求,定义SQL基本概念。
2、SQL基础,定义SQL的原发和操作。
3、SQL/调用级接口,定义程序编程与SQL的接口。
4、SQL持久存储模块,定义控制结构,进而定义SQL例程,还定义了包含SQL例程的模块。
5、SQL主机语言绑定,定义SQL的扩展,用户通过使用数据包裹支持外部数据管理,还定义了数据链类型。
6、对象语言绑定,定义SQL的扩展,支持把SQL语句内嵌到编程语言程序。
7、信息和定义方案,定义信息方案和定义方案的规范,提供与SQL数据相关的结构和安全信息。
二、JET SQL与ANSI SQL的主要区别
MS JET数据库引擎的SQL通常属于ANSI-89层级一,随着MS
JET 4.X版的发行,增加了对ANSI-92 SQL标准的支持,使用了更多的ANSI-92 SQL的语法。然而,ANSI SQL的某些功能在MS JET SQL中没有实现,相反地,在ANSI SQL中也不支持MS JET SQL所包含的某些保留字和性能。
二者主要差异表现在:
1、MS Access SQL和ANSI SQL各自都有不同的保留字和数据类型。如果使用Microsoft OLE DB Provider,还有另外一些保留字。
2、应用于Between...And构造的规则不同,该构造有以下语法:
expr1 [NOT]
Between value1 And value2
在MS Access SQL中,value1可以大于value2;在ANSI
SQL中,value1必须等于或小于value2。
3、MS Access SQL同时支持ANSI SQL通配符和MS Access特有的通配符与Like运算符一起使用。ANSI和MS Access通配符的使用是相互排斥的。必须使用这二者中的某一个,不能将它们混合使用。只有在使用MS Access数据库引擎和MS Access 2007 OLE DB
Provider时,才能使用ANSI SQL通配符。如果尝试通过Access 2007或DAO来使用ANSI
SQL通配符,则它们将被解释为文字。
匹配字符
|
MS Access SQL
|
ANSI SQL
|
任意单字符
|
?
|
_(下划线)
|
零个或多个字符
|
*
|
%
|
4、MS Access SQL的限制通常较少。例如,它允许对表达式进行分组和排序。
5、MS Access SQL支持功能更强大的表达式。
MS Access SQL提供以下增强功能:TRANSFORM语句,该语句提供对交叉表查询的支持;其他SQL聚合函数,例如StDev和VarP;用于定义参数查询的PARAMETERS声明。
MS Access SQL不支持以下ANSI SQL功能:
DISTINCT聚合函数引用。例如,MS Access SQL不支持SUM(DISTINCT columnname)。
LIMIT TO nn ROWS子句(用来限制查询所返回的行数)。只能使用 Where 子句来限制查询的范围。
三、TSQL与ANSI SQL的据类型比较
下表列出了ANSI SQL数据类型、与它们等效的MS Access数据库引擎SQL数据类型及其有效同义词。
ANSI SQL数据类型
|
MS Access SQL数据类型
|
同义词
|
BIT、BIT VARYING
|
BINARY
|
VARBINARY、BINARY
VARYING BIT VARYING
|
不支持
|
BIT
|
BOOLEAN、LOGICAL、LOGICAL1、YESNO
|
不支持
|
TINYINT
|
INTEGER1、BYTE
|
不支持
|
COUNTER
|
AUTOINCREMENT
|
不支持
|
MONEY
|
CURRENCY
|
DATE、TIME、TIMESTAMP
|
DATETIME
|
DATE、TIME
|
不支持
|
UNIQUEIDENTIFIER
|
GUID
|
DECIMAL
|
DECIMAL
|
NUMERIC、DEC
|
REAL
|
REAL
|
SINGLE、FLOAT4、IEEESINGLE
|
DOUBLE PRECISION、FLOAT
|
FLOAT
|
DOUBLE、FLOAT8、IEEEDOUBLE、NUMBER
|
SMALLINT
|
SMALLINT
|
SHORT、INTEGER2
|
INTEGER
|
INTEGER
|
LONG、INT、INTEGER4
|
INTERVAL
|
不支持
|
|
不支持
|
IMAGE
|
LONGBINARY、GENERAL、OLEOBJECT
|
不支持
|
TEXT
|
LONGTEXT、LONGCHAR、MEMO、NOTE、NTEXT
|
CHARACTER、CHARACTER
VARYING、NATIONAL CHARACTER、NATIONAL
CHARACTER VARYING
|
CHAR
|
TEXT(n)、ALPHANUMERIC、CHARACTER、STRING、VARCHAR、CHARACTER VARYING、NCHAR、NATIONAL CHARACTER、NATIONAL CHAR、NATIONAL CHARACTER VARYING、NATIONAL CHAR
VARYING
|
几点说明:
ANSI SQL BIT数据类型不对应于MS Access SQL BIT数据类型,而是对应于BINARY数据类型。MS Access SQL BIT数据类型没有等效的ANSI SQL数据类型。
不再支持TIMESTAMP作为DATETIME的同义词。
不再支持NUMERIC作为FLOAT或DOUBLE的同义词。NUMERIC现在用作DECIMAL的同义词。
LONGTEXT字段始终以Unicode表示形式存储。
如果在未指定可选长度的情况下使用数据类型名称TEXT,则创建LONGTEXT字段。这样,编写的Create TABLE语句将生成与MS SQL Server一致的数据类型。
CHAR字段始终以Unicode表示形式存储,这种表示形式等效于ANSI SQL NATIONAL
CHAR数据类型。
如果使用数据类型名称TEXT并指定了可选长度,例如TEXT(25),则字段的数据类型等效于CHAR数据类型。这样,可保持大多数MS Access应用程序的向后兼容性,同时使TEXT数据类型(未指定长度)与 MS SQL Server一致。