上一篇 | 下一篇

SQL语法

发布: 2008-7-01 14:16 | 作者: admin | 来源: | 查看: 20次

SQL语法

【字体:小 大】

SQL语法

作者:- 文章来源:- 点击数:4763 更新时间:2006-6-9

$number

比如,看看一个函数 dept 的定义, 如下

CREATE FUNCTION dept(text) RETURNS dept

AS $$ SELECT * FROM dept WHERE name = $1 $$

LANGUAGE SQL;

在函数被调用的时候这里的 $1 将引用第一个函数的参数。

4.2.3. 下标

如果一个表达式生成一个数组类型的数值,那么我们可以通过写下面这样的表达式来声明数组值的元素

expression[subscript]

如果是多个相邻的元素(一个"数组片断")可以用下面的方法抽取

expression[lower_subscript:upper_subscript]

(在这里,方括弧 [ ] 的意思是按照字面文本的方式出现。) 每个subscript自己都是一个表达式,它必须生成一个整数值。

通常,数组 expression 必须用圆括弧包围, 但如果要进行脚标计算的表达式只是一个字段引用或者一个位置参数,那么圆括弧可以省略。 同样,如果源数组是多维的,那么多个脚标可以连接在一起。比如,

mytable.arraycolumn

mytable.two_d_column[17][34]

$1[10:42]

(arrayfunction(a,b))[42]

最后一个例子里的圆括弧是必须的。参阅 Section 8.10 获取有关数组的更多信息。

4.2.4. 字段选择

如果一个表达式生成一个复合类型(行类型),那么用下面的方法可以抽取一个指定的字段

expression.fieldname

通常,行 expression 必须用圆括弧包围, 但是如果要选取的表达式只是一个表引用或者位置参数,可以省略圆括弧。 比如

mytable.mycolumn

$1.somecolumn

(rowfunction(a,b)).col3

(因此,一个全称的字段引用实际上只是一个字段选择语法的特例。)

4.2.5. 操作符调用

操作符调用有三种语法∶

expression operator expression (双目中缀操作符)

operator expression (单目前缀操作符)

expression operator (单目后缀操作符)

这里的 operator 记号遵循语法规则: Section 4.1.3, 或者是记号:AND, OR,和 NOT 之一。 或者是一个被修饰的操作符名

OPERATOR(schema.operatorname)

具体存在哪个操作符以及它们是单目还是双目取决于系统或用户定义了什么操作符。Chapter 9 描述了内置的操作符。

4.2.6. 函数调用

函数调用的语法是合法函数名字(可能有模式名修饰), 后面跟着在圆括弧里的它的参数列表:

function ([expression [, expression ... ]] )

比如,下面的代码计算 2 的平方根:

sqrt(2)

内置函数的列表在 Chapter 9 里。 其它函数可以由用户添加。

4.2.7. 聚集表达式

一个聚集表达式代表一个聚集函数对一个查询选出的行的处理。 一个聚集函数把多个输入缩减为一个输出值, 比如给输入求和或平均。一个聚集表达式的语法是下列之一:

aggregate_name (expression)

aggregate_name (ALL expression)

aggregate_name (DISTINCT expression)

aggregate_name ( * )

这里 aggregate_name 是前面定义的聚集,(可能是全称), 而 expression 是一个本身不包含聚集表达式的任意值表达式。

第一种形式的聚集表达式为所有表达式生成非空值的输入行调用聚集。 (实际上,是否忽略空值由聚集函数决定 ― 但是所有标准的聚集函数都忽略它们。) 第二种形式和第一种一样,因为 ALL 是缺省值。 第三种形式为所有输入行里找到表达式的所有唯一的非空值调用聚集。 最后一种形式为每个输入行(不管是空还是非空)调用一次聚集; 因为没有声明特定的输入值。通常它只是对 count() 聚集函数有用。

比如,count(*) 生成输入行的总数; count(f1) 生成 f1 为非空的输入行数; count(distinct f1) 生成 f1 唯一非空的行数。

预定义的聚集函数在 Section 9.15 里描述。 其它聚集函数可以由用户增加。

一个聚集表达式只能在 SELECT 命令的结果列表或者 HAVING 子句里出现。 禁止在其它子句里出现,比如 WHERE 里面,因为这些子句逻辑上在生成聚集结果之前计算。

如果一个聚集表达式出现在一个子查询里(参阅 Section 4.2.9 和 Section 9.16), 聚集通常是在子查询的行上进行计算。但是如果聚集的参数只包含外层查询的变量则有一个例外: 这个聚集会属于离他最近的外层查询,并且在该查询上进行计算。 该聚集表达式整体上属于它出现的子查询对外层查询的引用,其作用相当于子查询任何一次计算中的一个常量。 这个聚集表达式的有关只能出现在结果列或者 HAVING 子句的限制适用于聚集所属的查询层。

4.2.8. 类型转换

一个类型转换声明一个从一种数据类型到另外一种数据类型的转换。 PostgreSQL 接受两种等效的类型转换语法:

CAST ( expression AS type )

expression::type

CAST 语法遵循 SQL;:: 的语法是 PostgreSQL 传统用法。

如果对一个已知类型的值表达式应用转换,它代表一个运行时类型转换。 只有在定义了合适的类型转换操作的情况下,该转换才能成功。 请注意这一点和用于常量的转换略有区别,如 Section 4.1.2.5 所示。 一个应用于某个未修饰的字串文本的转换表示给一个字串文本数值赋予一个初始化类型, 因此它对于任何类型都会成功(如果字串文本的内容符合该数据类型的输入语法接受。)

如果对于一个值表达式生成的数值对某类型而言不存在混淆的情况, 那么我们可以省略明确的类型转换(比如,在给一个表字段赋值的时候); 在这样的情况下,系统将自动附加一个类型转换。 不过,自动转换只适用于那些系统表中标记着 "OK to apply implicitly" 的转换函数。 其它转换函数必须用明确的转换语法调用。 这些限制是为了避免一些怪异的转换被应用。

字号: | 推荐给好友

评分:0

我来说两句

网络推荐