Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >PostgreSQL基础(六):PostgreSQL基本操作(二)

PostgreSQL基础(六):PostgreSQL基本操作(二)

原创
作者头像
Lansonli
发布于 2024-09-21 15:07:22
发布于 2024-09-21 15:07:22
80900
代码可运行
举报
文章被收录于专栏:Lansonli技术博客Lansonli技术博客
运行总次数:0
代码可运行

PostgreSQL基本操作(二)

一、字符串类型

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

  • character(就是MySQL的char类型),定长字符串。(最大可以存储1G)
  • character varying(varchar),可变长度的字符串。(最大可以存储1G)
  • text(跟MySQL异常)长度特别长的字符串。

操作没什么说的,但是字符串常见的函数特别多。

字符串的拼接一要要使用||来拼接。

完整的函数介绍可查看下面链接:

http://www.postgres.cn/docs/12/functions-string.html

二、日期类型

在PGSQL中,核心的时间类型,就三个。

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

在PGSQL中,声明时间的方式。

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

直接在字符串位置使用之前讲到的数据类型转换就可以了。

当前系统时间

  • 可以使用now作为当前系统时间(没有时区的概念)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select timestamp 'now';
-- 直接查询now,没有时区的概念
select time with time zone 'now' at time zone '08:00:00'

  • 也可以使用current_timestamp的方式获取(推荐,默认东八区)

日期类型的运算

  • 正常对date类型做+,-操作,默认单位就是天~
  • date + time = timestamp
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select date '2011-11-11' + time '12:12:12' ;

  • 可以针对timestamp使用interval的方式进行 +,-操作,在查询以时间范围为条件的内容时,可以使用
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select timestamp '2011-11-11 12:12:12' + interval '1day' + interval '1minute' + interval '1month';

三、枚举类型

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

可以声明枚举类型作为表中的字段类型,这样可以无形的给表字段追加诡异的规范。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
-- 声明一个星期的枚举,值自然只有周一~周日。
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');

四、IP类型

PGSQL支持IP类型的存储,支持IPv4,IPv6这种,甚至Mac内种诡异类型也支持

这种IP类型,可以在存储IP时,帮助做校验,其次也可以针对IP做范围查找。

IP校验的效果

IP也支持范围查找。

五、JSON&JSONB类型

JSON在MySQL8.x中也做了支持,但是MySQL支持的不好,因为JSON类型做查询时,基本无法给JSON字段做索引。

PGSQL支持JSON类型以及JSONB类型。

JSON和JSONB的使用基本没区别。

撇去JSON类型,本质上JSON格式就是一个字符串,比如MySQL5.7不支持JSON的情况的下,使用text也可以,但是字符串类型无法校验JSON的格式,其次单独的字符串没有办法只获取JSON中某个key对应的value。

JSON和JSONB的区别:

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

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

JSON

PGSQL

String

text

number

numeric

boolean

boolean

null

(none)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[
  {"name": "张三"},
  {"name": {
      "info": "xxx"
    }}

]

操作JSON:

  • 上述的四种JSON存储的类型:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select '9'::JSON,'null'::JSON,'"laozheng"'::JSON,'true'::json;
select '9'::JSONB,'null'::JSONB,'"laozheng"'::JSONB,'true'::JSONB;

  • JSON数组
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select '[9,true,null,"我是字符串"]'::JSON;

  • JSON对象

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select '{"name": "张三","age": 23,"birthday": "2011-11-11","gender": null}'::json;
select '{"name": "张三","age": 23,"birthday": "2011-11-11","gender": null}'::jsonb;

  • 构建表存储JSON
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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;

  • 构建索引的效果

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
create index json_index on test(info);
create index jsonb_index on test(infob);

JSON还支持很多函数,可以直接查看以下文档地址:

http://www.postgres.cn/docs/12/functions-json.html

六、复合类型

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class User{
   private Integer id;
   private Info info;
}

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
-- 构建复合类型,映射上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;

七、数组类型

数组还是要依赖其他类型,比如在设置住址,住址可能有多个住址,可以采用数组类型去修饰字符串。

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

构建数组的方式:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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;

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
-- 如果存储的数组中的值,有单引号怎么办?
-- 使用两个单引号,作为一个单引号使用
select '{''how''}'::varchar[];
-- 如果存储的数组中的值,有逗号怎么办?(PGSQL中的数组索引从1开始算,写0也是从1开始算。)
-- 用双引号将数组的数据包起来~
select ('{"how,are"}'::varchar[])[2];
-- 如果存储的数组中的值,有双引号怎么办?
-- 如果要添加双引号,记得转义。
select ('{"\"how\",are"}'::varchar[])[1];

