PostgreSQL数据类型及基本操作

一、数据类型

详细查看:中文官方文档
在这里插入图片描述

二、对比MySQL

名字说明对比MySQL
整数类型smallint(2字节),integer(4字节),bigint(8字节)无区别
浮点类型decimal,numeric(和decimal是等效的),real(float),double precision(double),money(货币类型)MySQL不支持 货币类型
字符类型varchar(n),char(n),text无区别
日期/时间类型date(年月日),time(时分秒),timestamp(年月日时分秒)【time和timestamp可以设置时区】MySQL多了一个datetime
布尔类型booleanMySQL中的tinyint类型与之对应,都是1字节
枚举类型enum无区别
几何类型点、线、圆、多边形、路径…MySQL不支持
数组类型在类型后,追加[],代表存储数组MySQL不支持
JSON类型文本 JSON 数据、二进制 JSON 数据jsonbMySQL8.x才支持
等等其它不常用的

三、基本操作

1、单引号和双引号

  • 单引号:用来标识实际的值
  • 双引号:用来标识关键字

比如,下面的key会报错
在这里插入图片描述

2、数据类型转换

方式1:数据类型 值
在值的前面加上具体数据类型

-- 将字符串转成int4类型
select int '123';

方式2:值 :: 数据类型
在值的后面加上具体数据类型,用::拼接

-- 将字符串转成date类型
select '2023-12-18'::date;'

方式3:使用CAST函数
CAST(当前类型 值 as 转后的类型)

select CAST(varchar '123' as int);

3、数字类型

在这里插入图片描述

1)整数

有3个类型,如下:

  • smallint、int2:2字节
  • integer、int、int4:4字节
  • bigint、int8:8字节

2)浮点数

浮点类型就关注2个,但两个基本等效

  • decimal(n,m):本质就是numeric,PGSQL会帮你转换
  • numeric(n,m):PGSQL本质的浮点类型
    针对浮点类型的数据,底层使用的是 numeric

3)序列

构建方式使用方式如下:

-- 构建序列
create sequence forlanSchema.table_id_seq;
-- 查询下一个值
select nextval('forlanSchema.table_id_seq');
-- 查询当前值
select currval('forlanSchema.table_id_seq');

默认情况下,seqeunce的起始值是0,每次nextval递增1,最大值9223372036854775807

一般用作表的主键自增效果,如下:

-- 表自增
create table forlanSchema.xxx(
    id int8 default nextval('forlanSchema.table_id_seq'),
    name varchar(16)
);
insert into forlanSchema.xxx (name) values ('xxx');
select * from forlanSchema.xxx;

上面的写法很麻烦,其实PostgreSQL提供了序列的数据类型,可以在声明表结构时,直接指定序列的类型即可。
针对不同类型都有各自的序列自增

  • smallserial
  • serial
  • bigserial
-- 表自增
create table forlanSchema.xxx(
    id bigserial,   
    name varchar(16)
);
insert into forlanSchema.xxx(name) values ('xxx');

4)常见操作

操作符描述示例结果
+5 + 38
-11 - 38
*2 * 38
/10 / 33
%取余10 % 31
^2 ^ 38
|/平方根|/ 366
@绝对值@ -55
&31 & 1616
|31|3263
<<左移1<<12
>>右移16>>18

除了上面这些,还有一些函数计算,比如pi(),round(数值,位数),floor(),ceil()

4、 字符串类型

字符串类型用的是最多的一种,PostgreSQL主要支持三种:

  • character varying(n), varchar(n),有限制的变长
  • character(n), char(n),定长,空格填充
  • text,无限变长

常见字符串函数:
字符串的拼接一要要使用||来拼接。

其他的函数,可以查看官方中文文档

5、 日期类型

在PostgreSQL中,核心的时间类型,就三个:

  • timestamp(时间戳,覆盖 年月日时分秒)
  • date(年月日)
  • time(时分秒)

1)声明时间

只需要使用字符串正常的编写 yyyy-MM-dd HH:mm:ss 就可以转换为时间类型。
在字符串位置使用数据类型转换就可以了。

  • 可以使用now作为当前系统时间
  • 也可以使用current_timestamp的方式获取(推荐,默认东八区)
-- 直接查询now,无时区
select timestamp 'now';
-- 直接查询now,有时区
select time with time zone 'now' at time zone '08:00:00'

2)日期类型的运算

  • 正常对date类型做+,-操作,默认单位就是天~
  • date + time = timestamp~~~
select date '2011-11-11' + time '12:12:12' ;
  • 可以针对timestamp使用interval的方式进行 +,-操作,在查询以时间范围为条件的内容时,可以使用
select timestamp '2011-11-11 12:12:12' + interval '1day' + interval '1minute' + interval '1month';

6、 布尔类型

布尔类型,可以存储三个值有:true,false,null

-- 布尔类型的约束没有那么强,true,false大小写随意,他会给你转,同时yes,no这种他也认识,但是需要转换
select true,false,'yes'::boolean,boolean 'no',True,FaLse,NULL::boolean;

布尔类型在做and和or的逻辑操作时,结果如下:

字段A字段Ba and ba or b
truetruetruetrue
truefalsefalsetrue
trueNULLNULLtrue
falsefalsefalsefalse
falseNULLfalseNULL
NULLNULLNULLNULL

7、 枚举类型

枚举类型MySQL也支持,只是没怎么用,PostgreSQL同样支持这种数据类型

可以声明枚举类型作为表中的字段类型,用来约束字段的值。

-- 声明一个星期的枚举,值自然只有周一~周日。
create type week as enum ('Mon','Tues','Sun');
-- 声明一张表,表中的某个字段的类型是上面声明的枚举。
drop table test;
create table test(
    id bigserial ,
    weekday week
);
insert into test (weekday) values ('Mon');
-- 这个会报错,因为不存在该枚举值
insert into test (weekday) values ('Fri');

8、IP类型

PostgreSQL支持IP类型的存储,支持IPv4,IPv6这种,甚至Mac内种诡异类型也支持这种IP类型,可以在存储IP时,帮助做校验,其次也可以针对IP做范围查找。

IP校验效果,256已经超出了范围
在这里插入图片描述

IP也支持范围查找
image.png

9、 JSON&JSONB类型

JSON在MySQL8.x中也做了支持,但是MySQL支持的不好,因为JSON类型做查询时,基本无法给JSON字段做索引。
本质上JSON格式就是一个字符串,比如MySQL5.7不支持JSON的情况的下,使用text也可以,但是字符串类型无法校验JSON的格式,其次单独的字符串没有办法只获取JSON中某个key对应的value。

PostgreSQL支持JSON类型以及JSONB类型,两者使用基本无区别。

JSON和JSONB的区别:

  • JSON类型无法构建索引,JSONB类型可以创建索引。
  • JSON类型的数据中多余的空格会被存储下来。JSONB会自动取消多余的空格。
  • JSON类型甚至可以存储重复的key,以最后一个为准。JSONB不会保留多余的重复key,覆盖更新。
  • JSON会保留存储时key的顺序,JSONB不会保留原有顺序。

JSON中key对应的value的数据类型

JSONPGSQL
Stringtext
numbernumeric
booleanboolean
null(none)
[
  {"name": "张三"},
  {"name": {
      "info": "xxx"
    }}

]

操作JSON:

  • 四种JSON存储的类型:
  select '8'::JSON,'null'::JSON,'"forlan"'::JSON,'true'::json;
  select '8'::JSONB,'null'::JSONB,'"forlan"'::JSONB,'true'::JSONB;
  • JSON数组
select '[9,true,null,"我是字符串"]'::JSON;
  • JSON对象
select '{"name": "张三","age": 23,"birthday": "2023-12-18","gender": null}'::json;
select '{"name": "张三","age": 23,"birthday": "2023-12-18","gender": null}'::jsonb;
  • 构建表存储JSON
  create table test(
      id bigserial,
      info json,
      infob jsonb
  );
  insert into
    test
  (info,infob)   
    values 
  ('{"name":            "张三"              ,"age": 23,"birthday": "2011-11-11","gender": null}',
  '{"name":               "张三"             ,"age": 23,"birthday": "2011-11-11","gender": null}')
  select * from test;
  • 构建索引
create index jsonb_index on test(infob);

JSON还支持很多函数,具体可以查看9.15. JSON 函数和操作符

10、 复合类型

复合类型就好像Java中的一个对象,Java中有一个User,User和表做了一个映射,User中有个人信息对象。可以基于符合类型对映射上个人信息。

public class User{
   private Integer id;
   private Info info;
}

class Info{
   private String name;
   private Integer age;
}

按照上面的情况,将Info构建成一个复合类型

-- 构建复合类型,映射上Info
create type info_type as (name varchar(32),age int);
-- 构建表,映射User
create table tb_user(
    id serial,
    info info_type
);
-- 添加数据
insert into tb_user (info) values (('张三',23));
insert into tb_user (info) values (('露丝',233));
insert into tb_user (info) values (('jack',33));
insert into tb_user (info) values (('李四',24));
select * from tb_user;

11、 数组类型

数组需要依赖其他类型,比如收获地址,可能有多个,就可以采用数组类型去修饰字符串。

PostgreSQL中,指定数组的方式就是[],可以指定一维数组,也支持二维甚至更多维数组。

构建数组的方式:

