关键字:
KingbaseES、SQL、人大金仓
什么是SQL
SQL是“Structured Query Language”(结构化查询语言)的简称。是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统。SQL语句是由一系列记号组成的,以分号“;”作为结束符;其中记号用来指明词法单元、可以是关键字、标识符、常量或一些特定的符号,记号之间通常使用分隔符(空格或新行)分隔。
SQL语法
在SQL语句中注释有两种形式:
单行注释:使用两个短线-,例如:-- This is a standard SQL comment
多行注释:例如:/*… */
关键字:SQL语言中具有特定意义的单词,例如,SELECT、UPDATE等
标识符:用户用来标识SQL语句中所使用的表、列或其它数据库对象的名称,一般都由数字,字母和_组成。关键字与标识符之间的区别和联系如下:
联系:关键字和标识符具有相同的词法结构
区别:
- 使用者不同:关键字是系统使用的,而标识符是用户使用的
- 标识符尽量不与关键字相同
除了普通的标识符以外,还有一类特殊的界定标识符:指使用了界定符“”(双引号)、用来限定位置的标识符(可以遵守标识符命名规则、也可以不遵守)。下面是一些特定的关键字与标识符:
类型 | 对应语句 | 简要说明 |
数据定义语言DDL | CREATE、DROP、ALTER、TRUNCATE | 主要用来创建、删除、修改数据库中各种对象—表、视图、索引等 |
数据操纵语言DML | IINSERT、UPDATE、DELETE、MERGE | 对数据进行增、删、改等操作 |
数据查询语言DQL | SELECT | 由SELECT子句、FROM子句,WHERE子句组成的查询块 |
数据控制语言DCL | GRANT,REVOKE | 授权或回收访问数据库的某种特权,并控制数据库操纵事务发生的时间及效果等 |
事务控制语言TCL | BEGIN,END | |
COMMIT,ROLLBACK | ||
SAVEPOINT | ||
SET TRANSACTION ISOLATION LEVEL | ||
LOCK TABLE |
表1 关键字与标识符
语法树相对庞大,其特点在于能够结合需要找到满足需求的语法分支,形成完整可执行的语句。语法树有以下阅读技巧:
- 大写形式表示SQL关键字;小写形式表示SQL语法中需要用户提供的参数
- |(竖线)分隔括号内的语法项目,只能选择一个项目
- ()(小括号)必选语法项目,必须键入小括号
- [](方括号)可选语法项目,不必键入方括号
- {}(大括号)必选语法项目,不必键入大括号
- [,...]表示前面的项可重复,每一项由逗号分隔;[...]表示前面的项可重复,每一项由空格分隔
CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } | UNLOGGED ] TABLE [ IF NOT EXISTS ] table_name
[ (column_name [, ...] ) ]
[ USING method ]
[ WITH ( storage_parameter [= value] [, ... ] ) | WITHOUT OIDS ]
[ ON COMMIT { PRESERVE ROWS | DELETE ROWS | DROP } ]
[ TABLESPACE tablespace_name ]
AS query
[ WITH [ NO ] DATA ]
T1 { [INNER] | { LEFT | RIGHT | FULL } [OUTER] } JOIN T2 ON boolean_expression
T1 { [INNER] | { LEFT | RIGHT | FULL } [OUTER] } JOIN T2 USING ( join column list )
T1 NATURAL { [INNER] | { LEFT | RIGHT | FULL } [OUTER] } JOIN T2
T1 {CROSS JOIN, \,} T2
对于多表查询需要注意以下几点
- INNER 和 OUTER 对所有连接(join) 类型都是可选的
- INNER 是缺省的
- LEFT,RIGHT和 FULL 只用于 OUTER JOIN
- 给出连接条件:对于使用ON或USING进行的多表查询,区别如下:
- ON:匹配条件内的字段并进行连接,可自行定义字段约束,如 t1.a = t2.d ,输出时保留两个字段对应的列;
- USING:为每对相同的输入字段输出单个字段,例如: USING (a, b, c) 等效于 ON (t1.a = t2.a AND t1.b = t2.b AND t1.c = t2.c) ,与使用On相比,输出结果去掉重复 a,b,和 c 字段,当且仅当两表中中均有该字段时方能使用。
子查询指将一个查询的结果作为另一个查询的数据来源或判断条件的查询。子查询会指定一个派生表,该表包围在圆括号里。子查询使用的关键字通常有表示存在关系的IN、NOT IN、EXIST、NOT EXIST、SOME、ANY、ALL,有模糊查询的LIKE
-
-
-
- 存在子查询
-
-
表示存在与否的子查询IN/NOT IN语法格式如下:
- Expression IN (subquery)
- Expression NOT IN (subquery)
IN 和 NOT IN的右侧是圆括号起来的子查询,它必须返回一个列。然后Expression将被计算,其结果与subquery结果逐行进行比较:如果找到任何等于子查询行的值,则IN的结果为true;如果没有找到任何等于子查询的行的值,则IN的结果为false(包含子查询没有返回任何行的情况)。NOT IN反之。
表示存在与否的另一组子查询关键字EXISTS/NOT EXISTS的语法格式如下:
- Expression EXISTS (subquery)
- Expression NOT EXISTS (subquery)
EXISTS在SQL中的作用是检验查询是否返回数据。其参数是一个任意的SELECT语句或子查询。系统对于查询进行计算以判断它是否返回行。如果子查询至少返回一行,那么EXISTS的结果为true;如果子查询没有返回行,那么EXISTS的结果为false。这个子查询通常只是运行到能判断它是否可以返回至少一行为止,而不是等到全部结束。因为结果只取决于是否返回行,而不取决于这些行的内容,所以这个子查询的输出列表通常是无关紧要的。
ANY和SOME右侧是一个圆括号括起来的子查询,它必须返回一行。ANY和SOME左侧的表达式将被计算并使用给出的运算符对于子查询结果逐行进行比较。如果找到任何真值结果,那么ANY的结果为true;如果找不到任何真值结果,那么ANY的结果为false(包括子查询没有返回任何行的情况)。
ALL与ANY和SOME不同,当于子查询结果集的每一行进行比较结果全部是true时,表达式结果才是true,否则为false。
-
-
-
- 模糊子查询
-
-
LIKE关键字通常需要和通配符配合使用,通配符是在SQL的WHERE条件子句中拥有特殊含义的字符。KES提供两个通配符:”%”和“_”。
“%”用于匹配任何字符序列:
-
- SELECT * FROM employee WHERE name like ‘%A%’; --返回姓名包含A的员工信息
- SELECT * FROM employee WHERE name like ‘A%’; --返回所有以A开头的姓名
- SELECT * FROM employee WHERE name like ‘%A’; --返回所有以A结尾的姓名
“_”用于匹配任意单个字符
-
- SELECT * FROM employee WHERE name like ‘A_’; --返回所有以A开头,且只有两个字符的姓名
此外KES对LIKE进行了拓展,提供了和LIKE行为相似的ILIKE预算符。不同的是ILIKE在模式匹配时会忽视大小写。
SIMILAR TO关键字根据自己的模式是否匹配给定字符串而返回true或false。它和LIKE非常类似,只不过它使用SQL标准定义的正则表达式匹配模式。样例如下:
按照操作符的功能,操作符可以分为如下五类:
算术操作符(13个):+(一元)、+(二元)、-(一元)、-(二元)、*、/、%、^、!、!!、|/、||/、@;
相关类型:数值类型和日期时间及时间间隔类型;
比较操作符(6个):>、<、=、<>、>=、<=;
相关类型:除BLOB、CLOB外的所有类型;
串(字符串、位串、二进制位串)操作符(3个):||、~~(like)、!~~(not like);
相关类型:字符串类型、位串类型、二进制位串类型;
位运算符(6个):~(一元)、&、|、#、>>、<<;
相关类型:整数数值类型和位串类型;
字符串运算操作符(15个):^@、@@、||、~~、!~~、~~*、!~~*、~、!~、~*、!~*、~>~、~<~、~>=~、~<=~
相关类型:字符串类型;
常用数据库对象
表空间用于存储它的数据库对象,允许在文件系统里定义数据库对象存储的文件存放位置。一个数据库可有一个或多个表空间,一个表空间只隶属于一个数据库。需要注意的是,在创建表空间时,所生成的路径需为绝对路径,且应当提前创建好。表空间创建语法树如下:
CREATE TABLESPACE tablespace_name
[ OWNER { new_owner | CURRENT_USER | SESSION_USER } ]
LOCATION 'directory'
[ WITH ( tablespace_option = value [, ... ] ) ]
表空间修改语法树:
ALTER TABLESPACE name RENAME TO new_name
ALTER TABLESPACE name OWNER TO { new_owner | CURRENT_USER | SESSION_USER }
ALTER TABLESPACE name SET ( tablespace_option = value [, ... ] )
ALTER TABLESPACE name RESET ( tablespace_option [, ... ] )
表空间删除语法:
DROP TABLESPACE [ IF EXISTS ] name
数据库是按照数据结构来组织、存储和管理数据的仓库。是一个长期存储在计算机内的、有组织的、可共享的、统一管理的大量数据的集合。 每个连接只能访问一个数据库,各个数据库在物理上分离。数据库创建语法树:
CREATE DATABASE name
[ [ WITH ] [ OWNER [=] user_name ]
[ TEMPLATE [=] template ]
[ ENCODING [=] encoding ]
[ LC_COLLATE [=] lc_collate ]
[ LC_CTYPE [=] lc_ctype ]
[ TABLESPACE [=] tablespace_name ]
[ ALLOW_CONNECTIONS [=] allowconn ]
[ CONNECTION LIMIT [=] connlimit ]
[ IS_TEMPLATE [=] istemplate ] ]
数据库修改语法树:
ALTER DATABASE name [ [ WITH ] option [ ... ] ]
(option can be:ALLOW_CONNECTIONS allowconn
CONNECTION LIMIT connlimit
IS_TEMPLATE istemplate)
ALTER DATABASE name RENAME TO new_name
ALTER DATABASE name OWNER TO { new_owner | CURRENT_USER | SESSION_USER }
ALTER DATABASE name SET TABLESPACE new_tablespace
ALTER DATABASE name SET configuration_parameter { TO | = } { value | DEFAULT }
ALTER DATABASE name SET configuration_parameter FROM CURRENT
ALTER DATABASE name RESET configuration_parameter
ALTER DATABASE name RESET ALL
数据库删除语法:
DROP DATABASE [ IF EXISTS ] name
模式是数据库对象的集合,如:表、视图、序列等。一般使用模式的场景有:多个用户使用同一个数据库而不会相互影响;对数据库中的对象进行逻辑分组,更便于管理;各个应用分别使用各自的模式,以避免命名冲突。需要注意的是:不同的模式中的表名可相同,同一模式的表不能同名;模式不能嵌套。模式创建语法树:
CREATE SCHEMA schema_name [ AUTHORIZATION role_specification ] [ schema_element [ ... ] ]
CREATE SCHEMA AUTHORIZATION role_specification [ schema_element [ ... ] ]
CREATE SCHEMA IF NOT EXISTS schema_name [ AUTHORIZATION role_specification ]
CREATE SCHEMA IF NOT EXISTS AUTHORIZATION role_specification --其中role_specification值为user_name|CURRENT_USER|SESSION_USER
模式修改语法树:
ALTER SCHEMA name RENAME TO new_name
ALTER SCHEMA name OWNER TO { new_owner | CURRENT_USER | SESSION_USER }
模式删除语法树:
DROP SCHEMA [ IF EXISTS ] name [, ...] [ CASCADE | RESTRICT ]
表时数据库中用来存储数据的对象,是有结构的数据的集合,是整个数据库系统的基础。通常表采用二维结构,一个表包含一或多个属性,用来定义列结构;表中的每行数据称为一个元组;每个属性和元组都是不可再分的。表创建的部分语法树:
CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } | UNLOGGED ] TABLE [ IF NOT EXISTS ] table_name ( [
{ column_name data_type [ COLLATE collation ] [ column_constraint [ ... ] ]
| table_constraint
| LIKE source_table [ like_option ... ] }
[, ... ]
] )
[ INHERITS ( parent_table [, ... ] ) ]
[ PARTITION BY { RANGE | LIST | HASH } ( { column_name | ( expression ) } [ COLLATE collation ] [ opclass ] [, ... ] ) ]
[ USING method ]
[ WITH ( storage_parameter [= value] [, ... ] ) | WITHOUT OIDS ]
[ ON COMMIT { PRESERVE ROWS | DELETE ROWS | DROP } ]
[ TABLESPACE tablespace_name ]
[ { ENABLE | DISABLE } [ VALIDATE | NOVALIDATE ] constraint [ ... ] ]
实际上表的类型众多,具体的类型及说明如下表所示
表类型 | 关键标识 | 说明 | |
普通表 | -- | -- | 存放数据(永久) |
临时表 | 局部临时表 | TEMP | 临时存放数据,只属于某个会话 |
全局临时表 | GLOBAL TEMP | 临时存放数据,各个会话之间可共享(共享的是表定义),但各个会话只能维护自己创建的数据 | |
分区表 | 范围分区 | PARTITION BY RANGE | 表被根据一个关键列或一组列划分为“范围”,不同的分区的范围之间没有重叠。 例如,根据日期范围划分或者特定业务对象标识符划分 |
列表分区 | PARTITION BY LIST | 通过显式地列出每一个分区中出现的键值来划分表 | |
哈希分区 | PARTITION BY HASH | 通过为每个分区指定模数和余数来对表进行分区。每个分区所持有的行都满足分区键的值除以为其指定的模数将产生为其指定的余数 | |
继承表 | -- | INHERITS | 父表的所有字段被子表所继承 子表可以有自己的子表,层层继承 一个子表允许同时从多个父表继承 |
表2 表
在表2的基础上,需要注意的是:
临时表只用于临时存放数据,因此临时表的生命周期根据发起的主体不同有不同的生命周期: 在会话退出后清空表数据,这类属于会话级别;以及事务退出后清空表数据,这类属于事务级别。
分区表指将逻辑上的一个大表拆分成较小的相对独立的子表,分区表支持的分区形式除了表2提及的内容以外还有组合分区。组合分区表示是二级分区,即分区的分区,是以上三种形式的组合(一级分区和二级分区分别采用不同的分区方法)。使用分区表的优势在于:
- 减少I/O访问量:
-
- 查询时通过有选择地搜索分区,降低I/O访问量:通过大表切分,将对大表访问转换为对少量子表的访问,从而减少I/O访问量
-
- 均衡I/O:可把不同分区映射到不同磁盘以平衡I/O
- 利于并行计算:通过表分区可实现I/O并行与查询并行
- 增强可用性:
-
- 当表某个分区出现故障时,它的其他分区的数据仍然可用
- 管理员可以分区为单位进行备份与恢复操作
-
- 维护方便:
-
- 当表出现故障需时,只需修复故障分区;
- 使通过较小批处理窗口完成大型数据库对象的维护工作成为可能
-
对分区表的维护可以直接通过CREATE TABLE\DROP TABLE命令添加\删除分区,通过ALTER TABLE ATTACH PARTITION/DETACH PARTITION从分区表中添加\移除分区,这种方式移除分区后,仍能保持原分区是一个独立的表。
继承表使用SQL关键字ONLY,表示SQL操作只作用于父表本身,不涉及继承层次中的任何子表。SELECT、UPDATE、DELETE都支持该关键字,而INSERT不支持。子表只会继承检查约束和非空约束,其他约束都不会被继承。
视图是查询语句由一个或多个表(或其他视图)导出的虚拟的表;视图本质上就是一个虚表的定义。视图是原生数据库数据的一种变换,是查看表中数据的另外一种方式。视图可以用来限制数据访问,隐藏一些数据;降低查询复杂度;解耦底层数据表与查询结果:视图提供了一个用户访问的接口,当底层表改变后,上层查询可以通过改变视图的定义来适配。以下是视图创建语法树:
CREATE [ OR REPLACE ] [ TEMP | TEMPORARY ] [ RECURSIVE ] [ FORCE ] VIEW name [ ( column_name [, ...] ) ]
[ WITH ( view_option_name [= view_option_value] [, ... ] ) ]
AS query
[ WITH [ CASCADED | LOCAL ] CHECK OPTION ]
其中:
- TEMPORARY:创建临时视图。当session结束时,临时视图也消失
- RECURSIVE:创建一个递归视图
- FORCE:创建的视图依赖检查失败,视图依然创建成功,将其状态设置为无效;依赖检查成功,所创建的视图装填为有效
- WITH [ CASCADED | LOCAL ] CHECK OPTION :该子句控制自动可更新视图的行为。指定该子句后,在该视图上执行INSERT或UPDATE命令时,会检查新行是否满足视图的定义
- LOCAL:根据直接定义在该视图上的条件检查新行
- CASCADE:根据该视图和所有底层基视图上的条件检查新行。注:CHECK OPTION不能和RECURSIVE一起使用
对于视图而言,需要注意以下几点:
- 只有简单视图可以进行DML更新
- 更新视图本质上是对基表的更新
- 可更新的视图需要满足以下条件:
- 在该视图的FROM列表中刚好只有一项,并且它必须是一个表,或者是另一个可更新的视图
- 在视图定义中,query部分最外层不包含WITH、DISTINCT、 GROUP BY、HAVING、LIMIT或OFFSET子句
- 在视图定义中,query部分最外层不包含任何聚集函数、窗口函数或者集合返回函数
- 视图的更新操作包括: INSERT、UPDATE、DELETE 和 MERGE
物化视图(Materialized View)是一个包含查询结果的数据库对象。它可以是一个远程数据的本地副本、某一个表的某些行列的子集,也可以是多个表连接的结果,或者聚集函数的计算结果。 创建物化视图的过程被称为物化,它类似于缓存计算代价昂贵的函数结果,它是某种形式的预计算,主要用于优化数据库查询性能。更新物化视图内容使用REFRESH MATERIALIZED VIEW view_name语句。同样是用于优化访问性能,物化视图与普通视图的有以下区别:
首先普通视图是一个虚表,所有对它的查询或更改都会被转化成对底层基表的操作;而物化视图缓存的是查询结果,它是一个实体表,因为它的数据可以被一次次从底层基表中重新查询更新。因此查询物化视图不会直接被转化为对底层基表的查询,而是直接查询物化视图中的缓存数据,这点可以看出,物化视图查询性能比普通视图要高。
其次,根据物化视图的实现方式可知,物化视图有一定额外的存储空间开销,并且数据可能会过期;普通视图则没有这些额外开销。
最后,在物化视图实现的基础上可知,物化视图可以对任意列创建索引(物化视图更像是一个为了加速访问而在磁盘上存储的表);但普通视图不能对任意列创建索引。
索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息。索引的优势在于:通过创建唯一索引,可以保证数据的唯一性;提高数据记录的查询速度;加快表与表之间的连接速度。但使用索引也会引发各种问题:首先需要占用额外的物理存储空间;其次如果表中的数据有变化,则索引也需要同步进行更新,对数据库性能有一定的影响
KES支持以下索引类型:
Btree索引:Btree索引使用Btree数据结构来存储索引数据,可用于处理等值查询和范围查询,包括<、<=、=、>=、>等运算符,以及BETWEEN、IN、IS NULL、IS NOT NULL等条件;Btree索引还可以用于查询结果集排序,如ORDER BY排序;
Hash索引:Hash索引基于哈希表实现,只能用于等值查询,特别是索引列的值非常长的等值查询;
GiST索引:GiST(Generalized Search Tree)是一种平衡的树型结构访问方法,可作为一种基础模板来实现任意索引模式。GiST索引适用于多维数据和集合数据类型;
SP-GiST索引:与GiST索引类似,可作为一种基础模板来实现多种搜索方法。
GIN索引:是一种通用倒排索引,可以处理包含多个键值(如数组)。用它搜索全文或JSON键值效率很高;
BRIN索引:BRIN表示块范围索引。BRIN索引存储连续相邻的数据块统计信息,可以大大缩小索引占用空间。
由于索引会增加数据库系统的额外开销,并不是越多越好,需要合理规划。创建索引需要遵循以下原则:
在经常用于查询的字段上创建索引
在经常用于连接的字段上创建索引,以加快连接速度
在经常需要根据范围进行查询的列上创建索引
避免对经常更新的表建立过多的索引
不应该在数据量非常小的表上创建索引
不应该在数据取值区分度很小的列上创建索引,如“性别”字段只有男,女两个取值
索引创建语法树:
CREATE [ UNIQUE ] INDEX [ CONCURRENTLY ] [ [ IF NOT EXISTS ] name ] ON [ ONLY ] table_name [ USING method ]
( { column_name | ( expression ) } [ COLLATE collation ] [ opclass ] [ ASC | DESC ] [ NULLS { FIRST | LAST } ] [, ...] )
[ INCLUDE ( column_name [, ...] ) ]
[ WITH ( storage_parameter = value [, ... ] ) ]
[ TABLESPACE tablespace_name ]
[ WHERE predicate ]
其中:
- UNIQUE:创建唯一索引
- CONCURRENTLY :并行创建索引,在构建索引时不阻塞写操作
- Method:索引方法,默认是Btree索引
- COLLATE collation:索引的排序规则
- ASC:升序排序(默认)
- DESC:下降排序
- NULLS FIRST:空值排序在非空值前面。当指定DESC时这是默认行为
- NULLS LAST:空值排序在非空值后面。当没有指定DESC时这是默认行为
常用的索引方法:
多列索引:对于多列联合查询的场景来说,可以建一个多列索引。只有Btree、GiST、GIN、BRIN类型的索引支持建多列索引;一个多列索引最多支持32个字段字段;其中还有Btree类型的多列索引:支持从左向右的顺序匹配各个索引字段
唯一索引:唯一索引可以保证某个字段值是唯一的,也可以保证多个字段组合值是唯一的,其中字段中的null值被认为是不同的值。唯一索引是Btree类型的索引,对于表中有唯一性约束或主键约束的字段(或字段组合)来说,KES会自动创建相应的唯一索引,不需要手动再创建唯一索引。
表达式索引:可以使用一个函数或表达式的计算结果作为索引的字段。被索引的函数或表达式要用圆括号括起来。表达式索引适用于查询速度远比插入更新速度要求高的场景,不适用于插入更新频繁的情况。
约束是语义施加在数据上的限制,保证数据的正确性、有效性和完整性。主要内容包括:数据应满足的强制规则,例如字段的唯一性和非空约束;数据应满足的完整性规则,例如主外键约束;数据应满足的业务规则,例如CHECK约束。因此约束常用于:防止生成无效或错误的数据;确保数据使用满足业务规则;防止非法使用数据;保证数据库始终处于正确和一致的状态。约束有以下类型:
约束类型 | 粒度 | 说明 |
NOT NULL约束 | 列级 | 非空约束用于指定一个字段不能设置为NULL值 |
CHECK约束 | 列级 | CHECK约束用来约束一个特定列的值,使之满足一个Boolean类型表达式条件 |
表级 | ||
UNIQUE约束 | 列级 | 唯一值约束能够确保一个字段或几个字段的组合在整张表中是唯一的 |
表级 | ||
PRIMARY KEY约束 | 列级 | 主键约束指定一个字段或几个字段的组合是唯一的。它与唯一性约束的差别是要求这些字段值设为NOT NULL |
表级 | ||
FOREIGN KEY约束 | 列级 | 外键约束要求一个表对应字段(或多个字段组合)的值必须和另外一个表对应字段的值相同。外键约束用来实现参数完整性。 |
表级 | ||
EXCLUDE排他约束 | 表级 | 排他约束是用来保证如果将任何两行的指定行或表达式使用指定操作符进行比较,至少其中一个操作符比较将会返回否或者空值。 例如当要求表中某两列是一对一的,即其中一列的值确定后,另一列的值也确定下来了,可以使用排他约束 |
启用或禁用约束:
CREATE TABLE创建表或ALTER TABLE语句指定约束启用禁用
语法示例:
格式1:ALTER TABLE table MODIFY CONSTRAINT ConstraintName { ENABLE | DISABLE } [ VALIDATE | NOVALIDATE ]
格式2:ALTER TABLE table { ENABLE | DISABLE } [ VALIDATE | NOVALIDATE ] CONSTRAINT ConstraintName
其中有:
状态 | 行为 |
ENABLE VALIDATE/ENABLE | 约束启用,禁止违反约束的行 |
ENABLE NOVALIDATE | 约束启用,禁止违反约束的新行,不对已经数据进行约束校验 |
DISABLED VALIDATE | 禁止DML操作,如INSERT/UPDATE/DELETE |
DISABLED NOVALIDATE/DISABLED | 约束禁用,无限制 |
序列是一种可共享的数据库对象,系统自动生成按一定规律(增加或减小)变化的数值序列。每个序列值都都是唯一的,因此也通常用于创建主键。序列的创建语法树如下:
CREATE [ TEMPORARY | TEMP ] SEQUENCE [ IF NOT EXISTS ] name
[ AS data_type ]
[ INCREMENT [ BY ] increment ]
[ MINVALUE minvalue | NO MINVALUE ] [ MAXVALUE maxvalue | NO MAXVALUE ]
[ START [ WITH ] start ] [ CACHE cache ] [ [ NO ] CYCLE ]
[ OWNED BY { table_name.column_name | NONE } ]
其中有:
INCREMENT BY :可选的,增减子句
START WITH :可选的,定义序列的开始值
CACHE:为提升序列效果,可缓存序列
CYCLE:可选的,序列达到最大值或最小值时可复位并继续下去
附录
PG原生类型名称 | 对应别名 | 描述 | 范围 | |
数值类型 | Smallint | Int2 | 带符号的2字节整数 | -32768到+32767 |
integer | Int,Int4 | 带符号的4字节整数 | -2147483648到+2147483647 | |
Bigint | Int8 | 带符号的8字节整数 | -9223372036854775808到+9223372036854775807 | |
Numeric | Decimal | 用户指定精度,精确 | 小数点前131072位; 小数点后16383位 | |
Real | Float4 | 4字节可变精度,不精确 | 6位十进制数字精度 | |
Double precision | Float8 | 8字节可变精度,不精确 | 15位十进制数字精度 | |
Smallserial | -- | 自增2字节整数 | 1到32767 | |
Serial | Serial4 | 自增4字节整数 | 1到2147483647 | |
Bigserial | Serial8 | 自增8字节整数 | 1到9223372036854775807 | |
字符类型 | Character varying[(n)] | Varchar[(n)] | 变长字符串 | 有长度限制 |
Character[(n)] | Char[(n)] | 定长字符串 | 不足补空白 | |
text |
| 变长字符串 | 无长度限制 | |
日期时间类型 | Date | -- | 4字节只用于日期 | 4713BC到5874897AD |
Timestamp[(p)][without time zone] | -- | 8字节日期和时间,无时区 | 4713BC到294276AD | |
Timestamp[(p)][with time zone] | Timestamptz | 8字节日期和时间,有时区 | 4713BC到294276AD | |
Time[(p)][without time zone] | -- | 8字节只用于一日内时间,无时区 | 00:00:00到24:00:00 | |
Time[(p)][with time zone] | Timetz | 8字节只用于一日内时间,有时区 | 00:00:00+1459到24:00:00-1459 | |
Interval[fields][(p)] | -- | 12字节存储时间间隔 | -178000000年到178000000年 | |
布尔类型 | Boolean | Bool | 逻辑布尔量 | True/false |
二进制类型 | Bytea |
| 存储二进制字符串 |
|
特殊字符类型 | “char” | -- | 1字节 | 单字节内部类型 |
name | --- | 64字节 | 对象名的内部类型 |
兼容ORACLE数据类型 | 对应别名 | 描述 | 范围 | |
数值类型 | NUMBER | Numeric | 用户指定精度 | Number类型的精度有效取值范围是1~1000 标度s的有效取值范围是-84~1000 |
PLS_INTEGER | Integer | 同integer类型 | ||
BINARY_FLOAT | real | 同real类型 | ||
BINARY_DOUBLE | double precision | 同double precision类型 | ||
VARCHAR(支持char或byte) | Varchar2,nvarchar2 | 变长字符类型 | 1 ~ 10485760,不指定size时varchar行为等同于text | |
LONG | Text | 变长字符串 | 最大长度1G | |
日期时间类型 | DATE | -- | 同timestamp(0) |
|
TIMESTAMP | timestamp without time zone | 同 timestamp without time zone | ||
TIMESTAMPTZ | timestamp with time zone | 同 timestamp without time zone | ||
TIMESTAMP WITH LOCAL TIME ZONE | timestamp without time zone | 同 timestamp without time zone | ||
大对象类型 | BLOB |
| 二进制大对象 |
|
CLOB |
| 字符大对象 | ||
二进制类型 | RAW |
| 同bytea |
|
函数 | 返回类型 | 说明 | 示例 | 结果 |
abs(x) | 和输入数据类型相同 | 绝对值 | abs(-17.4) | 17.4 |
ceil(dp or numeric) | 和输入数据类型相同 | 不小于参数的最小整数 | ceil(3.6),ceil(-3.6) | 4,-3 |
floor(dp or numeric) | 和输入数据类型相同 | 不大于参数的最大整数 | floor(3.6),floor(-3.6) | 3,-4 |
mod(y,x) | 和参数类型相同 | y/x的余数 | mod(9,4) | 1 |
power(a dp,b dp) | dp | 求a的b次幂 | power(9.0,3.0) | 729 |
round(dp or numeric) | 和输入数据类型相同 | 四舍五入到最近的整数 | round(10.2),round(10.9) | 10,11 |
round(v numeric,s int) | numeric | 四舍五入到s位小数数值 | round(42.4382,2) | 42.44 |
trunc(dp or numeric) | 和输入数据类型相同 | 截断 | trunc(42.8) | 42 |
trunc(v numeric,s int) | numeric | 截断为s位小数位置的数值 | trunc(42.4382,2) | 42.43 |
random() | dp | 范围0.0<=x<1.0中的随机值 | random() | NA |
string||string | text | 连接字符串 | ‘King’||’base’ | Kingbase |
char_length(string) | int | 字符串包含的字符个数 | char_length(‘jose’) | 4 |
lower(string) | text | 将字符创转换为小写形式 | lower(‘TOM’) | tom |
oct_length(string) | int | 字符串包含的字节数 | oct_length(‘jose’) | 4 |
overlay(string placing string from int[for int]) | text | 替换子字符串 | overlay(‘Txxxxas’placing ‘hom’from 2 for 4) | Thomas |
position(substring in string) | int | 定位指定子字符串的位置 | position(‘om’in ‘Thomas’) | 3 |
substring(string [from int][for int]) | text | 提取子字符串 | subtring(‘Thomas’from 2 for 3) | hom |
trim([leading|trailing|both][characters] fromstring) | text | 从给定的string字符串开头和结尾或两端(默认),删除只来自characters字符数值中字符组成的最长字符串 | trim(both ‘xyz’from ‘yxTomxx’) | Tom |
upper(string) | text | 将字符串转换成大写形式 | upper(‘tom’) | TOM |
ascii(string) | int | 返回参数的第1个字符的ASCII码 | asci(‘x’) | 120 |
chr(int) | text | 返回给定代码的字符 | chr(65) | A |
left(str text,n int) | text | 返回字符串中的前n个字符 | left(‘abcde’,2) | ab |
length(string) | int | string中字符个数 | length(‘jose’) | 4 |
lpad(string text,length int[,fill text]) | text | 将string通过前置字符填充到长度 | lpad(‘hi’,5,’xy’) | xyxhi |
md5(string) | text | 计算string的md5哈希值,返回十六进制结果 | md5(‘abc’) | 900150983cd24fb0d6963f7d28e17f72 |
repeat(string text,number int) | text | 将string重复number次 | repeat(‘A’,3) | AAA |
replace(string text,from text,to text) | text | 将string中出现的所有from替换成to | replace(‘abcdefabcdef’,‘cd’,‘XX’) | abXXefabXXef |
split_part(string text,delimiter text,field int) | text | 用delimiter划分string字符串,并返回field指定位置的字段 | split_part(‘abc@def1@nb’,’@’,2) | def1 |
current_date | date | 当前日期 | current_date | 44407 |
current_time | time with time zone | 当前时间不包含日期 | current_time | 16:40:26.332971+08 |
current_timestamp | timestamp with time zone | 当前日期和时间(当前事务开始时) | current_timestamp | 2021-07-30 16:40:56.338668+08 |
now() | timestamp with time zone | 当前事务开始时间 | now() | 2021-07-30 16:40:56.338668+08 |
extract(field from timestamp) | double precision | 从时间戳中抽取由field指定子域的值 | extract(hour from timestamp '2001-02-16 20:38:40') | 20 |
extract(field from interval) | double precision | 从时间间隔中抽取由field指定子域的值 | extract(month from interval '2 years 3 months') | 3 |
to_timestamp(double precision) | timestamp with time zone | 把UNIX系统时间(从1970-01-01 00:00:00+00开始的秒)转换成timestamp | to_timestamp(1284352323) | 2010-09-13 12:32:03+08 |
还有这些:
函数 | 参数类型 | 返回类型 | 说明 |
avg(expression) | smallint、int、bigint、real、double precision、numeric或interval | 整数类型返回numeric,浮点类型返回double precision,其他数据类型返回结果与参数数据类型相同 | 所有输入值的平均值(算数平均) |
count(*) | bigint | 输入的行数 | |
count(expression) | any | bigint | expression值非空时输入的行数 |
max(expression) | 任意数值类型、字符串类型、日期类型/时间类型、枚举类型,或者由这些构成的数组 | 与参数数据类型相同 | 所有输入值中expression中最大值 |
min(expression) | 任意数值类型、字符串类型、日期类型/时间类型、枚举类型,或者由这些构成的数组 | 与参数数据类型相同 | 所有输入值中expression中最大值 |
sum(expression) | smallint、int、bigint、real、double precision、numeric或interval | 如果参数是smallint和int数据类型,则返回的数据类型是bigint;如果参数是bigint数据类型,返回数据类型是numeric,否则和参数的数据类型相同 | 所有输入值的和 |
generate_series(start,stop) generate_series(start,stop,step) generate_series(start,stop,step interval) | int、bigint或numeric timestamp 或timestamp with time zone | setoff int、setoff bigint或setoff numeric(与参数类型相同) setoff timestamp、setoff timestamp with time zone(与参数类型相同) | 产生一系列值,从start到stop,步长为step |
系统表名称 | 用途 |
sys_namespace | 存储命名空间(Schema) |
sys_tablespace | 存储表空间信息 |
sys_database | 存储当前数据集簇中数据库的信息 |
sys_class | 存储表及表类似结构的数据库对象 |
sys_type | 存储数据类型信息 |
sys_attribute | 存储表的列信息(属性信息) |
sys_index | 存储索引信息 |
系统视图名称 | 用途 |
sys_indexes | 索引信息 |
sys_roles | 用户角色信息 |
sys_settings | 参数配置信息 |
sys_tables | 表信息 |
sys_views | 视图信息 |