PostgreSQL基础入门

为什么选择PostgreSQL

  1. 功能更全面:PGSQL的功能更加全面,支持开窗函数、物化视图、分区表、json等类型,MySQL8以上支持开窗函数、分区表、json等,但物化视图仍不支持。
  2. 高可用:PG更适合分布式环境,如流复制、逻辑复制和基于 WAL 日志的复制机制,而MySQL则基于BingLog。
  3. 数据类型更丰富:支持多种索引类型,如:数组、json,ip类型,text类型。

PostgreSQL和MySQL对比

MySQLPgSQL
功能8以下版本功能弱,8以上版本支持JSON、开窗函数、分区表,目前不支持物化视图支持的功能更多,例如开窗函数、物化视图、JSON、分区表等
性能对于读操作性能更好在处理复杂查询和写密集操作时更有优势
可扩展性可扩展性不强可扩展性强,支持自定义列类型、插件等

PostgreSQL和MySQL如何选择

PgSQL更适合写操作频繁,以及复杂查询的情况,因为PgSQL内置了性能更好的MVCC来解决并发写,MySQL则是通过锁解决并发锁。如果项目中有一些特殊场景,例如json、gis等,则可以选择PgSQL。

MySQL更适合读操作多的情况,读取性能更好。MySQL运维成本更低,上手便捷,社区支持、技术方案更多。

PostgreSQL基础

--数据类型
-- 整数: smallint、int
-- 小数 numeric(5,3)
-- 字符串 char 定长、varchar变长、text无限长
-- 日期 date yyyy-MM-dd
-- 时间 time HH:mm:ss
-- 时间戳 timestamp  yyyy-MM-dd HH:mm:ss.0000

数据类型

数字

类型描述
int整数类型,4字节大小,范围为 -2147483648 到 2147483647
int2整数类型,2字节大小,其范围为 -32768 到 32767
int4整数类型,4字节大小,范围为 -2147483648 到 2147483647
int8范围为 -9223372036854775808 到 9223372036854775807
serial、serial2、serial4、serial8等于int,会自动创建序列实现主键自增。
numeric(m,n)小数类型,小数超长会四舍五入。numeric(5,2)最大为999,99

字符串

类型描述
char定长字符串,不足补空格
varchar变长字符串
text无限长度字符串

日期

类型描述
date日期,例如‘2023-11-10’
time时间,例如‘20:00:00.200’
timestampdate+time

基本语法

