区别于一个表表达式(是一个表)的结果,一个值表达式的结果有时候被称为一个标量
列引用
correlation.columnname
correlation是一个表(有可能以一个模式名限定)的名字,或者是在FROM子句中为一个表定义的别名
位置参数
$number
一个位置参数引用被用来指示一个由 SQL 语句外部提供的值。参数被用于 SQL 函数定义和预备查询中。
下标
抽取数组值
mytable.arraycolumn[4]
mytable.two_d_column[17][34]
$1[10:42]
(arrayfunction(a,b))[42]
域选择
如果一个表达式得到一个组合类型(行类型)的值,那么可以抽取该行的指定域
expression.fieldname
操作符调用
函数调用
聚合表达式
1. 由一个查询选择的行上应用一个聚合函数。一个聚合函数将多个输入减少到一个单一输出值
2. 一个聚合表达式只能出现在SELECT命令的结果列表或是HAVING子句中。
3. 当一个聚合表达式出现在一个子查询中(见第 4.2.11 节和第 9.22 节),聚合通常在该子查询的行上被计算。但是如果该聚合的参数(以及filter_clause,如果有)只包含外层变量则会产生一个异常:该聚合则属于最近的那个外层,并且会在那个查询的行上被计算。该聚合表达式从整体上则是对其所出现于的子查询的一种外层引用,并且在那个子查询的任意一次计算中都作为一个常量。只出现在结果列表或HAVING子句的限制适用于该聚合所属的查询层次。
窗口函数调用
1. 一个窗口函数调用表示在一个查询选择的行的某个部分上应用一个聚合类的函数
2.在查询输出中每一个行仍保持独立
3.PARTITION BY子句将查询的行分组成为分区,窗口函数会独立地处理它们
4.只有在SELECT列表和查询的ORDER BY子句中才允许窗口函数调用
类型转换
指定从一种数据类型到另一种数据类型的转换
CAST (expression AS type) ——SQL
expression::type ——PostgreSQL
排序规则表达式
重载一个表达式的排序规则。它被追加到它适用的表达式
expr COLLATE collation
ollation可能是一个受模式限定的标识符
标量子查询
一种圆括号内的普通SELECT查询,它刚好返回一行一列
数组构造器
用ARRAY构建的一个数组值的下标总是从1开始
能构建一个数组值并且将值用于它的成员元素的表达式
SELECT ARRAY[1,2,3+4]
多维数组值可以通过嵌套数组构造器来构建。在内层的构造器中,关键词ARRAY可以被忽略
多维数组必须是矩形的,处于同一层次的内层构造器必须产生相同维度的子数组
SELECT ARRAY[ARRAY[1,2], ARRAY[3,4]];
SELECT ARRAY[[1,2],[3,4]];
可以构造一个空数组,但是因为无法得到一个无类型的数组,所以必须显式类型
SELECT ARRAY[]::integer[];
从一个子查询的结果构建一个数组。在这种形式中,数组构造器被写为关键词ARRAY后跟着一个加了圆括号(不是方括号)的子查询
SELECT ARRAY(SELECT oid FROM pg_proc WHERE proname LIKE 'bytea%');
行构造器
一个行构造器是能够构建一个行值(也称作一个组合类型)并用值作为其成员域的表达式
SELECT ROW(1,2.5,'this is a test');
默认情况下,由一个ROW表达式创建的值是一种匿名记录类型。如果必要,它可以被造型为一种命名的组合类型 — 或者是一个表的行类型,或者是一种用CREATE TYPE AS创建的组合类型
CREATE TABLE mytable(f1 int, f2 float, f3 text);
CREATE FUNCTION getf1(mytable) RETURNS int AS 'SELECT $1.f1' LANGUAGE SQL;
SELECT getf1(ROW(1,2.5,'this is a test')::mytable);
行构造器可以被用来构建存储在一个组合类型表列中的组合值,或者被传递给一个接受组合参数的函数。还有,可以比较两个行值,或者用IS NULL或IS NOT NULL测试一个行
表达式计算规则
一个操作符或函数的输入不必按照从左至右或其他任何固定顺序进行计算
当有必要强制计算顺序时,可以使用一个CASE结构。例如,在一个WHERE子句中使用下面的方法尝试避免除零是不可靠的:
SELECT ... WHERE x > 0 AND y/x > 1.5;
但是这是安全的,一个限制是, 它无法阻止常量子表达式的提早计算
SELECT ... WHERE CASE WHEN x > 0 THEN y/x > 1.5 ELSE false END;
在PL/pgSQL函数 中,使用一个IF-THEN-ELSE语句来 保护一种有风险的计算比把它嵌在一个CASE表达式中要安全得多