数组的比较方式

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
-- 包含
select array[1,2] @> array[1];
-- 被包含
select array[1,2] <@ array[1,2,4];
-- 是否有相同元素
select array[2,4,4,45,1] && array[1];

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
PostgreSQL基础(五):PostgreSQL基本操作和数据类型介绍
在PGSQL中,写SQL语句时,单引号用来标识实际的值。双引号用来标识一个关键字,比如表名,字段名。
Lansonli
2024/09/17
7300
PostgreSQL基础(八):表的基本操作(二)
物化视图从名字上就可以看出来,必然是要持久化一份数据的。使用套路和视图基本一致。这样一来查询物化视图,就相当于查询一张单独的表。相比之前的普通视图,物化视图就不需要每次都查询复杂SQL,每次查询的都是真实的物理存储地址中的一份数据(表)。
Lansonli
2024/09/25
2720
PostgreSQL基础(八):表的基本操作(二)
PostgreSQL基础(七):表的基本操作(一)
created,create_id,updated,update_id,is_delete
Lansonli
2024/09/22
2400
PostgreSQL基础(七):表的基本操作(一)
PostgreSQL 数据类型
PostgreSQL提 供了丰富的数据类型。用户可以使用 CREATE TYPE 命令在数据库中创建新的数据类型。PostgreSQL 的数据类型有很多种,下面我们具体来说明。
用户5005176
2021/08/11
1.5K0
PostgreSQL基础(四):图形化界面安装与数据类型介绍
https://www.postgresql.org/ftp/pgadmin/pgadmin4/v6.9/windows/
Lansonli
2024/09/14
6620
PostgreSQL基础(四):图形化界面安装与数据类型介绍
Clickhouse基础语法、数据类型、数据表引擎学习
2、默认情况下,ClickHouse使用的是原生的数据库引擎Ordinary(在此数据库下可以使用任意类型的表引擎,在绝大多数情况下都只需使用默认的数据库引擎)。当然也可以使用Lazy引擎和MySQL引擎,比如使用MySQL引擎,可以直接在ClickHouse中操作MySQL对应数据库中的表。假设MySQL中存在一个名为Clickhouse的数据库,可以使用下面的方式连接MySQL数据库。
别先生
2021/03/04
1.7K0
MySQL基础知识之函数
SELECT EXTRACT(MINUTE FROM '2011-11-11 11:11:11') -> 11 FROM_DAYS(n)计算从 0000 年 1 月 1 日开始 n 天后的日期 SELECT FROM_DAYS(1111) -> 0003-01-16 HOUR(t)返回 t 中的小时值 SELECT HOUR('1:2:3') -> 1 LAST_DAY(d)返回给给定日期的那一月份的最后一天 SELECT LAST_DAY("2017-06-20"); -> 2017-06-30 LOCALTIME()返回当前日期和时间 SELECT LOCALTIME() -> 2018-09-19 20:57:43 LOCALTIMESTAMP()返回当前日期和时间 SELECT LOCALTIMESTAMP() -> 2018-09-19 20:57:43 MAKEDATE(year, day-of-year)基于给定参数年份 year 和所在年中的天数序号 day-of-year 返回一个日期 SELECT MAKEDATE(2017, 3); -> 2017-01-03 MAKETIME(hour, minute, second)组合时间,参数分别为小时、分钟、秒 SELECT MAKETIME(11, 35, 4); -> 11:35:04 MICROSECOND(date)返回日期参数所对应的微秒数 SELECT MICROSECOND("2017-06-20 09:34:00.000023"); -> 23 MINUTE(t)返回 t 中的分钟值 SELECT MINUTE('1:2:3') -> 2 MONTHNAME(d)返回日期当中的月份名称,如 November SELECT MONTHNAME('2011-11-11 11:11:11') -> November MONTH(d)返回日期d中的月份值,1 到 12 SELECT MONTH('2011-11-11 11:11:11') ->11 NOW()返回当前日期和时间 SELECT NOW() -> 2018-09-19 20:57:43 PERIOD_ADD(period, number)为 年-月 组合日期添加一个时段 SELECT PERIOD_ADD(201703, 5); -> 201708 PERIOD_DIFF(period1, period2)返回两个时段之间的月份差值 SELECT PERIOD_DIFF(201710, 201703); -> 7 QUARTER(d)返回日期d是第几季节,返回 1 到 4 SELECT QUARTER('2011-11-11 11:11:11') -> 4 SECOND(t)返回 t 中的秒钟值 SELECT SECOND('1:2:3') -> 3 SEC_TO_TIME(s)将以秒为单位的时间 s 转换为时分秒的格式 SELECT SEC_TO_TIME(4320) -> 01:12:00 STR_TO_DATE(string, format_mask)将字符串转变为日期 SELECT STR_TO_DATE("August 10 2017", "%M %d %Y"); -> 2017-08-10 SUBDATE(d,n)日期 d 减去 n 天后的日期 SELECT SUBDATE('2011-11-11 11:11:11', 1) ->2011-11-10 11:11:11 (默认是天) SUBTIME(t,n)时间 t 减去 n 秒的时间 SELECT SUBTIME('2011-11-11 11:11:11', 5) ->2011-11-11 11:11:06 (秒) SYSDATE()返回当前日期和时间 SELECT SYSDATE() -> 2018-09-19 20:57:43 TIME(expression)提取传入表达式的时间部分 SELECT TIME("19:30:10"); -> 19:30:10 TIME_FORMAT(t,f)按表达式 f 的要求显示时间 t SELECT TIME_FORMAT('11:11:11','%r') 11:11:11 AM TIME_TO_SEC(t)将时间 t 转换为秒 SELECT TIME_TO_SEC('1:12:00') -> 4320 TIMEDIFF(time1, time2)计算时间差值 SELECT TIMEDIFF("13:10:11", "13:10:10"); -> 00:00:01 TIMESTAMP(expression, interval)单个参数时,函数返回日期或日期时间表达式;有2个参数时,将参数加和 SELECT TIMESTAM
菲宇
2022/05/06
4310
02 . Mysql基础操作及增删改查
SQL(Structured Query Language 即结构化查询语言) SQL语言主要用于存取数据、查询数据、更新数据和管理关系数据库系统,SQL语言由IBM开发。
iginkgo18
2020/09/27
2K0
MySQL深入研究:表数据操作
可以看到数据已经插入进来,没有填充数据的列已NULL填充,关于这一点,我们可以在创建表的时候通过DEFAULT来指定默认值,就是在这个时候使用的
IT大咖说
2021/07/19
6010
「Postgresql架构」使用PostgreSQL中的JSONB数据类型加快操作
从版本9.4开始,PostgreSQL在使用JSON数据的二进制表示jsonb时提供了显着的加速,这可以为您提供增加性能所需的额外优势。
架构师研究会
2019/08/21
6.8K0
进阶数据库系列(六):PostgreSQL 数据类型与运算符
PostgreSQL 支持多种数据类型,主要有整数类型、浮点数类型、任意精度数值、日期/时间类型、字符串类型、二进制类型、布尔类型和数组类型等。
民工哥
2023/08/22
7.9K0
进阶数据库系列(六):PostgreSQL 数据类型与运算符
最强最全面的Hive SQL开发指南,超四万字全面解析!
hive -S -e 'select table_cloum from table' -S,终端上的输出不会有mapreduce的进度,执行完毕,只会把查询结果输出到终端上。
五分钟学大数据
2021/12/02
8.2K0
最强最全面的Hive SQL开发指南,超四万字全面解析!
MySQL基础课堂笔记「建议收藏」
​ – 查询姓名中包含德的人 SELECT * FROM student WHERE NAME LIKE ‘%德%’;
全栈程序员站长
2022/09/18
1K0
MySQL基础课堂笔记「建议收藏」
PostgreSQL JSONB 使用入门
Photo by Tobias Fischer[9] on Unsplash[10]
goodspeed
2020/12/22
8.6K0
PostgreSQL JSONB 使用入门
MySQL基础(一)
数据库就是==存储数据的仓库==,其本质是一个文件系统,按照特定的格式将数据存储起来,用户可以对数据库中的数据进行增加,修改,删除及查询操作
落幕
2025/05/27
2490
MySQL基础(一)
ClickHouse 数据类型全解析及实际应用
基础类型只有数值、字符串和时间三种类型,没有 Boolean 类型,但可以使用整型的 0 或 1 替代。ClickHouse 的数据类型和常见的其他存储系统的数据类型对比:
大数据真好玩
2022/03/28
6.3K0
ClickHouse 数据类型全解析及实际应用
Hive基础09、HQL查询语句
hive -S -e 'select table_cloum from table' -S,终端上的输出不会有mapreduce的进度,执行完毕,只会把查询结果输出到终端上。
红目香薰
2022/11/30
6.4K0
Hive基础09、HQL查询语句
PDF.NET数据开发框架实体类操作实例(for PostgreSQL,并且解决自增问题) PDF.NET数据开发框架实体类操作实例(MySQL)
本篇是 PDF.NET数据开发框架实体类操作实例(MySQL) 的姊妹篇,两者使用了同一个测试程序,不同的只是使用的类库和数据库不同,下面说说具体的使用过程。 1,首先在App.config文件中配置
用户1177503
2018/02/27
1.7K0
Hive基础操作
Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张表,并提供类SQL查询功能。
CBeann
2023/12/25
6550
MySQL基础之函数【字符串,数值,日期,流程】和约束
也就意味着,这一段程序或代码在MySQL中已经给我们提供了,我们要做的就是在合适的业务场景调用对应的函数完成对应的业务需求即可。
叫我阿杰好了
2022/11/07
1.2K0
MySQL基础之函数【字符串,数值,日期,流程】和约束
推荐阅读
相关推荐
PostgreSQL基础(五):PostgreSQL基本操作和数据类型介绍
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验