Chinaunix首页 | 论坛 | 博客
  • 博客访问: 103573428
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-07 22:50:00

 




第二章SQL语法

▓ 内容 

▓ 关键字 

▓ 注释 

▓ 名称 

▓ 常量 

▓ 域和列(字段) 

▓ 操作符 

▓ 表达式 


描述通用的SQL语法。

SQL操作数据集。该语言由多种多样的关键字组成,它允许使用算术和过程表达式。我们将在本章讨论这个问题;随后的章节将包括一些关于数据类型,函数和操作符的细节。 


关键字

SQL92为这门语言定义了有明确意义的关键字,有些关键字是保留字,表明它们只限于出现在某些特定的环境里。其他关键字是非限制字,表明它们在某些特定的环境里有特殊含义,否则没有什么限制。 

Postgres实现了一个扩展了的SQL92和SQL3语言的子集,部分由于Postgres的可扩展性,一些语言元素在Postgres里的实现不象在语言标准里期望的那样严格(限制)。 

关于SQL92和SQL3关键字的信息源自Date and Darwen,1997。 


保留关键字

SQL92和SQL3有一些保留关键字除了在SQL语句里面用做基本元素外不允许用做标识或者任何其它用途。Postgres有另外一些关键字也有类似约束。具体来说,这些关键字不允许用做字段或者表名称,尽管有时候它们可以用做字段标签(例如,在AS子句里)。 

小技巧: 如果用双引号包围(“象这样!”),任何字串都可以声明为标识。这时我们要仔细一些,因为这样做一个标识将是大小写敏感的并且将保有嵌入的空白或其他特殊字符。

下面是Postgres特有的保留关键字,它们既不是SQL92也不是SQL3保留字。这些字允许做为字段标记出现,但不允许用作标识: 





下面是Postgres的保留关键字,同时也是SQL92或SQL3的保留字。这些字允许做为字段标记出现,但不允许用作标识:




下面是Postgres的保留关键字,同时也是SQL92或SQL3的保留字: 





下面的是SQL92的保留字但不是Postgres的保留字,不过如果你把它们做函数名用,就总是会被转换成函数CHAR_LENGTH: 





下面的是SQL92或SQL3的保留字但不是Postgres的保留字,不过如果你把它们用做类型名,就总是会转换成一个可替换的本机类型: 





下面的不是任何类型的关键字,不过如果你在一个类型名的环境中使用它们,它们就会转换成一个Postgres本机类型,而在一个函数名的环境中使用它们,它们会被转换成一个本机函数:





(相应地转换成TIMESTAMP和INTERVAL)。这个特性用于帮助向v7.0转换,将在下一个完全发布版本(估计是 v7.1)删除。 

下面的要么是SQL92要么是SQL3的保留字,但不是Postgres的保留字。这些字在写作本章(v7.0)的时候在Postgres里面没有使用限制,但是未来有可能成为保留字: 


注意: 
这里面有些关键字代表SQL92里的函数。这些函数在Postgres里面有定义。但是分析器不认为(函数)名字是关键字,因而它们可以用在其他环境里。





非保留关键字

SQL92和SQL3有一些非保留关键字,它们在语言里有受约束的含义但是允许被当作标识使用。Postgres有另外一些关键字允许类似的非限制性使用。具体来说,这些关键字允许当做字段或者表名来用。 

下面是Postgres非保留关键字,它们既不是SQL92也不是SQL3的非保留关键字:





下面是Postgres的非保留关键字,但却是SQL92或SQL3的保留关键字:





下面的是Postgres的非保留关键字,同时也是SQL92或SQL3的非保留关键字: 

COMMITTED SERIALIZABLE TYPE

下面的要么是SQL92要么是SQL3的非保留关键字,但不是任何类型的Postgres的保留字: 








名称

SQL里面的名称必须以一个字母(a-z)或者下划线( _ )开头。名称里随后的字符可以是字母,数字(0-9),或者下划线。系统使用不超过NAMEDATALEN-1字符长的名称;更长的名称可以在查询里面写,但是它们会被截断。缺省时,NAMEDATALEN为32,因此最大的名称长度是31(但是在制作系统时,可以通过修改src/include/postgres_ext.h里的 NAMEDATALEN来改变它)。 

