马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
x
1. 模式操纵
1.1. 创建数据库
CREATE DATABASE 数据库名;
1.2. 删除数据库
drop database 数据库名;
1.3. 创建用户
要创建一个角色,可以使用 CREATE ROLE 命令:
CREATE USER 和 CREATE ROLE 等效,除了 CREATE USER 默认有 LOGIN,而 CREATE ROLE 没有。具有 LOGIN 属性的角色才气连接到数据库。用户暗码要求长度至少为8位,必须含有巨细写字母、数字以及 !@#$%^&*() 特殊字符,不能含有当前用户名字符串,不能含有瀚高数据库保留字和关键字,不能使用最近五个使用过的暗码。
CREATE ROLE 用户名 LOGIN password '暗码';
CREATE USER 用户名 password 'mima';
1.4. 创建模式
create schema [if not exists] 模式名 [AUTHORIZATION 用户名];
1.5. 删除模式
drop schema [if exists] 模式名;
2. 数据表操纵
2.1. 创建数据表
- -- 语法
- create table [if not exists] [模式.]表名(
- 字段名1 字段类型1(字段长度), -- 不是;号
- 字段名2 字段类型2(字段长度),
- ....
- 字段名n 字段类型n(字段长度) -- 最后一列后面是没有,的
- );
- -- 实例
- create table if not exists test.person(
- "id" INTEGER identity(1, 1),
- "username" VARCHAR(20),
- "password" VARCHAR(50),
- "gender" CHAR(10),
- "addr" VARCHAR(100),
- primary key("id")
- );
复制代码
2.2. 常见的数据范例
2.2.1. 数字范例
HGDB 有着丰富的本地数据范例可用,用户也可以使用 CREATE TYPE 命令为 HGDB 增长新的数据范例。
数字范例由 2、4 或 8 字节的整数以及 4 或 8 字节的浮点数和可选精度小数组成。下表列出了数字范例的所有可用范例。
名字
| 存储尺寸
| 描述
| 范围
| smallint
| 2字节
| 小范围整数
| -32768 to +32767
| integer
| 4字节
| 整数的典范选择
| -2147483648 to +2147483647
| bigint
| 8字节
| 大范围整数
| -9223372036854775808 to +9223372036854775807
| decimal
| 可变
| 用户指定精度,准确
| 最高小数点前 131072 位,以及小数点后16383 位
| numeric(precision,scale)
| 可变
| 用户指定精度,准确
| 最高小数点前 131072位,以及小数点后16383 位
| real
| 4字节
| 可变精度,不准确
| 6 位十进制精度
| double precision
| 8字节
| 可变精度,不准确
| 15 位十进制精度
| smallserial
| 2字节
| 自动增长的小整数
| 1 到 32767
| serial
| 4字节
| 自动增长的整数
| 1 到 2147483647
| bigserial
| 8字节
| 自动增长的大整数
| 1 到9223372036854775807
| 2.2.1.1. 整数范例
smallint、integer、bigint。常用的范例是 integer,一般只有在磁盘空间紧张的时间才用 smallint 范例,只有在 integer 范围不敷的时间才用 bigint 范例。
2.2.1.2. 任意精度数字
numeric(precision,scale)、decimal、real、double precision。numeric 的 precision 是数中有效位的位数,包括小数点两边的数字,scale 是小数部门的位数。numeric 发起用于货币金额和其他要求盘算正确的数量。范例 decimal 和 numeric 是等效的,在圆整时,numeric 范例会圆整到阔别零的整数,而大部门情况下 real 和 double precision 范例会圆整到最近的偶数。
2.2.1.3. 浮点范例
real、double precision 是不准确的、变精度的数字范例。
2.2.1.4. 序数范例
smallserial、serial、bigserial。可以用序数范例为表创建一个自增列。范例名 serial 和 serial4 是等效的,两个都创建 integer 列。范例名 bigserial 和 serial8 是等效的,它们创建一个 bigint 列。假如预计使用的标识符数目凌驾 2^31 个,那么发起使用 bigserial。范例名 smallserial 和 serial2 也以类似方式工作,它们创建一个 smallint 列。
2.2.2. 货币范例
money 范例存储固定小数精度的货币数字,小数的精度由数据库的 lc_monetary 设置决定,表中展示的范围假设有两个小数位。money 范例可以接受的输入格式很多,包括整数和浮点数文字,以及常用的货币格式,如’$1,000.00’。 输出通常是末了一种形式,但和地区相关。
名字
| 存储尺寸
| 描述
| 范围
| money
| 8 bytes
| 货币额
| 92233720368547758.08 to +92233720368547758.07
| 由于这种数据范例的输出是地区敏感的,因此将 money 数据装入到另一个不同 lc_monetary 的数据库是不起作用的,在规复一个转储到一个新数据库中之前,应确保新数据库的 lc_monetary 设置和被转储数据库的类似大概具有等效值。
2.2.3. 字符范例
名字
| 描述
| character varying(n),varchar(n)
| 有限定的变长
| character(n),char(n)
| 定长,空格添补
| text
| 无穷变长
| n 是一个正整数,character varying(n) 、varchar(n) 、character(n)、char(n) 将存储长度不凌驾 n 位的的串。text 范例可以存储任何长度的串。这三种范例之间没有性能差别,只是 character(n) 由于可能需要额外的存储开销,因而在大多数情况下,text 大概 character varying 是更好的选择。
假如串的长度小于 n,character(n) 和 char(n) 将会用空白对剩余的长度进行添补,而 character varying(n) 和 varchar(n) 将直接存储串的内容,不会对剩余的长度进行添补。character 结尾的空白在进行两个值比较时不会进行思量,character varying 和 text 结尾的空白语意上是有含义的,在模式匹配时会进行思量。没有长度声明的 character 等效于 character(1),没有长度声明的 character varying 接受任何长度的串。varchar(n) 和 char(n) 的概念分别是 character varying(n) 和 character(n) 的别名。
2.2.4. 二进制数据范例
bytea 数据范例允许存储二进制串。
名字
| 存储尺寸
| 描述
| bytea
| 1 或 4 字节外加真正的二进制串
| 变长二进制串
| bytea 范例支持两种用于输入和输出的格式:“十六进制”格式和瀚高数据库的历史的“转义”格式。在输入时这两种格式总是会被接受,输出格式则取决于配置参数 bytea_output,其默认值为十六进制。“十六进制”格式将二进制数据编码为每个字节 2 个十六进制位,最高有效位在前,整个串以序列 \x 开头(用以和转义格式区分)。作为输入,十六进制位可以是大写也可以是小写,在位对之间可以有空白。
比方下面是一个十六进制格式。
“转义”格式是 bytea 范例的传统瀚高数据库格式,将二进制串表示成 ASCII 字符序列。通常,要转义一个字节,需要把它转换成它的三位八进制值,前导一个反斜线。反斜线自己可以双写来进行表示。
下表给出了必须被转义的字符及替换转义序列:
十进制字节值
| 描述
| 转义输入表示
| 例子
| 十六进制表示
| 0
| 0字节
| ‘\000’
| SELECT ‘\000’::bytea;
| \x00
| 39
| 单引号
| ‘’’’或’\047’
| SELECT ‘’’’::bytea;
| \x27
| 92
| 反斜线
| ‘\\‘或’\134’
| SELECT ‘\\'::bytea;
| \x5c
| 0到31和127到255
| “不可打印”字节
| ‘\xxx’(八进制值)
| SELET ‘\001’::bytea;
| \x01
| 二进制串和字符串的区别有两个:
首先,二进制串明白允许存储零值的字节以及其它“不可打印的”字节(通常是位于十进制范围 32 到 126 之外的字节)。 字符串不允许零字节,并且也不允许那些对于数据库的选定字符集编码是非法的任何其它字节值大概字节值序列。
其次,对二进制串的操纵会处理实际上的字节,而字符串的处理取决于地区设置。 简单说,二进制字串适用于存储那些程序员认为是“裸字节”的数据,而字符串适合存储文本。
2.2.5. 日期/时间范例
HGDB 支持 SQL 中所有的日期和时间范例,日期根据公向来盘算,对于该历法被引入之前的年份也一样。
下表是 HGDB 中的日期/时间范例。
名字
| 存储尺寸
| 描述
| 最小值
| 最大值
| 解析度
| timestamp [ (p) ] [ without time zone ]
| 8字节
| 包括日期和时间(无时区)
| 4713BC
| 294276AD
| 1微秒
| timestamp [ (p) ] with time zone
| 8字节
| 包括日期和时间,有时区
| 4713BC
| 294276AD
| 1微秒
| date
| 4字节
| 日期(没有一天中的时间)
| 4713BC
| 5874897AD
| 1日
| time [ (p) ] [ without time zone ]
| 8字节
| 一天中的时间(无日期)
| 00:00:00
| 24:00:00
| 1微秒
| time [ (p) ] with time zone
| 12字节
| 仅仅是一天中的时间(没有日期),带有时区
| 00:00:00+1459
| 24:00:00-1459
| 1微秒
| interval [ fields ] [ (p) ]
| 16字节
| 时间间隔
| -178000000年
| 178000000年
| 1微秒
| HGDB 中,timestamp 等效于 timestamp without time zone,timestamptz 被接受为 timestamp with time zone 的一种简写。
time、timestamp 和 interval 接受一个可选的精度值 p,这个精度值声明在秒域中小数点之后保留的位数,p 允许的范围是从0到6,缺省情况下,在精度上没有明白的边界。
interval 范例有一个附加选项,可以通过写下面之一的短语来限定存储的 fields 的聚集:
YEAR、MONTH、DAY、HOUR、MINUTE、SECOND、
YEAR TO MONTH、DAY TO HOUR、DAY TO MINUTE、DAY TO SECOND、
HOUR TO MINUTE、HOUR TO SECOND、MINUTE TO SECOND
注意假如 fields 和 p 被指定,fields 必须包括 SECOND,因为精度只应用于秒。
2.2.5.1. 日期/时间输入
所有日期大概时间在输入时都需要由单引号包围,就像一个文本字符串一样。
日期和时间的输入可以接受几乎任何公道的格式,包括 ISO 8601、SQL-兼容的、传统的和其他的形式。DateStyle 参数可以指定日期输入的格式,MDY 是“月-日-年”,DMY 是“日-月-年”,YMD 是“年-月-日”。
下表表现了 date 范例可能的输入方式。、
例子
| 描述
| 1999-01-08
| ISO 8601;任何模式下的1月8日(推荐格式)
| January 8,1999
| 在任何 DateStyle 输入模式下都无歧义
| 1/8/1999
| MDY 模式中的1月8日;DMY 模式中的8月1日
| 1/18/1999
| MDY 模式中的1月18日;在其他模式中被拒绝
| 01/02/03
| MDY 模式中的2003年1月2日;
DMY 模式中的2003年2月1日;
YMD 模式中的2001年2月3日
| 1999-Jan-08;
Jan-08-1999;
08-Jan-1999
| 任何模式下的1月8日
| 99-Jan-08
| YMD 模式中的1月8日,否则错误
| 08-Jan-99
Jan-08-99
| 1月8日,除了在 YMD 模式中错误
| 19990108
990108
| ISO 8601;任何模式中的1999年1月8日
| 1999.008
| 年和一年中的日子
| J2451187
| 儒略日期
| January 8, 99 BC
| 公元前99年
| 时间:当日时间范例是 time [ (p) ] without time zone 和 time [ (p) ] with time zone,只写 time 等效于 time without time zone。这些范例的有效输入由当日时间反面跟着可选的时区组成,时间范例中指定的日期会被忽略,除非使用了一个涉及到夏令时规则的时区,比方 America/New_York。time without time zone 中指定的时区也会被无声地忽略。
例子
| 描述
| 04:05:06.789
| ISO 8601
| 04:05:06
| ISO 8601
| 04:05
| ISO 8601
| 040506
| ISO 8601
| 04:05 AM
| 和 04:05 一样,AM 并不影响值
| 04:05 PM
| 和 16:05 一样,输入的小时必须 <= 12
| 04:05:06.789-8
| ISO 8601
| 04:05:06-08:99
| ISO 8601
| 04:05-08:00
| ISO 8601
| 040506-08
| ISO 8601
| 04:05:06 PST
| 缩写指定的时区
| 2003-04-12 04:05:06 America/New_York
| 全名指定的时区
| 2.2.6. 布尔范例
HGDB 提供尺度的 SQL 范例 boolean。boolean 可以有多个状态:“true(真)”、“false(假)” 和第三种状态 “ unknown(未知)”,未知状态由 SQL 空值表示。
名字
| 存储字节
| 描述
| boolean
| 1字节
| 状态为真或假
| 在 SQL 查询中,布尔常量可以表示为 SQL 关键字 TRUE、FALSE、NULL。但是语法分析程序不会把 NULL 自动理解为 boolean 范例,因为它可以是任何范例的,必要时可以将它表现转换为 boolean 范例:NULL::boolean。
boolean 范例的数据范例输入函数接受这些字符串表示“真”状态:true、yes、on、1;接受这些表示为“假”状态:false、no、off、0。这些字符串的唯一前缀也可以接受,比方 t 或 n。字符串前端或尾部的空格将被忽略,并且巨细写不敏感。
boolean 范例的数据范例输出函数总是发出 t 或 f。
2.2.7. 枚举范例
枚举(enum)范例是由一个静态、值的有序聚集构成的数据范例。枚举范例的一个例子可以是一周中的日期,大概一个数据的状态值聚集。枚举范例可以使用 CREATE TYPE 命令创建。
比方创建并应用一个枚举范例:
- highgo=# CREATE TYPE mood AS ENUM ('sad', 'ok', 'happy');
- CREATE TYPE
- highgo=# CREATE TABLE person (
- name text,
- current_mood mood
- );
- CREATE TABLE
- highgo=# INSERT INTO person VALUES ('Moe', 'happy');
- INSERT 0 1
- highgo=# SELECT* FROM person WHERE current_mood='happy';
- name | current_mood
- ------+--------------
- Moe | happy
- (1 行记录)
复制代码 在排序的时间,一个枚举范例的值的排序是该范例被创建时所列出的值的次序,比如上面创建的 mood 范例的排序为 sad、ok、happy。
只管枚举范例的重要目标是用于值的静态聚集,但也有方法在现有枚举范例中增长新值和重命名值。不可以从枚举范例中去除现有的值,也不能更改这些值的排序次序,假如要那样做可以删除并且重修枚举范例。
比方创建并应用新的枚举范例 happiness:
- highgo=# CREATE TYPE happiness AS ENUM ('happy', 'very happy', 'ecstatic');
- CREATE TYPE
- highgo=# CREATE TABLE holidays (
- highgo(# num_weeks integer,
- highgo(# happiness happiness
- highgo(# );
- CREATE TABLE
- highgo=# INSERT INTO holidays VALUES (4,'happy'),(6,'very happy'),(8,'ecstatic');
- INSERT 0 3
- highgo=# INSERT INTO holidays VALUES (2,'sad');
- 错误: 对于枚举happiness的输入值无效: "sad"
- highgo=# SELECT person.name,holidays.num_weeks FROM person,holidays WHERE person.current_mood = holidays.happiness;
- 错误: 操作符不存在: mood = happiness
复制代码 每一种枚举数据范例都是独立的并且不能和其他枚举范例相比较。不同的枚举范例中即便存在类似的范例,它们之间也不能进行比较。假如你确实需要做如许的事情,可以写一个自界说的操纵符大概在查询中加上显式造型:
- highgo=# SELECT person.name,holidays.num_weeks,person.current_mood,holidays.happiness FROM person,holidays WHERE person.current_mood::text = holidays.happiness::text;
- name | num_weeks | current_mood | happiness
- ------+-----------+--------------+-----------
- Moe | 4 | happy | happy
- (1 行记录)
复制代码 2.2.8. 数组范例
2.2.8.1. 数组范例界说和插入
HGDB 允许一个表中的列界说为变长多维数组,可以创建任何内建或用户界说的基类、枚举范例、组合范例大概域范例的数组。
一个数组数据范例可以通过在数组元素的数据范例名称反面加上方括号([])来命名。CREATE TABLE 的语法允许指定命组的确切巨细,假如不进行指定,那么数据的长度和维度都不受限定。实际上,CREATE TABLE 中声明数组的尺寸或维度仅仅只是文档而已,它并不影响运行时的行为。
比方在创建表 grape 时将 taste 界说为长度为1的数组,将 info 界说为长度不限定的数组:
- CREATE TABLE grape (taste text[1],info int[][]);
- INSERT INTO grape VALUES ('{sweet}','{1,2,3}'),('{sour}','{4,5,6}');
- INSERT INTO grape VALUES ('{sweet,sour,sweet_and_sour}');
- INSERT INTO grape VALUES('{sweet}','{{1},{2}}');
- INSERT INTO grape VALUES('{bad}','{0,0,0}');
复制代码 还可以用关键词 ARRAY 界说一维数组。同前面一样,数组可以不指定尺寸,并且 HGDB 在任何情况下都不会逼迫尺寸限定。
- CREATE TABLE grape_(info int ARRAY[4]);
- INSERT INTO grape_ VALUES(ARRAY[10,20]);
- INSERT INTO grape_ VALUES('{12,6}');
复制代码 注意,插入多条多维数组时,多维数组的每一维都必须有相匹配的长度,不匹配会造成错误。
2.2.8.2. 访问数组
访问数组中的元素时,可以将数组下标写在方括号内,HGDB 默认数组下标从1开始。
- highgo=# SELECT taste FROM grape WHERE info[1]=1;
- taste
- ---------
- {sweet}
- (1 行记录)
复制代码 假如数组自己为空大概任何一个下标表达式为空,访问数组下标表达式将会返回空值。假如下标凌驾了数组边界,下标表达式也会返回空值(这种情况不会抛出错误)。相似地,使用错误的下标号引用一个数组会得到空值而不是错误。
2.2.8.3. 修改数组
数组可以作为一个数组值被整个替换,也可以在某一个元素上被更新。
- UPDATE grape SET taste='{sweet_and_sour}' where taste='{sweet,sour,sweet_and_sour}';
- UPDATE grape SET info='{100,0,0}' WHERE taste='{sweet}';
- UPDATE grape SET info=ARRAY[0,100,0] WHERE taste='{sour}';
- UPDATE grape SET info[1]=50,info[2]=50 WHERE taste='{sweet_and_sour}';
复制代码 2.2.8.4. 在数组中搜索
要搜索数组中值的”存在“情况,可以用关键字 ANY 来实现。比方搜索 info 数组内里所有出现元素100的数据:
- highgo=# SELECT* FROM grape WHERE '100'= ANY(info);
- taste | info
- ---------+-----------
- {sweet} | {100,0,0}
- {sweet} | {100,0,0}
- {sour} | {0,100,0}
- (3 行记录)
复制代码 假如存在一个数组的所有元素值都类似,可以用关键字 ALL 来进行搜索。比方搜索info数组中所有元素的值都为0的数据:
- highgo=# SELECT* FROM grape WHERE '0'= ALL(info);
- taste | info
- -------+---------
- {bad} | {0,0,0}
- (1 行记录)
复制代码 2.2.9. 其他范例
2.2.9.1. 几何范例
几何数据范例表示二维的空间物体。
名字
| 存储尺寸
| 表示
| 描述
| point
| 16字节
| 平面上的点
| (x,y)
| line
| 32字节
| 无穷长的线
| {A,B,C}(A、B都不为0)
| lseg
| 32字节
| 有限线段
| ((x1,y1),(x2,y2))
| box
| 32字节
| 矩形框
| ((x1,y1),(x2,y2))
| path
| 16+16n 字节
| 封闭路径(类似于多边形)
| ((x1,y1),…)
| path
| 16+16n 字节
| 开放路径
| [(x1,y1),…]
| polygon
| 40+16n 字节
| 多边形(类似于封闭路径)
| ((x1,y1),…)
| circle
| 24字节
| 圆
| <(x,y),r>(中央点和半径)
| 2.2.9.2. 网络地址范例
HGDB 提供用于存储 IPv4、IPv6 和 MAC 地址的数据范例。 用这些数据范例存储网络地址比用纯文本范例好,因为这些范例提供输入错误查抄以及特殊的操纵符和函数。
名字
| 存储尺寸
| 描述
| cidr
| 7或19字节
| IPv4 和 IPv6 网络
| inet
| 7或19字节
| IPv4 和 IPv6 主机以及网络
| macaddr
| 6字节
| MAC 地址
| macaddr8
| 8 byte
| MAC 地址(EUI-64 格式)
| 在对 inet 大概 cidr 数据范例进行排序的时间, IPv4 地址将总是排在 IPv6 地址前面,包括那些封装大概是映射在 IPv6 地址里 的 IPv4 地址,比方 ::10.2.3.4 大概 ::ffff::10.4.3.2。
2.2.9.3. 位串范例
位串就是一串 1 和 0 的串,它们可以用于存储和可视化位掩码。
名字
| 描述
| bit(n)
| 定长
| bit varying(n)
| 变长
| n 是一个正整数,bit 范例的数据必须正确匹配长度 n,更短或更长的位串都会被拒绝;bit varying 数据是最长位数为 n 的变长范例。写一个没有长度的 bit 等效于 bit(1),没有长度的 bit varying 意味着没有长度限定。位串范例在输入时也需要用单引号包围。
2.2.9.4. 文本搜索范例
HGDB 提供两种数据范例:tsvector 和 tsquery,它们被设计用来支持全文搜索,全文搜索是一种在自然语言的文档聚集中搜索以定位那些最匹配一个查询的文档的活动。
名字
| 描述
| tsvector
| tsvector 范例表示一个为文本搜索优化的形式下的文档,tsvector 的值是一个排序的可区分词位的列表。
| tsquery
| tsquery 范例表示一个文本查询,一个 tsquery 值存储用于搜索的词位,并且使用布尔操纵符 &(AND),|(OR) 和 !(NOT) 来组合它们。
| 2.2.9.5. UUID范例
数据范例 uuid 存储由 RFC 4122、ISO/IEC 9834-8:2005 以及相关尺度界说的通用唯一标识符(UUID),这种标识符是一个 128 位的量。
一个 UUID 被写成一个小写十六进制位的序列,该序列被连字符分隔成多个组:首先是一个 8 位组,接下来是三个 4 位组,末了是一个 12 位组。总共的 32 位(十六进制位)表示了 128 个二进制位,这是 UUID 范例的尺度形式。
瀚高数据库也接受另一种输入形式:使用大写位、尺度格式被花括号包围、忽略某些大概全部连字符、在任意 4 位组反面增长一个连字符。
格式
| 示例
| 尺度形式
| a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11
| 非尺度形式
| A0EEBC99-9C0B-4EF8-BB6D-6BB9BD380A11
{a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11}
a0eebc999c0b4ef8bb6d6bb9bd380a11
a0ee-bc99-9c0b-4ef8-bb6d-6bb9-bd38-0a11
{a0eebc99-9c0b4ef8-bb6d6bb9-bd380a11}
| 2.2.9.6. XML范例
xml 数据范例可以被用来存储 XML 数据。它比直接在一个 text 域中存储 XML 数据的上风在于,它会查抄输入值的结构是否精良,并且有支持函数用于在其上实行范例安全的操纵。
创建xml值:
要从字符数据中天生一个 xml 范例的值,可以使用函数 xmlparse。
- XMLPARSE({DOCUMENT|CONTENT}value)
复制代码 比方:
- XMLPARSE (DOCUMENT '<?xml version="1.0"?><book><title>Manual</
- title><chapter>...</chapter></book>')
- XMLPARSE (CONTENT 'abc<foo>bar</foo><bar>foo</bar>')
复制代码 然而根据 SQL 尺度这是唯一将字符串转换为 XML 值的方法,HGDB 另有特有的语法:
- xml'<foo>bar</foo>'
- '<foo>bar</foo>'::xml
复制代码 从 xml 产生一个字符串的逆操纵可以使用函数 xmlserialize:
- XMLSERIALIZE ( { DUCUMENT | CONTENT } value AS type )
复制代码 type 可以是 character、character varying 或 text(大概其中之一的一个别名)。
2.2.9.7. JSON范例
JSON 数据范例是用来存储 JSON(JavaScript Object Notation)数据的。这种数据也可以被存储为 text,但是 JSON 数据范例的上风在于能逼迫要求每个被存储的值符合 JSON 规则,也有很多 JSON 相关的函数和操纵符可以用于存储在这些数据范例中的数据。
HGDB 提供存储 JSON 数据的两种范例:json 和 jsonb。json 和 jsonb 数据范例接受几乎完全类似的值聚集作为输入,重要的实际区别之一是效率。json 数据范例存储输入文本的精准拷贝,实行时需重新解析数据。jsonb 数据被存储在一种分解好的二进制格式中,输入慢,处理快,因为输入时需要做附加的转换,而在处理时不需要解析,jsonb 也支持索引,这也是一个令人瞩目标上风。除非特殊需要,大多数应用应该更愿意把 JSON 数据存储为 jsonb。
JSON 输出简单标量和数组如下所示:
- SELECT '5'::json;
- SELECT '[1,2,"foo",null]'::json;
复制代码 2.2.9.8. 组合范例
一个组合范例表示一行或一个记录的结构,它本质上就是一个域名和它们数据范例的列表。HGDB 允许把组合范例用在很多能用简单范例的地方。比方,一个表的一列可以被声明为一种组合范例。
2.2.9.8.1. 组合范例的界说
创建一个组合范例通过 CREATE TYPE 来完成,比方创建一个 complex 组合范例。
- CREATE TYPE complex AS (
- r double precision,
- i double precision
- );
复制代码 该语法堪比 CREATE TABLE ,不过只能指定域名和范例,不能包括约束,注意 AS 关键字这里不能省略。
下面用创建的组合范例来创建表:
- CREATE TABLE complex_(co complex);
- INSERT INTO complex_ VALUES ('(3.1415926,2.71828)');
复制代码 2.2.9.8.2. 组合范例的输入
要把一个组合值写作一个文字常量,将该域值封闭在圆括号中并且用逗号分隔他们。可以在任何域值四周放上双引号,并且假如该值域包含逗号或圆括号则必须如许做。
一个组合常量的一般格式如下:
'(val1,val2,...)'
比方 inventory_item 复合范例的一个合法值是如许的:
- CREATE TYPE inventory_item AS (
- name text,
- supplier_id integer,
- price numeric
- );
- '("fuzzy dice",42,1.99)'
复制代码 2.2.9.8.3. 访问组合范例
要访问一个组合列的一个域,可以写成一个点和域的名称,为制止被认为是从一个表中选择一个域,因此需要用圆括号将组合列括起来。
假设用上面创建的 iventory_item 复合范例在表 on_hand 中创建了一个名为 item 的属性,可以写一个如许的查询语句:
- SELECT (item).name FROM on_hand WHERE (item).price>9.99;
复制代码 也可以将表名也表示到圆括号内里:
- SELECT (on_hand.item).name FROM on_hand WHERE (on_hand.item).price>9.99;
复制代码 2.2.9.9. 范围范例
范围范例是表达某种元素范例(称为范围的 subtype)的一个值的范围的数据范例。比方,timestamp 的范围可以被用来表达一个会议室被保留的时间范围,在这种情况下,数据范例是 tsrange(“timestamp range”的简写)而 timestamp 是 subtype。
HGDB 中带有以下内建范围范例:
• int4range — integer 的范围
• int8range — bigint 的范围
• numrange — numeric 的范围
• tsrange — 不带时区的 timestamp 的范围
• tstzrange — 带时区的 timestamp 的范围
• daterange — date 的范围
也可以通过 CREATE TYPE 来界说自己的范围范例。
范围范例的使用可以通过下面的例子来实现:
- CREATE TABLE reservation (room int, during tsrange);
- INSERT INTO reservation VALUES (1108,'[2010-01-01 14:30,2010-01-01 15:30]');
- --包含
- SELECT int4range(10,20)@>3;
- --重叠
- SELECT numrange(11.1,22.2)&&numrange(20.0,30.0);
- --抽取上届
- SELECT upper(int8range(15,25));
- --计算交集
- SELECT int4range(10,20)*int4range(15,25);
- --范围为空吗?
- SELECT isempty(numrange(1,5));
复制代码 一个范围值的输入必须遵循下列模式之一:
- (lower-bound,upper-bound)
- (lower-bound,upper-bound]
- [lower-bound,upper-bound)
- [lower-bound,upper-bound]
- empty
圆括号或方括号指示上下界是否为清除的大概包含的,圆括号 ’()‘ 为不包含,方括号 ‘[]’ 为包含。注意末了一个模式是 empty,它表示一个空范围(一个不包含点的范围)。
lower-bound 可以是作为 subtype 的合法输入的一个字符串,大概是空表示没有下界。同样,upper-bound 可以是作为 subtype 的合法输入的一个字符串,大概是空表示没有上界。一个范围的下界被忽略意味着所有小于上界的值都被包括在范围中,比方(,3]。 同样,假如范围的上界被忽略,那么所有比上界大的值都被包括在范围中。假如上下界都被忽略,该元素范例的所有值都被认为在该范围中。
2.2.9.10. 域范例
域是一种用户界说的数据范例,它基于另一种底层范例。根据需要,它可以有约束来限定其有效值为底层范例所允许值的一个子集。假如没有约束,它的行为就和底层范例一样——比方,任何适用于底层范例的操纵符或函数都对该域范例有效。底层范例可以是任何内建大概用户界说的基础范例、枚举范例、数组范例、组合范例、范围范例大概另一个域。
比方,我们可以在整数之上创建一个域,它只接受正整数:
- CREATE DOMAIN posint AS integer CHECK(VALUE>0);
- CREATE TABLE mytable(id posint);
- INSERT INTO mytable VALUES(1);
- INSERT INTO mytable VALUES(-1);
复制代码 如此第一条数据插入乐成,第二条数据插入失败。
当底层范例的一个操纵符或函数适用于一个域值时,域会被自动向下造型为底层范例。因此,mytable.id - 1 的结果会被认为是范例 integer 而不是 posint。
2.2.9.11. 对象标识符范例
对象标识符(OID)被 HGDB 用来在内部作为多个系统表的主键。 范例 oid 表示一个对象标识符。 也有多个 oid 的别名范例:regproc,regprocedure,regoper,regoperator,regclass,regtype,regrole,regnamespace,regconfig 和 regdictionary。
名字
| 引用
| 描述
| 值示例
| oid
| 任意
| 数字形式的对象标识符
| 564182
| regproc
| pg_proc
| 函数名字
| sum
| regprocedure
| pg_proc
| 带参数范例的函数
| sum(int4)
| regoper
| pg_operator
| 操纵符名字
| +
| regoperator
| pg_operator
| 带参数范例的操纵符
| *(integer,integer) or -(NONE,integer)
| regclass
| pg_class
| 关系名字
| pg_type
| regtype
| pg_type
| 数据范例名字
| integer
| regrole
| pg_authid
| 角色名
| smithee
| regnamespace
| pg_namespace
| 名字空间名称
| pg_catalog
| regconfig
| pg_ts_config
| 文本搜索配置
| english
| regdictionary
| pg_ts_dict
| 文本搜索字典
| simple
| 2.2.9.12. pg_lsn范例
pg_lsn 数据范例可以被用来存储 LSN(日记序列号)数据,LSN 是一个指向 WAL 中的位置的指针。这个范例是 XLogRecPtr 的一种表达并且是 HGDB 的一种内部系统范例。
在内部,一个 LSN 是一个 64 位整数,表示在预写式日记流中的一个字节位置。它被打印成两个最高 8 位的十六进制数,中央用斜线分隔,比方 16/B374D848。pg_lsn 范例支持尺度的比较操纵符,如 = 和 >。两个 LSN 可以用 - 操纵符做减法, 结果将是分隔两个预写式日记位置的字节数。
2.2.9.13. 伪范例
HGDB 范例系统包含了一些特殊目标的项,它们被统称为伪范例。一个伪范例不能被用作一个列的数据范例,但是它可以被用来界说一个函数的参数大概结果范例。每一种可用的伪范例都有其可以发挥作用的情况,这些情况的特点是一个函数的行为并不能符合于简单使用大概返回一种特定 SQL 数据范例的值。下表列出了现有的伪范例。
名字
| 描述
| any
| 表示一个函数可以接受任意输入数据范例
| anyelement
| 表示一个函数可以接受任意数据范例
| anyarray
| 表示一个函数可以接受任意数组数据范例
| anynonarray
| 表示一个函数可以接受任意非数组数据范例
| anyenum
| 表示一个函数可以接受任意枚举数据范例
| anyrange
| 表示一个函数可以接受任意范围数据范例
| cstring
| 表示一个函数接受大概返回一个非空结尾的C字符
| internal
| 表示一个函数接受或返回一个服务器内部数据范例
| language_handler
| 一个被声明为返回 language_handler 的过程语言调用处理器
| fdw_handler
| 一个被声明为返回 fdw_handler 的外部数据包装器处理器
| index_am_handler
| 一个被声明为返回 index_am_handler 索引访问方法处理器
| tsm_handler
| 一个被声明为返回 tsm_handler 的表采样方法处理器
| record
| 表示一个接受大概返回一个为未指定的行范例的函数
| trigger
| 一个被声明为返回 trigger 的触发器函数
| event_trigger
| 一个被声明为返回 event_trigger 的事件触发器函数
| pg_ddl_command
| 表示一种对事件触发器可用的 DDL 命令的表达
| void
| 表示一个函数不返回值
| unknown
| 表示一种还未被解析的范例,比方一个未修饰的字符文本
| opaque
| 一种已被废弃的范例名称,以前它用于实现以上的很多种目标
| 2.3. 修改数据表
2.3.1. 添加一列
ALTER TABLE 模式名.表名 ADD 字段名 列范例;
2.3.2. 修改范例
只有当列中的每一个项都能通过一个隐式造型转换为新的范例时该操纵才气乐成。
HGDB 将实验把列的默认值转换为新范例,其他涉及到该列的任何约束也是一样。但是这些转换可能失败大概产生奇特的结果,因此最好在修改范例之前先删除该列上所有的约束,修改完范例后再重新加上相应修改过的约束。
ALTER TABLE 模式名.表名 ALTER COLUMN 列名 TYPE 列范例;
2.3.3. 修改列名
ALTER TABLE 模式名.表名 RENAME COLUMN 旧列名 TO 新列名;
2.3.4. 删除指定列
ALTER TABLE 模式名.表名 DROP COLUMN 列名;
2.3.5. 修改表名
ALTER TABLE 模式名.表名 RENAME TO 新表名;
2.4. 删除数据表
DROP TABLE [if exists] 模式名.表名;
3. 数据操纵
3.1. 插入数据
3.1.1. 基本方式
INSERT INTO 模式名.表名(字段1,字段2,.....字段n) VALUES(值1,值2,.....值n);
例:
insert into test.student("id","name","birthday") values(5,'小兰','1990-01-01');
3.1.2. 批量插入
INSERT INTO 模式名.表名(字段1,字段2,.....字段n) VALUES(值1,值2,.....值n),(值1,值2,.....值n),(值1,值2,.....值n);
3.1.3. 省略列名
INSERT INTO 模式名.表名 VALUES(值1,值2,.....值n),(值1,值2,.....值n),(值1,值2,.....值n);
3.2. 修改数据
UPDATE 模式名.表名 SET 字段1=值1,字段2=值2 [WHERE 条件字段 = 值];
3.3. 删除数据
DELETE FROM 模式名.表名 [WHERE 字段=值2];
3.4. 查询数据
3.4.1. 简单查询
3.4.1.1. 查询所有列
SELECT * FROM 模式名.表名;
3.4.1.2. 查询部门列
select 列1名,列2名,...列n名 from 模式名.表名;
3.4.1.3. 去重
SELECT DISTINCT 列名 FROM 模式名.表名;
3.4.1.4. 四则运算
SELECT 列(四则) FROM 模式名.表名;
3.4.1.5. 空值处理
ifnull(列,默认值)
3.4.1.6. 别名
select 列 [as] 别名 from 模式名.表名;
3.4.2. 条件查询
3.4.2.1. 关系运算符
= >= <= != <>
3.4.2.2. 逻辑运算符
and or
3.4.2.3. 范围关键字
- 字段 in (值1,值2,....值n) 表示字段=聚集中的任何一个都可以
- 字段 not in (值1,值2,....值n) 表示字段不在聚集中才可以
- 字段 between 开始值 and 结束值 查询的字段的值要在 [开始 , 结束]
- 字段 not between 开始值 and 结束值 查询的字段的不值要在 [开始 , 结束]
3.4.2.4. null关键字
- is null 为空
- is not null 不为null
3.4.2.5. 模糊匹配
like
3.4.3. 高级查询
- 排序: order by 列 [asc|desc]
- 截取: limit 开始,几个
- 聚合函数: count(列)
- 分组: group by 列
- 过滤: having 过滤条件
- 普通条件: where
高级查询的次序:
select 聚合函数() from 表 [where 条件] [group by 分组] [having 过滤] [order by 排序] [limit 截取]
4. 数据库约束
- 主键约束:primary key
- 唯一约束:unique
- 非空约束:not null
- 默认值:default(默认值)
- 外键约束:[constraint 约束名: xxx_fk] foreign key (列名) references 主表(主键)
5. 多表查询
- 内连接:(inner) join
- 左外连接:left (outer) join
- 右外连接:right (outer) join
- 子查询
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |