客户端管理工具
客户端工具主要介绍了pgadmin 4以及psql命令的常见用法,这些内容更建议用到的时候使用,会更加熟练。
- 连接数据库
- 导入导出sql:通常使用copy命令导出,
- 导入或者导出脚本
- 设置脚本和日常定时启动维护脚本
特殊功能
- 自动补全,自动补全命令,对于大量不常见命令可以通过自动补全快速敲出命令
- watch反复执行当前sql,watch 后面跟的参数是秒数,这个命令用于调试和测试的时候比较有用
- timing:显示sql的执行时间
- 上下键查看历史命令,许多数据库基本都有的功能,但是这个功能需要编译安装的时候指定readline设置
- 终端提示,设置当前客户端命令的终端提示,可以按照指定格式存储了解当前登录用户等信息。但是需要注意对于一些存在保密系统的数据库不能显示任何和用户或者服务器相关信息
数据类型
数字类型
postgresql的数字类型对于int类型是按照字节数进行划分,比如int2相当于smallint,int4和多数数据库的int一样,而int8则是bigint类型。
另外decimal和numeric是等效的,定义的时候,有两个参数,前一个表示总位数限制,而后面表示小数位数限制,小数字位可以是0。
浮点类型在日常工作中使用情况不多,对于存储金额场景通常会用更具精确度的decimal,所以double浮点一般表示需要小数但是精度要求不高的数据。
另外有一个比较特殊的变量serial,自增序列准确来说不能算是数据类型,因为在数据变更的时候会内部生成序列号。
字符类型:
character varing表示变长,存储的时候会使用实际的长度存储,而char为定长类型,无论数据长度多少,对于未使用部分都会填充空白字符。
如果变长类型不指定长度则可以存储任意长度字符,类似text,而char如果不指定长度默认为1。
虽然是任意的,但是因为一个字段实际能表示的长度是1gb所以大小超过1g的字符是无法存储的。
字符操作函数
- char_length
- octet_length
- position x in xxxx
- substirng
- splitpart text text int
时间类型
时间类型可以通过now函数获取当前时间,另外库通过双冒号方式对于列进行转化操作比如下面写法 now():timestamp 的方式转化。除此之外还可以对于时间加减,比如加一天减一天等。
除了这些函数之外Postgre还定义了关键字快速获取当前时间或者时间戳等,比如 current_date. current_time,另外还有一个关键函数extract 获取详细的年月日时分秒等等,具体的使用可以参考文档,提供许多参数获取指定数据,用法案例如下
extract day from now()
其他类型:
Postgre还支持很多其他类型的数据类型比如布尔类型,不过Postgre的布尔类型比较坑,TRUE可以表示为 t yes on 1等等花样,都可以当做TRUE。
另外虽然布尔可以插入Null值,但是查询的时候显示的会是f
postgresql支持原生的网络ip存储,这一点挺方便的,因为ip存储通常情况下使用整型存储比较多,对于这个类型不做过多介绍,因为这种特殊类型会影响数据库可移植性。
网络类型
下面是网络类型的操作类型表
另外还有比较有意思的获取网络地址函数,有三个函数可供选择
- host:取ip
- text:ip地址和网络掩码
- network:子网掩码
数组类型
定义数组类型库适应和编程语言一样的方式,比如 a[] 这样的方式
插入数据到数组中也有很多种方式
- 通过{1,2,3}这样的形式插入数组数据
- 使用关键字array,比如array[1,2,3]
数组删除追加更新
插入数组比较简单,那么这种特殊结构如何更新删除? 这里就需要使用Postgre的函数了
- 追加数组元素:使用array_append函数往数组添加元素,比如array_append(array[1,2,3],4)这样就把4追加上去了,还有一种是使用双中竖线追加,和字符串的拼接一个操作符,[1,2,3] || 4也可以追加数组元素
- 更新数组元素:更新数组和多数编程语言一样,update array[3]
- 删除使用array_remove,案例比如array_remove(array[3])
除了增删改差之外还有其他数组的函数操作,比如获取长度,获取纬度是一维数组还是二维数字,再比如数组替换操作可以参考官方文档。
数组操作符表如下:
范围类型
范围类型专门用于表示数据类型的范围,这个看上去有点奇怪。 范围类型顾名思义就是表示某个数据类型的范围,比如整型数据范围,时间类型的范围。 适应场景为价格区间范围,日期安排等业务有可能用到。
范围类型包含上下界的关系,圆括号表示排除上下线,方括号表示包含上下限。 范围类型的标准是包含下界不包含上界,这点不受到建表的改变影响,也就是说哪怕设计字段包含上下界,显示也是包含下界不包含上界。
根据书中例子也就是[4,7)表示456但是不包含7,这是范围类型标准。
操作符 范围类型操作符比较常用的是 @>表示包含操作符,另外比较常见的操作是使用函数lower和upper获取当前范围类型的上界和下界。
json类型
这个有必要记忆一下,原生json存储支持意味着更好的存储和查询效率,省去转化的开销,但是关于这个类型的细节不少
json查询,Postgre提供丰富的函数和操作符辅助获取json内容:
- 查询某个键
- 获取json数据使用name->'col2'
- 获取原始文本可以使用两个右箭头name->>看上去比较奇怪。
另外Postgre支持两种joson存储,一种是使用jsonb的方式存储,两者的主要区别是存储json存储原文,而jsonb要存储二进制数据,所以写入的时候json快,但是检索的时候jslonb要快一些。
json函数建议用到的时候再去阅读文档了解,这里主要介绍两种追加方式,一种是双竖线追加,另一种是使用 jsonb_set函数追加json。
如果需要删除键值可以使用 # 减号或者-删除指定key。
格式转化函数
有三种格式转化操作:
- 通过cast函数进行转化
- 通过to_char等数据类型函数追加
- 通过双冒号转化数据类型。 个人认为最后一种最为方便