包含其他字符的名称可以通过用双引号(")包围来形成。例如,如果用双引号包围,一个表或者列的名称可以包含一些不用双引号包围时非法的字符,如空格,与号(&)等。把名称用双引号包围起来同样也令它大小写敏感,而没有用双引号包围的总是折为小写。例如,名称FOO,foo和"foo"被Postgres认为是一样的,但是"Foo"是一个不同的名称。 

双引号还可以用于保护那些不用双引号包围起来会被认为是一个SQL关键字的名称。例如 IN是一个关键字,而"IN"是一个名称。 




常量

在postgres里使用三种隐含常量:strings(字符串),integers(整数)和floating point numbers(浮点数)。常量也可以被声明为显式的类型,这样可以获得更精确的表示和更有效的后端处理。我们在下面讨论隐含常量;显式常量以后讨论。 



字符串常量

SQL里的Strings(字符串)是用单引号(“ ´”,例如,这´是一个字符串´)包围的任意 ASCII 字符序列。SQL92允许通过键入两个相邻的单引号的方法在字符串中嵌入单引号(如:´Dianne´´s horse´)。在Postgres里,单引号可以通过用反斜杠("")转意的方法来嵌入(如:´Dianne´s horse´)。要在一个字符串常量里包含一个反斜杠,键入两个反斜杠。不可打印的字符也可以用前置反斜杠的方法嵌入字符串(如:´ ab´)。 


Integer(整数)常量

SQL里的Integer(整数)常量是一个没有小数点的ASCII数字集合。合法的数值范围从-2147483648到+2147483647。这个范围会因操作系统和主机(硬件)的不同而异。 

注意更大的整数可以用SQL92字符串符号或Postgres类型符号声明为int8:



Floating Point(浮点数)常量
Floating point(浮点数)常量包含一个整数部分,一个小数点和下面格式表示的一个小
数部分或者科学记数法: 



这里dig是一或者更多小数位。如果你使用这个选项,你必须在句点和[+-]后面包括至少一个dig。一个没有尾数的指数会被认为有一个为1的尾数。在字符串里可能没有嵌入其他额外的字符。 

Floating point(浮点数)常量类型是float8。float4可以用SQL92字符串表示法或者Postgres类型表示法显式地声明: 




Postgres 用户定义类型的常量

任意类型的常量可以用下面任何一种表示法输入: 



字符串里的数值被传递给类型type的输入转换过程。结果就是指明类型的常量。如果对于该常量而言,其类型只有一种而没有语意含混的情况,那么显式的类型转换可以省略,这时类型转换是自动强制进行的。 


数组常量

数组常量是任意Postgres类型的数组,包括其他数组,字符串常量等。一个数组常量的通用格式如下:



这里delim是在pg_type表里该类型的分隔符。(对于内建类型,这就是逗号字符(","))。一个数组常量的例子是



这个常量是一个二维的,3乘3的,由三个整数的子数组组成的。 

独立的数组元素在可能的情况下可以并且也应该放在引号之间,这样与用空白间隔比起来可以避免语意含混的问题。 





域和列(字段)



一个域要么是给定表的一个属性,要么是下面之一: 

oid 

表示一个记录的唯一标识,它是由Postgres自动给所有记录附加的。Oid是不可重用的32位长的数字。 

xmin 

正在插入的事务的标识。 

xmax 

正在删除的事务的标识。 
cmin 

事务内部的命令标识。 
cmax 

正在删除的事务标识。 

关于这些域的更详细信息请参考Stonebraker,Hanson,Hong,1987。在系统内部,时间是以abstime数据类型的记录表示的。事务和命令标识是32位数。事务是从512开始顺序赋值的。 




列(字段)是下面形式的构造:




instance标识一个特定的表,并且可以认为代表该表的实例。一个实例变量要么是一个表的名称,要么是一个用FROM子句定义的表的替身或者关键字NEW或CURRENT。NEW和 CURRENT只能出现在一个规则的动作部分,而其他实例变量可以在任何SQL语句中使用。composite_field是Postgres复合类型之一的一个域,而有效的复合域由表中的字段组成,这些字段正是复合域要计算的。最后,field是上面提到的表中的一个一般的(基本类型)字段。如果field是数组类型,那么可选的number指示器指明数组中指定的元素。如果没有指明 number,那么返回所有数组元素。 





操作符

任何内建的系统或者用户定义操作符都可能在 SQL 里使用。参考 操作符 获取内建的和系统操作符列表。对于用户定义操作符,请询问你的系统管理员或对 pg_operator 表运行查询。圆括号可以在表达式中用于任意操作符的分组。 





表达式

SQL92允许用表达式在表达式里转换数据。表达式可以包含操作符(参阅操作符获取更多信息)和函数(函数节有更多信息)。 
一个表达式是下表中的一种: 




参数 

函数表达 

聚集表达 

我们已经讨论了常量和字段。三种操作符表达式分别表示双目(中缀),右目(后缀)和左目(前缀)操作符。下面章节讨论剩下的选项。 

参数

一个参数用于表示一个SQL函数里面的一个参数。它的典型应用是在SQL函数定义语句里。参数的形式如下: 




函数表达式

一个函数表达式是一个合法SQL函数的名称,后面跟着它的用圆括号包围的参数列表:




例如,下面的语句计算一个雇员的薪水的平方根:
 
sqrt(emp.salary)


聚集表达式

一个聚集表达式提供给应用对由一个查询选出来的多个行的聚集功能。一个聚集函数把多个输入缩减为单个输出值,比如对输入的求和或平均。一个聚集表达式的语法是下面形式之一: 



这里aggregate_name是一个预先定义的聚集,并且expression是任意自身不包含聚集表达式的表达式。 

第一种形式的聚集表达式激活对所有给出的表达式生成的输入行进行聚集计算,生成一个非空值。第二种形式与第一种相同,因为ALL是缺省值。第三种形式激活对所有输入行中相异的非空值的聚集计算。最后一种形式激活对每个输入行的单次聚集计算,不管该行是空还是非空值;因为没有声明特定的输入值,这种形式通常只是对count( ) 聚集有用。 

例如,count(*)生成所有输入行的总行数;count(f1)生成f1非空的输入行的总行数;count(distinct f1)生成非空的f1的不重复的总行数。 


目标列表

一个目标列表是一个或多个插入括号的用逗号分隔的元素列表,每个都必须有下面形式:




这里result_attname是要创建的字段名(或者在更新语句里的一个已经存在的字段名。)如果result_attname不存在,那么a_expr必须只包含一个字段名,这时它被假定为结果域的名称。在Postgres里,只有a_expr是一个字段时才使用缺省命名。 


资格条件

一个资格条件包含任何数目的由下面逻辑操作符连结的子句: 
   
NOT 
AND 
OR 

一个子句是一个对一套实例计算生成一个boolean的a_expr。 


From列表

from列表是一个逗号分隔的from表达式的列表。每个"from表达式"是下面形式: 




"from 表达式"定义一个或多个实例变量以圈定 class_reference 里指明的表的范围。我们同样还可以用后跟星号("*")限定符的方法要求实例变量的范围包括在继承级中低于指定表的所有表。 



出处:南方Linux
阅读(1174) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~