-- 创建数据库
create database "test1" encoding ='utf-8';
-- 修改数据库名称
alter database "test1" rename to "test";
-- 删除数据库
drop database if exists "test1";-- 查看所有表
select * from pg_tables where schemaname = 'public';-- 创建表 双引号表示对象,单引号表示字符串。表名为特殊字符需要加“”;
create table "user2" (id serial8 primary key, -- serial表示主键自增,需要注意的时不能手动指定id了,不然会冲突name varchar(255) not null default 'zs',birthday date, -- 日期数据类型 date(日期) time(时间) timestamp(日期加时间)age int,money numeric(5,2) -- 小数类型,整数位为3,小数位为2。
);
-- 表注释
comment on table "user2" is '用户表';
comment on column "user2".id is '用户Id';
comment on column "user2".name is '名称';
comment on column "user2".birthday is '生日';
comment on column "user2".age is '年龄';
comment on column "user2".money is '存款';-- 修改表名
alter table "user" rename to "user2";
-- 修改字段类型
alter table "user2" alter column age type numeric(3,0);
-- 新增字段
alter table "user" add column test numeric(3,0);
-- 修改字段名称
alter table "user" rename column  test to test2;
-- 删除字段
alter table "user" drop column test;-- 插入数据
-- 小数超过会四舍五入,numeric(5,2)表示最大不能超过999.99
-- id自增使用default
insert into "user" values (DEFAULT,'zs','2023-11-09 01:00:00',20.1,999.99);
-- 不要指定id,因为他会和自增id冲突
insert into "user"(id,name,birthday,age,money) values (4,'zs','2023-11-09 01:00:00',20.1,999.994);-- upsert 不存在新增,存在修改   EXCLUDED是一个临时表,用于存放当前要插入的数据。
INSERT INTO "user"(id,name) 
VALUES (default,'ls'),(id','zs2')
ON CONFLICT(id) -- 当id冲突时    
DO UPDATE SET  -- 进行修改操作
name= "user".name || EXCLUDED.name, -- name=原name+新name (||表示字符串拼接)
birthday=now();-- 分页查询(刚好和mySQL反过来了)
-- 第一页= limit 3 offset 0 
-- 第二页  limit 3 offset 3
-- limit pageSize offset pageNum*pageSize -1
select * from employee limit 3 offset 0;

特殊函数

-- string_agg 类似于mysql的 group_concat
SELECT country,string_agg(city,',') FROM city GROUP BY country;
-- array_agg 功能和string_agg类似,不同的是返回的是数组。
SELECT country,array_agg(city) FROM city GROUP BY country;

PostgreSQL扩展

物化视图

物化视图是一张真实存在的表,能够随着原表的改变而改变(需要手动刷新),主要用于提高一些更新不频繁的大表。

-- 创建物化视图
create materialized view  user_view as select u.name,count(a.address) from "user" as u inner join "user_address" as a on u.id = a.user_id group by u.id,u.name;
-- 刷新物化视图
refresh materialized view user_view;
-- 并发刷新(需要创建唯一索引)
create unique index idx_id on user_view(id); -- 为物化视图创建索引
refresh materialized view concurrently  user_view; -- 并发刷新-- 删除物化视图
drop materialized view user_view;

开窗函数

如果想要获取聚合数据,但又不想让数据聚合,那么就可以使用聚合函数。

开窗函数的作用:对查询出来的数据再次进行分析,如聚合、排名、累计等。

例如:获取每个部门薪资排名前三的员工。

select dept_name,emp_name,salary, 
rank() over(patition by dept_name order by salary desc) -- 开窗函数,根据部门分组,然后根据薪资排序
from salary_log;

开窗函数语法

想要使用的函数() -- 例如 rank()获取排名、sum()、ave()、count()
over(partition by-- 要分组的列(类似于group by)order by-- 排序列rows between xxx and xxx -- 要选取的行 
) -- over表示开窗,配合函数表示开窗函数,一定要加!
-- 执行顺序: 先执行over,然后数据传给前面的函数执行。-- rows between xxx and xxx 详解:
-- 使用示例: 
--	rows between unbounded proceding and current row 从第一行数据开始到当前行。-- unbounded preceding 表示从当前行的前无限行开始(第一行)
-- 1 preceding 表示从当前行的前1行开始
-- current row 表示读取至当前行。
-- 1 following 表示读取至当前行的后一行
--  unbounded following 表示读取至最后一行-- rows between 可以省略,不写默认为 rows between unbounded preceding and current row

常用开窗函数

row_number() -- 排名,分数相同,排名不同。
rank() -- 排名,分数相同,排名相同,但末位数不变,例如查询前三名: 1,1,3
dense_rank() -- 排名,分数相同,排名相同,但末位数减少,例如查询前三名 1,1,2sum( "column" ) -- 求和
count( "column" ) -- 总数
avg( "column" ) -- 求平均分lag( "column",1,0) -- 求当前行的上1行的值,如果没有上1行则返回0 (一般用于求环比)
leag( "column",1,0)-- 求当前行的下1行的值,如果没有下1行则返回0 (一般用于求环比)

row_number dense_rank

PostgreSQL与 SpringBoot、MybatisPlus 整合

  1. 引入依赖
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.4.1</version></dependency><dependency><groupId>org.postgresql</groupId><artifactId>postgresql</artifactId><scope>runtime</scope></dependency>
</dependencies>
  1. 配置
spring.datasource.driver-class-name=org.postgresql.Driver
spring.datasource.username=postgres
spring.datasource.password=root
spring.datasource.url=jdbc:postgresql://localhost:5432/test1?currentSchema=publicmybatis-plus.configuration.map-underscore-to-camel-case=true
mybatis-plus.mapper-locations=classpath*:/mapper/**/*.xml
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
  1. 配置分页插件
@Configuration
public class MybatisPlusConfigure {//必须配置分页插件,不然分页无效@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();//设置分页插件PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor();paginationInnerInterceptor.setOptimizeJoin(true);//指定数据库方言paginationInnerInterceptor.setDbType(DbType.POSTGRE_SQL);paginationInnerInterceptor.setOverflow(true);interceptor.addInnerInterceptor(paginationInnerInterceptor);return interceptor;}
}
  1. id自增
@Data
@NoArgsConstructor
@AllArgsConstructor
@TableName("employee")
public class Employee {@TableId(type = IdType.AUTO)private Long id;private String name;private Long deptId;private String month;private BigDecimal salary;private Date sendDate;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/140799.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

pychon/PIL/opencv/json学习过程中遇到的问题

1. 使用PIL.Image读取图片 注意&#xff1a;pytorch中对图像预处理是transforms的输入必须是PIL格式的文件&#xff0c;使用cv2读取的图片就按照第二条的代码处理&#xff08;3通道合并、归一化处理&#xff09; from PIL import Image img Image.open("test1.jpg"…

TensorFlow: An open-source software library for Machine Intelligence

Google开源的机器学习软件包 项目主页:https://www.tensorflow.org/Github主页:GitHub - tensorflow/tensorflow: An Open Source Machine Learning Framework for Everyone主要版本:1.0(当前最新版本),0.12.0开源协议:Apache 2.0TensorFlow™ 是一个采用数据流图(data…

2023 年最新企业微信官方会话机器人开发详细教程(更新中)

目标是开发一个简易机器人&#xff0c;能接收消息并作出回复。 获取企业 ID 企业信息页面链接地址&#xff1a;https://work.weixin.qq.com/wework_admin/frame#profile 自建企业微信机器人 配置机器人应用详情 功能配置 接收消息服务器配置 配置消息服务器配置 配置环境变量…

如何利用 cpolar 内网穿透技术实现 U8 用友 ERP 异地访问

文章目录 前言1. 服务器本机安装U8并调试设置2. 用友U8借助cpolar实现企业远程办公2.1 在被控端电脑上&#xff0c;点击开始菜单栏&#xff0c;打开设置——系统2.2 找到远程桌面2.3 启用远程桌面 3. 安装cpolar内网穿透3.1 注册cpolar账号3.2 下载cpolar客户端 4. 获取远程桌面…

【MATLAB源码-第75期】基于模拟退火算法(SA)的栅格路径规划,输出做短路径图和适应度曲线。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 模拟退火算法是一种启发式优化算法&#xff0c;通常用于解决组合优化问题&#xff0c;例如旅行商问题和图着色问题。它模拟了固体材料在退火过程中逐渐冷却达到稳定状态的行为&#xff0c;以寻找问题的全局最优解。 以下是模…

Hadoop原理,HDFS架构,MapReduce原理

Hadoop原理&#xff0c;HDFS架构&#xff0c;MapReduce原理 2022找工作是学历、能力和运气的超强结合体&#xff0c;遇到寒冬&#xff0c;大厂不招人&#xff0c;可能很多算法学生都得去找开发&#xff0c;测开 测开的话&#xff0c;你就得学数据库&#xff0c;sql&#xff0c…

postswigger 靶场(CSRF)攻略-- 1.没有防御措施的 CSRF 漏洞

靶场地址&#xff1a; What is CSRF (Cross-site request forgery)? Tutorial & Examples | Web Security Academy (portswigger.net)https://portswigger.net/web-security/csrf 没有防御措施的 CSRF 漏洞 题目中已告知易受攻击的是电子邮件的更改功能&#xff0c;而目…

Oracle Primavera Unifier 23.10 新特征

根据官方的说法&#xff0c;Unifier 23.7 ~ 23.9 更多为对功能bug的修复&#xff0c;以下将对23.10进行重点介绍 Cost Sheets Cost Sheets Support Conditional Formatting Conditional formatting of table data is now supported in cost sheets with features such as ce…

基于注解的声明式事务

1.什么是事务 数据库事务(transaction)是访问并可能操作各种数据项的一个数据库操作序列&#xff0c;这些操作要么全部执行要么全部不执行&#xff0c;是一个不可分割的工作单位。事务由事务开始与事务结束之间执行的全部数据库操作组成。 2.事务的特性 A&#xff1a;原子性(A…

java Stream编程笔记

文章目录 Stream介绍什么是 Stream&#xff1f; Stream中间操作过滤操作&#xff08;filter&#xff09;映射操作&#xff08;map&#xff09;排序操作&#xff08;sorted&#xff09;截断操作&#xff08;limit 和 skip&#xff09; Stream 的终止操作forEach 和 peek聚合操作…

【pytorch深度学习】torch-张量Tensor

torch-张量Tensor 文章目录 torch-张量Tensor1. 张量Tensor 1. 张量Tensor torch.tensor() # 创建一个标量&#xff08;0维张量&#xff09; scalar_tensor torch.tensor(3.14) # 创建一个向量&#xff08;1维张量&#xff09; vector_tensor torch.tensor([1, 2, 3]) # 创…

【FPGA】十进制计数器 | 实现 4-bit 2421 十进制计数器 | 有限状态机(FSM)

目录 Ⅰ. 实践说明 0x00 十进制计数器 0x01 有限状态机&#xff08;FSM&#xff09; Ⅱ. 实践部分 0x00 4-bit 2421 十进制计数器 Ⅰ. 实践说明 0x00 十进制计数器 十进制计数器是一种以十进制运算的计数器&#xff0c;从 0 数到 9&#xff0c;然后返回 0 状态。由于它需…

青少年编程学习 等级考试 蓝桥杯/NOC/GESP等比赛资料合集

一、博主愚见 在当今信息技术高速发展的时代&#xff0c;编程已经成为了一种必备的技能。随着社会对于科技人才的需求不断增加&#xff0c;青少年编程学习正逐渐成为一种趋势。为了更好地帮助青少年学习编程&#xff0c;提升他们的技能和素质&#xff0c;博主结合自身多年从事青…

如何使用CORS和CSP保护前端应用程序安全

前端应用在提供无缝用户体验方面起着核心作用。在当今互联网的环境中&#xff0c;第三方集成和API的普及使得确保强大的安全性至关重要。安全漏洞可能导致数据盗窃、未经授权访问以及品牌声誉受损。本文将向您展示如何使用CORS和CSP为您的网页增加安全性。 嗨&#xff0c;大家好…

大数据可视化数据大屏可视化模板【可视化项目案例-05】

🎉🎊🎉 你的技术旅程将在这里启航! 🚀🚀 本文选自专栏:可视化技术专栏100例 可视化技术专栏100例,包括但不限于大屏可视化、图表可视化等等。订阅专栏用户在文章底部可下载对应案例源码以供大家深入的学习研究。 🎓 每一个案例都会提供完整代码和详细的讲解,不…

半导体PLM解决方案助力企业提升竞争力 | 百世慧®

行业背景 半导体&#xff08;semiconductor&#xff09;指常温下导电性能介于导体与绝缘体之间的材料。 半导体产业主要涵盖集成电路、处理器、存储器、传感器及光电子设备等领域。产品则广泛应用在个人电脑、智能手机、平板电脑、汽车电子、医疗设备、工业控制等领域。 近些…

基于安卓android微信小程序的校园互助平台

项目介绍 随着社会的发展&#xff0c;社会的方方面面都在利用信息化时代的优势。互联网的优势和普及使得各种系统的开发成为必需。 本文以实际运用为开发背景&#xff0c;运用软件工程原理和开发方法&#xff0c;它主要是采用java语言技术和mysql数据库来完成对系统的设计。整…

Unity中Shader的间接光的产生Meta Pass

文章目录 前言Unity中Shader的间接光的产生Meta Pass&#xff0c;这也是属于全局光照 GI 的内容。主要实现像现实生活中&#xff0c;光线照到有颜色的物体后&#xff0c;该物体有反射出该颜色的光的效果。 一、我们先使用Unity自带的Shader看看间接光效果1、先按照如下设置搭建…

Android 中注解的使用

Android Support Library 从 19.1 版本开始引入了一个新的注解库&#xff0c;其中包含了很多的元注解&#xff0c;使用它们修饰我们的代码&#xff0c; 可以让我们提高程序的开发效率&#xff0c;让我们更早的发现问题。以及对代码施以规范&#xff0c;让代码更加有可读性。这篇…

8年经验之谈 —— 记一次接口压力测试与性能调优!

经验总结 1. 如果总的CPU占用率偏高&#xff0c;且基本都被业务线程占用时&#xff0c;CPU占用率过高的原因跟JVM参数大小没有直接关系&#xff0c;而跟具体的业务逻辑有关。 2. 当设置JVM堆内存偏小时&#xff0c;GC频繁会导致业务线程停顿增多&#xff0c;TPS下降&#xff…