本文将介绍PostgreSQL中使用的几个SQL语法。
标识符和关键词
SQL标识符和关键词必须以一个字母(a-z,也可以是带变音符的字母和非拉丁字母)或一个下划线(_)开始。后续字符可以是字母、下划线(_)、数字(0-9)或美元符号($)。注意根据SQL标准的字母规定,美元符号是不允许出现在标识符中的,因此它们的使用可能会降低应用的可移植性。
系统中一个标识符的长度不能超过 NAMEDATALEN-1 字节,在命令中可以写超过此长度的标识符,但是它们会被截断。默认情况下,NAMEDATALEN 的值为64,因此标识符的长度上限为63字节。
常量
在PostgreSQL中有三种隐式类型常量:字符串、位串和数字。
为了在一个字符串中包括一个单引号,可以写两个相连的单引号。需要注意的是这和使用一个双引号(")是不同的。
一个转义字符串常量可以通过在单引号前面写一个字母E(大写或小写形式)来指定,例如E'foo'。
操作符
一个操作符名中的字符来自下面的列表:
+ - * / < > = ~ ! @ # % ^ & | ` ?
不过,在操作符名上有一些限制:
1)-- 和 /*不能在一个操作符名的任何地方出现,因为它们将被作为一段注释的开始。
2)一个多字符操作符名不能以+或-结尾,除非该名称也至少包含这些字符中的一个:
~ ! @ # % ^ & | ` ?
例如,#-是一个被允许的操作符名,但*-不是。
特殊字符
1) 跟随在一个美元符号($)后面的数字被用来表示在一个函数定义或一个预备语句中的位置参数。在其他上下文中该美元符号可以作为一个标识符或者一个美元引用字符串常量的一部分。
2) 圆括号(())用来分组表达式并且强制优先。
3) 方括号([])被用来选择一个数组中的元素。
4) 逗号(,)被用在某些语法结构中来分割一个列表的元素。
5) 分号(;)结束一个 SQL 命令。它不能出现在一个命令中间的任何位置,除了在一个字符串常量中或者一个被引用的标识符中。
6) 冒号(:)被用来从数组中选择“切片”。
7) 星号(*)被用在某些上下文中标记一个表的所有域或者组合值。当它被用作一个聚合函数的参数时,该聚合不要求任何显式参数。
8) 句点(.)被用在数字常量中,并且被用来分割模式、表和列名。
标量子查询
一个标量子查询是一种圆括号内的普通SELECT查询,它刚好返回一行一列。将一个返回超过一行或一列的查询作为一个标量子查询使用是一种错误(但是如果在一次特定执行期间该子查询没有返回行则不是错误,该标量结果被当做为空)。
数组构造器
一个数组构造器是一个能构建一个数组值并且将值用于它的成员元素的表达式。例如:
postgres=# select array[12,63,99+1];
array
-------------
{12,63,100}
(1 row)
多维数组值可以通过嵌套数组构造器来构建。在内层的构造器中,关键词ARRAY可以被忽略。例如,这些语句产生相同的结果:
postgres=# select array[array[12,23],array[7,1]];
array
-----------------
{{12,23},{7,1}}
(1 row)
postgres=# select array[[12,23],[7,1]];
array
-----------------
{{12,23},{7,1}}
(1 row)
用ARRAY构建的一个数组值的下标总是从1开始。
行构造器
一个行构造器是能够构建一个行值(也称作一个组合类型)并用值作为其成员域的表达式。例如:
postgres=# select row(2,3.7,'postgres test.');
row
--------------------------
(2,3.7,"postgres test.")
(1 row)
当在列表中有超过一个表达式时,关键词ROW是可选的。
postgres=# select (2);
?column?
----------
2
(1 row)
postgres=# select row(2);
row
-----
(2)
(1 row)
postgres=# select (2,3.5);
row
---------
(2,3.5)
(1 row)
调用函数
PostgreSQL允许带有命名参数的函数被使用位置或命名记号法调用。命名记号法对于有大量参数的函数特别有用,因为它让参数和实际参数之间的关联更明显和可靠。在位置记号法中,书写一个函数调用时,其参数值要按照它们在函数声明中被定义的顺序书写。在命名记号法中,参数根据名称匹配函数参数,并且可以以任何顺序书写。
在任意一种记号法中,在函数声明中给出了默认值的参数根本不需要在调用中写出。但是这在命名记号法中特别有用,因为任何参数的组合都可以被忽略。而在位置记号法中参数只能从右往左忽略。
PostgreSQL也支持混合记号法,它组合了位置和命名记号法。在这种情况中,位置参数被首先写出并且命名参数出现在其后。
By kalath