云栖社区Java、Redis、MongoDB运营小编,有意合作请联系钉钉:15810436147
11.1. 简介 假设我们有一个如下的表: CREATE TABLE test1 ( id integer, content varchar ); 而应用发出很多以下形式的查询: SELECT content FROM test1 WHERE id = constant; 在没有事前准备的情况下,系统不得不扫描整个test1表,一行一行地去找到所有匹配的项。
第 10 章 类型转换 目录 10.1. 概述 10.2. 操作符 10.3. 函数 10.4. 值存储 10.5. UNION、CASE和相关结构 10.6. SELECT 输出列 SQL语句可能(有意无意地)要求在同一表达式里混合不同的数据类型。
10.6. SELECT 输出列 前面几节中给出的规则将导致为SQL查询中的所有表达式分配非unknown数据类型, 除非未指定类型文字显示为SELECT命令的简单输出列。例如,在 SELECT 'Hello World'; 没有什么可以确定字符串文字应被视为什么类型。
10.5. UNION、CASE和相关结构 SQL UNION结构必须使可能不相似的类型匹配成为一个单一的结果集。该决定算法被独立地应用到一个联合查询的每个输出列。 INTERSECT和EXCEPT采用和UNION相同的方法来决定不相似的类型。
10.4. 值存储 将被插入到一个表的值会按照下列步骤被转换到目标列的数据类型。 值存储类型转换 检查一个与目标的准确匹配。 否则,尝试转换表达式为目标类型。如果在两种类型之间的一个 赋值造型已经被注册在pg_cast 目录(见CREATE CAST)中, 这是可能的。
10.3. 函数 被一个函数调用引用的特定函数使用下面的过程来决定。 函数类型决定 从pg_proc系统目录中选择要被考虑的函数。 如果使用一个非模式限定的函数名称,那么函数被认为是那些在当前搜索路径中可见并有匹配的名字和参数个数的函数(参见第 5.8.3 节)。
10.2. 操作符 被一个操作符表达式引用的特定操作符由下列过程决定。注意这个过程会被所涉及的操作符的优先级间接地影响,因为这将决定哪些子表达式被用作哪个操作符的输入。详见第 4.1.6 节。 操作符类型决定 从系统目录pg_operator中选出要考虑的操作符。
10.1. 概述 SQL是一种强类型语言。也就是说,每个数据项都有一个相关的数据类型,数据类型决定其行为和允许的用法。 PostgreSQL有一个可扩展的类型系统,该系统比其它SQL实现更具通用和灵活。
第 9 章 函数和操作符 目录 9.1. 逻辑操作符 9.2. 比较操作符 9.3. 数学函数和操作符 9.4. 字符串函数和操作符 9.4.1. format 9.5. 二进制串函数和操作符 9.
9.28. 事件触发器函数 9.28.1. 捕获命令结尾的改变 9.28.2. 通过DDL命令删除处理的对象 9.28.3. 处理表重写事件 PostgreSQL提供这些帮助函数用以从事件触发器中检索信息。
9.27. 触发器函数 当前PostgreSQL提供一个内建的触发器函数suppress_redundant_updates_trigger, 它将阻止任何不会实际更改行中数据的更新发生,这与正常的行为不管数据是否改变始终执行更新相反(这是正常的行为,使得更新运行速度更快,因为不需要检查,并在某些情况下也是有用的)。
9.26. 系统管理函数 9.26.1. 配置设定函数 9.26.2. 服务器信号函数 9.26.3. 备份控制函数 9.26.4. 恢复控制函数 9.26.5. 快照同步函数 9.26.6. Replication Functions 9.26.7. 数据库对象管理函数 9.26.8. 索引维护函数 9.26.9. 通用文件访问函数 9.26.10. 咨询锁函数 这一节描述的函数被用来控制和监视一个PostgreSQL安装。
9.25. 系统信息函数 表 9.60展示了多个可以抽取会话和系统信息的函数。 除了本节列出的函数,还有一些与统计系统相关的函数也提供系统信息。详见第 28.2.2 节。 表 9.60.
9.24. 集合返回函数 本节描述那些可能返回多于一行的函数。目前这个类中被使用最广泛的是级数生成函数, 如表 9.58和表 9.59所述。其他更特殊的集合返回函数在本手册的其他地方描述。 组合多集合返回函数的方法可见第 7.2.1.4 节。
9.23. 行和数组比较 9.23.1. IN 9.23.2. NOT IN 9.23.3. ANY/SOME (array) 9.23.4. ALL (array) 9.23.5. 行构造器比较 9.23.6. 组合类型比较 本节描述几个特殊的结构,用于在值的组之间进行多重比较。
9.22. 子查询表达式 9.22.1. EXISTS 9.22.2. IN 9.22.3. NOT IN 9.22.4. ANY/SOME 9.22.5. ALL 9.22.6. 单一行比较 本节描述PostgreSQL中可用的SQL兼容的子查询表达式。
9.21. 窗口函数 窗口函数提供在与当前查询行相关的行集合上执行计算的能力。有关这个特性的介绍请见第 3.5 节。 语法细节则请见第 4.2.8 节。 表 9.57列出了内建的窗口函数。注意必须使用窗口函数的语法调用这些函数,也就是,一个OVER子句是必需的。
9.20. 聚集函数 聚集函数从一个输入值的集合计算一个单一结果。内建的通用聚集函数被列在表 9.52中,统计信息聚合函数列在表 9.53中。内建的组内顺序集聚集函数被列在表 9.54中, 而内置的组内假设集函数列在表 9.55中。
9.19. 范围函数和操作符 范围类型的概述请见第 8.17 节。 表 9.50展示了范围类型可用的操作符。 表 9.50. 范围操作符 操作符 描述 例子 结果 = 等于 int4range(1,5) = '[1,4]'::int4range t <> 不等于 numrange(1.
9.18. 数组函数和操作符 表 9.48显示了可以用于数组类型的操作符。 表 9.48. 数组操作符 操作符 描述 例子 结果 = 等于 ARRAY[1.1,2.1,3.
9.17. 条件表达式 9.17.1. CASE 9.17.2. COALESCE 9.17.3. NULLIF 9.17.4. GREATEST和LEAST 本节描述在PostgreSQL中可用的SQL兼容的条件表达式。
9.16. 序列操作函数 本节描述用于操作序列对象的函数,序列对象也被称为序列生成器或者就是序列。序列对象都是用CREATE SEQUENCE创建的特殊的单行表。序列对象通常用于为表的行生成唯一的标识符。
9.15. JSON 函数和操作符 表 9.43展示了可以用于两种 JSON 数据类型(见第 8.14 节)的操作符。 表 9.43. json和jsonb 操作符 操作符 右操作数类型 描述 例子 例子结果 -> int 获得 JSON 数组元素(索引从 0 开始,负整数结束) '[{.
9.14. XML 函数 9.14.1. 产生 XML 内容 9.14.2. XML 谓词 9.14.3. 处理 XML 9.14.4. 将表映射到 XML 本节中描述的函数以及类函数的表达式都在类型xml的值上操作。
9.13. 文本搜索函数和操作符 表 9.40、 表 9.41和 表 9.42总结了为全文搜索提供的函数和操作符。PostgreSQL的文本搜索功能的详细解释可参考第 12 章。 表 9.40.
9.12. 网络地址函数和操作符 表 9.36展示了可以用于cidr和 inet类型的操作符。 操作符<<、<<=、 >>、>>=和 &&测试用于子网包含。它们只考虑两个地址的网 络部分(忽略任何主机部分),然后判断其中一个网络部分是等于另外一个或者是 另外一个的子网。
9.11. 几何函数和操作符 几何类型point、box、 lseg、line、path、 polygon和circle有一大堆本地支持函数和操作符,如表 9.33、表 9.34和表 9.35中所示。
9.10. 枚举支持函数 对于枚举类型(在第 8.7 节中描述), 有一些函数允许更清洁的编码,而不需要为一个枚举类型硬写特定的值。它们被列在表 9.32中。本例假定一个枚举类型被创建为: CREATE TYPE rainbow AS ENUM ('red', 'orange', 'yellow', 'green', 'blue', 'purple'); 表 9.
9.9. 时间/日期函数和操作符 9.9.1. EXTRACT, date_part 9.9.2. date_trunc 9.9.3. AT TIME ZONE 9.9.4. 当前日期/时间 9.9.5. 延时执行 表 9.30展示了可用于处理日期/时间值的函数,其细节在随后的小节中描述。
9.8. 数据类型格式化函数 PostgreSQL格式化函数提供一套强大的工具用于把各种数据类型 (日期/时间、整数、浮点、数字) 转换成格式化的字符串以及反过来从格式化的字符串转换成 指定的数据类型。
9.7. 模式匹配 9.7.1. LIKE 9.7.2. SIMILAR TO正则表达式 9.7.3. POSIX正则表达式 PostgreSQL提供了三种独立的实现模式匹配的方法:SQL LIKE操作符、更近一些的SIMILAR TO操作符(SQL:1999 里添加进来的)和POSIX-风格的正则表达式。
9.6. 位串函数和操作符 本节描述用于检查和操作位串的函数和操作符,也就是操作类型为bit和bit varying的值的函数和操作符。除了常用的比较操作符之外,还可以使用表 9.13里显示的操作符。
9.5. 二进制串函数和操作符 本节描述那些检查和操作类型为bytea的值的函数和操作符。 SQL定义了一些使用关键字而不是逗号来分割参数的串函数。详情请见表 9.11。PostgreSQL也提供了这些函数使用常规函数调用语法的版本(参阅表 9.12)。
9.4. 字符串函数和操作符 9.4.1. format 本节描述了用于检查和操作字符串值的函数和操作符。在这个环境中的串包括所有类型character、character varying和text的值。
9.3. 数学函数和操作符 PostgreSQL为很多类型提供了数学操作符。对于那些没有标准数学表达的类型(如日期/时间类型),我们将在后续小节中描述实际的行为。 表 9.4展示了所有可用的数学操作符。
9.2. 比较操作符 常见的比较操作符都可用,如表 9.1所示。 表 9.1. 比较操作符 操作符 描述 < 小于 > 大于 <= 小于等于 >= 大于等于 = 等于 <> or != 不等于 注意 !=操作符在分析器阶段被转换成<>。
9.1. 逻辑操作符 常用的逻辑操作符有: ANDORNOTSQL使用三值的逻辑系统,包括真、假和null,null表示“未知”。观察下面的真值表: a b a AND b a OR b TRUE TRUE TRUE TRUE TRUE FALSE FALSE TRUE TRUE .
第 8 章 数据类型 目录 8.1. 数字类型 8.1.1. 整数类型 8.1.2. 任意精度数字 8.1.3. 浮点类型 8.1.4. 序数类型 8.2. 货币类型 8.3. 字符类型 8.
8.20. 伪类型 PostgreSQL类型系统包含了一些特殊目的的项,它们被统称为伪类型。一个伪类型不能被用作一个列的数据类型,但是它可以被用来定义一个函数的参数或者结果类型。每一种可用的伪类型都有其可以发挥作用的情况,这些情况的特点是一个函数的行为并不能符合于简单使用或者返回一种特定SQL数据类型的值。
8.19. pg_lsn Type pg_lsn数据类型可以被用来存储 LSN(日志序列号)数据,LSN 是一个指向 WAL 中的位置的指针。这个类型是XLogRecPtr的一种表达并且是 PostgreSQL的一种内部系统类型。
8.18. 对象标识符类型 对象标识符(OID)被PostgreSQL用来在内部作为多个系统表的主键。OID不会被添加到用户创建的表中,除非在创建表时指定了WITH OIDS或者default_with_oids配置变量被启用。
8.17. 范围类型 8.17.1. 内建范围类型 8.17.2. 例子 8.17.3. 包含和排除边界 8.17.4. 无限(无界)范围 8.17.5. 范围输入/输出 8.17.6. 构造范围 8.17.7. 离散范围类型 8.17.8. 定义新的范围类型 8.17.9. 索引 8.17.10. 范围上的约束 范围类型是表达某种元素类型(称为范围的subtype)的一个值的范围的数据类型。
8.16. 复合类型 8.16.1. 复合类型的声明 8.16.2. 构造组合值 8.16.3. 访问复合类型 8.16.4. 修改复合类型 8.16.5. 在查询中使用复合类型 8.16.6. 复合类型输入和输出语法 一个复合类型表示一行或一个记录的结构,它本质上就是一个域名和它们数据类型的列表。
8.15. 数组 8.15.1. 数组类型的定义 8.15.2. 数组值输入 8.15.3. 访问数组 8.15.4. 修改数组 8.15.5. 在数组中搜索 8.15.6. 数组输入和输出语法 PostgreSQL允许一个表中的列定义为变长多维数组。
8.14. JSON 类型 8.14.1. JSON 输入和输出语法 8.14.2. 有效地设计 JSON 文档 8.14.3. jsonb 包含和存在 8.14.4. jsonb 索引 根据RFC 7159 中的说明,JSON 数据类型是用来存储 JSON(JavaScript Object Notation) 数据的。
8.13. XML类型 8.13.1. 创建XML值 8.13.2. 编码处理 8.13.3. 访问XML值 xml数据类型可以被用来存储XML数据。它比直接在一个text域中存储XML数据的优势在于,它会检查输入值的结构是不是良好,并且有支持函数用于在其上执行类型安全的操作,参见第 9.14 节。
8.12. UUID类型 数据类型uuid存储由RFC 4122、ISO/IEC 9834-8:2005以及相关标准定义的通用唯一标识符(UUID)(某些系统将这种数据类型引用为全局唯一标识符GUID)。
8.11. 文本搜索类型 8.11.1. tsvector 8.11.2. tsquery PostgreSQL提供两种数据类型,它们被设计用来支持全文搜索,全文搜索是一种在自然语言的文档集合中搜索以定位那些最匹配一个查询的文档的活动。
8.10. 位串类型 位串就是一串 1 和 0 的串。它们可以用于存储和可视化位掩码。我们有两种类型的 SQL 位类型:bit(n)和bit varying(n),其中 n是一个正整数。 bit类型的数据必须准确匹配长度n; 试图存储短些或者长一些的位串都是错误的。
8.9. 网络地址类型 8.9.1. inet 8.9.2. cidr 8.9.3. inet vs. cidr 8.9.4. macaddr 8.9.5. macaddr8 PostgreSQL提供用于存储 IPv4、IPv6 和 MAC 地址的数据类型,如表 8.21所示。