drop table test;
create table test(
    id serial,
    col1 int[],
    col2 int[2],
    col3 int[][]
);
-- 构建表指定数组长度后,并不是说数组内容只有2的长度,可以插入更多数据
-- 甚至在你插入数据,如果将二维数组结构的数组扔到一维数组上,也可以存储。
-- 数组编写方式
select '{{how,are},{are,you}}'::varchar[];
select array[[1,2],[3,4]];
insert into test (col1,col2,col3) values ('{1,2,3}','{4,5,6}','{7,8,9}');
insert into test (col1,col2,col3) values ('{1,2,3}','{4,5,6}',array[[1,2],[3,4]]);
insert into test (col1,col2,col3) values ('{1,2,3}','{4,5,6}','{{1,2},{3,4}}');
select * from test;

如果现在要存储字符串数组,如果存储的数组中有双引号怎么办,有大括号怎么办。

-- 如果存储的数组中的值,有单引号怎么办?
-- 使用两个单引号,作为一个单引号使用
select '{''how''}'::varchar[];
-- 如果存储的数组中的值,有逗号怎么办?
-- 不包起来的话,相对于分隔符了(PGSQL中的数组索引从1开始算,写0也是从1开始算。)
-- 用双引号将数组的数据包起来~
select ('{"how,are"}'::varchar[])[2];
-- 如果存储的数组中的值,有双引号怎么办?
-- 如果要添加双引号,记得转义。
select ('{"\"how\",are"}'::varchar[])[1];

数组的比较方式

-- 包含
select array[1,2] @> array[1];
-- 被包含
select array[1,2] <@ array[1,2,4];
-- 是否有相同元素
select array[2,4,4,45,1] && array[1];
  • 17
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: PostgreSQL 是一种开源的关系型数据库管理系统(RDBMS)。它支持大多数的 SQL 标准,并且在许多平台上运行,包括 Linux、Unix 和 Windows。PostgreSQL 在性能、可靠性和安全性方面都有很高的评价,因此常用来作为企业级应用的数据库。 ### 回答2: PostgreSQL是一种开源的关系型数据库管理系统,也是目前最先进和功能强大的数据库之一。它具备了高度的可靠性、可扩展性和稳定性,被广泛地用于各种规模和复杂度的应用中。 PostgreSQL以其ACID(原子性、一致性、隔离性和持久性)特性而闻名。这意味着它在处理并发操作和事务时非常可靠。它通过多版本并发控制(MVCC)技术实现了高度的隔离性,确保每个事务在一个独立的视图中运行,从而避免了数据争用和冲突。此外,PostgreSQL还支持完整的崩溃恢复机制,可以保证数据的持久性和一致性。 PostgreSQL还提供了丰富的功能集,包括复杂的查询、触发器、视图、存储过程和自定义函数等。它支持多种数据类型,包括基本的数字、字符串和日期类型,以及复杂的几何、网络地址和JSON等类型。此外,它还具有强大的索引和查询优化器,可以高效地处理大量数据和复杂查询。 PostgreSQL是一个高度可扩展的数据库系统。它支持水平和垂直扩展,可以在多台服务器上分布和并行处理数据。它还具有丰富的插件和扩展功能,可以根据需求进行自定义和扩展。 作为一个开源项目,PostgreSQL具有一个庞大和活跃的社区,不断地开发新的功能和修复错误。它还拥有完善的文档和教程,为用户和开发者提供了丰富的资源。 总之,PostgreSQL是一个功能强大、可靠性高和可扩展性好的关系型数据库管理系统,它适用于各种规模和复杂度的应用,是许多企业和组织的首选数据库解决方案。 ### 回答3: PostgreSQL是一种开源的关系型数据库管理系统(RDBMS),可以在多个操作系统上运行,如Windows,Linux和macOS等。它提供了高度可靠性和可扩展性的解决方案,广泛用于各种应用程序的数据存储和管理。 PostgreSQL具有许多强大的功能,使其成为一种受欢迎的数据库选择。首先,它支持ACID事务,这意味着数据的一致性和可靠性得到保证。其次,它具有丰富的数据类型,包括整数,浮点数,字符串,日期和时间等,以及存储和查询复杂数据类型的能力。此外,PostgreSQL支持高级的数据查询功能,包括复杂的联接,子查询和聚合。 此外,PostgreSQL还具有良好的扩展性和可定制性。它支持多种编程语言的接口,如Python,Java和C ++等,使开发人员可以轻松地与数据库进行交互。此外,PostgreSQL还支持存储过程,触发器和自定义函数等高级功能,使其能够适应各种应用程序的需求。 PostgreSQL还提供了一套完善的安全性措施,包括用户身份验证,访问控制和数据加密等,确保数据的安全性和保密性。此外,它还具有备份和恢复的功能,以便在发生故障或意外情况时能够迅速恢复数据。 总的来说,PostgreSQL是一种功能强大,可靠性高且可扩展的数据库管理系统。它在各种应用程序中被广泛使用,包括网站,企业级应用程序和科学研究等。它的开源性质使得它具有强大的社区支持和持续的改进,确保了它的稳定性和可靠性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员Forlan

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值