SQL参考
1 数据类型
1.1 货币类型
1.1.1 货币类型存储带有固定小数精度的货币金额。
1.2 布尔类型
1.2.1 true:真
1.2.2 false:假
1.2.3 null:未知(unknown)
1.3 日期/时间类型
1.3.1 DATE
输出格式:仅支持YYYY-MM-DD,且不受DateStyle参数的影响。
输入格式:支持有分隔符YYYY-MM-DD和无分隔符 YYYYMMDD的输入格式
1.3.2 TIME [§] [WITHOUT TIME ZONE]
不包括日期?
1.3.3 TIME [§] [WITH TIME ZONE]
不包括日期?
1.3.4 TIMESTAMP[§] [WITHOUT TIME ZONE]
1.3.5 TIMESTAMP[§][WITH TIME ZONE]
1.3.6 INTERVAL [FIELDS] [ § ]
时间间隔。
1.3.7 datetime[§]
1.4 几何类型
1.4.8 能否作为字段保存?
1.5 网络地址类型
1.5.1 GaussDB提供用于存储IPv4、IPv6、MAC地址的数据类型。
1.5.2 cidr
7或19字节
IPv4或IPv6网络
192.168.100.128/25'
'192.168/24'
子网
1.5.3 inet
7或19字节
IPv4或IPv6主机和网络
192.168.100.128
192.168.1.0/25'
IP+(掩码)
1.5.4 macaddr
6字节
MAC地址
1.6 位串类型
1.6.1 位串就是一串1和0的字符串。它们可以用于存储位掩码。
1.7 UUID类型
1.8 JSON/JSONB类型
1.9 HLL-HLL(HyperLoglog)数据类型
1.10 范围类型
1.10.1 范围类型是表达某种元素类型(称为范围的subtype)的一个值的范围的数据类型
在一个范围的文本形式中,一个包含下界被表达为"[",而一个排除下界被表达为"("
一个范围的下界可以被忽略,意味着所有小于上界的值都被包括在范围中。 同样,如果范围的上界被忽略,那么所有比下界大的值都被包括在范围中
构造范围
-- 完整形式是:下界、上界以及指示界限包含性/排除性的文本参数。
gaussdb=# SELECT numrange(1.0, 14.0, '(]');
定义新的范围类型
CREATE TYPE floatrange AS RANGE (
subtype = float8,
subtype_diff = float8mi
);
索引
B-树索引可以在范围类型的表列上创建。对于这些索引类型,基本上唯一有用的范围操作就是等值
范围类型的B-树支持主要是为了允许在查询内部进行排序,而不是创建真正的索引。
1.10.2 int4range --- integer的范围
1.10.3 int8range --- bigint的范围
1.10.4 numrange --- numeric的范围
1.10.5 tsrange --- 不带时区的timestamp的范围
1.10.6 tstzrange --- 带时区的timestamp的范围
1.10.7 daterange --- date的范围
1.11 对象标识符类型
1.11.1 GaussDB在内部使用对象标识符(OID)作为各种系统表的主键。系统不会给用户创建的表增加一个OID系统字段,OID类型代表一个对象标识符。
1.11.2 目前OID类型用一个四字节的无符号整数实现。因此不建议在创建的表中使用OID字段做主键。
1.12 伪类型
1.12.1 伪类型不能作为字段的数据类型,但是可以用于声明函数的参数或者结果类型。
1.13 XML类型
1.14 XMLTYPE类型
1.14.1 它比直接在一个TEXT域中存储XML数据的优势在于:XMLTYPE类型数据支持基于LIBXML2提供的标准XML操作函数及XML规范性的检查
1.15 SET类型
1.15.1 SET类型成员个数最大为64个,最小为1个。不能定义为空集。
1.15.2 SET类型的表字段值必须是SET类型定义的集合的子集
CREATE TABLE employee (
name text,
site SET('beijing','shanghai','nanjing','wuhan')
);
INSERT INTO employee values('zhangsan', 'nanjing,beijing');
1.16 数组类型
1.16.1 一个数组数据类型一般通过在数组元素的数据类型名称后面加上方括号([])来命名。
phone_numbers varchar(11)[]
1.16.2 数组构造器
SELECT ARRAY[1, 2, 3]::varchar[];
INSERT INTO orders VALUES('a', ARRAY['苹果', '橘子', '梨']);
1.16.3 数组元素个数限制如下:
元素个数最大为134217727个。
所有元素加起来最大存储空间不超过1GB - 1字节即1073741823字节。
1.17 向量数据类型
1.17.1 向量数据类型包括floatvector和boolvector两种。
2 常量与宏
2.1 CURRENT_CATALOG
2.1.1 当前数据库
2.2 CURRENT_ROLE
2.2.1 当前用户
2.3 CURRENT_SCHEMA
2.3.1 当前数据库模式
2.4 CURRENT_USER
2.4.1 当前用户
2.5 LOCALTIMESTAMP
2.5.1 当前会话时间(无时区)
2.5.2 SELECT LOCALTIMESTAMP;
2.6 NULL
2.6.1 空值
2.7 SESSION_USER
2.7.1 当前系统用户
2.8 SYSDATE
2.8.1 当前系统日期
2.9 USER
2.9.1 当前用户,此用户为CURRENT_USER的别名。
3 伪列
3.1 ROWNUM
4 空间回收-VACUUM
4.1 VACUUM回收表或B-Tree索引中已经删除的行所占据的存储空间
4.1.1 在一般的数据库操作里,那些已经DELETE的行并没有从它们所属的表中物理删除;
4.1.2 VACUUM和VACUUM FULL时,会根据参数vacuum_defer_cleanup_age延迟清理行存表记录,即不会立即清理刚刚删除的元组。
4.1.3 执行DELETE后立即执行VACUUM FULL命令不会回收空间。执行DELETE后再执行1000个非SELECT事务,或者等待1s后再执行1个事务,之后再执行VACUUM FULL命令空间才会回收。
4.2 因此有必要周期地运行VACUUM,特别是在经常更新的表上
4.3 VACUUM会导致I/O流量的大幅增加,这可能会影响其他活动会话的性能。因此,有时候会建议使用基于开销的VACUUM延迟特性。
4.4 VACUUM FULL分区表时,会遍历分区进行清理,并在分区清理后重建GPI,因此当分区较多时,建议先删除GPI,在VACUUM FULL执行完成后重新创建索引,以此降低VACUUM FULL的执行时间。
4.4.1 gpi 是 global primary index吗?
4.5 参数
4.5.1 选择"FULL"清理,这样可以恢复更多的空间,但是需要耗时更多,并且在表上施加了排他锁。
不建议日常使用FULL选项,但是可以在特殊情况下使用
VACUUM FULL通过重建表的方式将表内空闲空间归还给表空间,重建过程需要额外申请表中有效数据相当的存储空间。对于非段页式表,VACUUM FULL执行结束后,原表所占物理文件会被删除,原表所占的物理文件的空间会归还给操作系统;
4.5.2 partition_name
要清理的表的一级分区名称。缺省时为所有一级分区。
4.5.3 subpartition_name
要清理的表的二级分区名称。缺省时为所有二级分区。
4.5.4 VACUUM ANALYZE先执行一个VACUUM操作,然后给每个选定的表执行一个ANALYZE。对于日常维护脚本而言,这是一个很方便的组合。
5 特殊dml
5.1 COPY
5.1.1 COPY FROM从一个文件复制数据到一个表,COPY TO把一个表的数据复制到一个文件。
5.1.2 COPY只能用于表,不能用于视图。
5.1.3 支持使用query过滤数据
5.2 ALTER SESSION
5.2.1 ALTER SESSION命令用于定义或修改对当前会话有影响的条件或参数。修改后的会话参数会一直保持,直到断开当前会话。
5.3 REPLACE
5.3.1 在表中插入或者替换新的数据。当插入的数据与原有数据存在主键或唯一键冲突时,执行REPLACE语句会先删除原有数据,再插入新的数据。
5.4 LOAD DATA
5.4.1 将文件中的数据导入到数据库指定表中。
6 其它特殊sql
6.1 ALTER SYSTEM KILL SESSION
6.1.1 ALTER SYSTEM KILL SESSION 'session_sid, serial' [ IMMEDIATE ];
7 自治事务
7.1 自治事务(Autonomous Transaction),在主事务执行过程中新启的独立的事务。自治事务的提交和回滚不会影响主事务已提交的数据,同时自治事务也不受主事务影响。
7.2 自治事务在存储过程、函数、匿名块和package中定义,用PRAGMA AUTONOMOUS_TRANSACTION关键字来声明。