当前位置: 首页 > news >正文

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;
}

相关文章:

PostgreSQL基础入门

为什么选择PostgreSQL 功能更全面&#xff1a;PGSQL的功能更加全面&#xff0c;支持开窗函数、物化视图、分区表、json等类型&#xff0c;MySQL8以上支持开窗函数、分区表、json等&#xff0c;但物化视图仍不支持。高可用&#xff1a;PG更适合分布式环境&#xff0c;如流复制、…...

Django 密码管理:安全实践与技术深入

在 Web 应用的开发中&#xff0c;密码管理是保障用户安全的关键环节。Django 作为一个强大的 Python Web 框架&#xff0c;提供了一套全面的系统来处理密码的存储、验证和安全。本文将详细探讨 Django 中的密码管理机制&#xff0c;包括密码存储、密码验证、密码安全策略以及自…...

说说你对React Router的理解?常用的Router组件有哪些?

一、是什么 react-router等前端路由的原理大致相同&#xff0c;可以实现无刷新的条件下切换显示不同的页面 路由的本质就是页面的URL发生改变时&#xff0c;页面的显示结果可以根据URL的变化而变化&#xff0c;但是页面不会刷新 因此&#xff0c;可以通过前端路由可以实现单…...

“可一学院”新课程《区块链企业应用》正式上线

2023年8月&#xff0c;上海可一澈科技有限公司启动了一站式区块链学习平台“可一学院BitClass”。9月6日&#xff0c;可一学院正式推出一门新课程《区块链企业应用》&#xff0c;这门课程将帮助学习者了解企业需要什么样的区块链&#xff0c;以及应该如何运用这项技术来推动自身…...

Springboot---整合对象储存服务MinIO

OSS 「OSS」的英文全称是Object Storage Service&#xff0c;翻译成中文就是「对象存储服务」&#xff0c;官方一点解释就是对象存储是一种使用HTTP API存储和检索非结构化数据和元数据对象的工具。 白话文解释就是将系统所要用的文件上传到云硬盘上&#xff0c;该云硬盘提供了…...

HDRP图形入门:HDRP渲染管线depth翻转

新项目开坑HDRP渲染管线&#xff0c;花了些时间把项目开发框架和图形工作流更新到最新版本&#xff0c;其间发现HDRP中深度信息和buildin渲染管线翻转了。 以前的buildin渲染管线&#xff0c;距离摄像机越近depth->0&#xff0c;越远depth->1&#xff0c;这也很好理…...

uniapp——项目02

分类 创建cate分支 渲染分类页面的基本结构 效果页面,包含左右两个滑动区. 利用提供的api获取当前设备的信息。用来计算窗口高度。可食用高度就是屏幕高度减去上下导航栏的高度。 最终效果: 每一个激活项都特殊背景色&#xff0c;又在尾部加了个红条一样的东西。 export d…...

Go语言的Json序列化与反序列化、Goto语法、Tcp Socket通信

目录标题 一、Json序列化与反序列化1. 序列化2. 反序列化 二、Goto语法三、Tcp Socket1. 单客户端发送信息到服务端2. 服务端客户端通信 一、Json序列化与反序列化 1. 序列化 package mainimport ("encoding/json""fmt")type Person struct {Name string…...

gitlab-ce-12.3.5 挖矿病毒及解决方案

前言 最近发现在使用gitlab提交代码的时候总是失败&#xff0c;一访问gitlab还时常报503&#xff0c;于是使用 top 命令查看了内存占用情况&#xff0c;发现了一个git进程内存使用了2.3g&#xff0c;cpu还一直占用300-400%&#xff0c; 以前不知道gitlab还有病毒&#xff0c;只…...

每日一题(LeetCode)----数组--移除元素(四)

每日一题(LeetCode)----数组–移除元素&#xff08;四&#xff09; 1.题目&#xff08;[844. 比较含退格的字符串](https://leetcode.cn/problems/sqrtx/)&#xff09; 给定 s 和 t 两个字符串&#xff0c;当它们分别被输入到空白的文本编辑器后&#xff0c;如果两者相等&…...

421. 数组中两个数的最大异或值/字典树【leetcode】

421. 数组中两个数的最大异或值 给你一个整数数组 nums &#xff0c;返回 nums[i] XOR nums[j] 的最大运算结果&#xff0c;其中 0 ≤ i ≤ j < n 。 示例 1&#xff1a; 输入&#xff1a;nums [3,10,5,25,2,8] 输出&#xff1a;28 解释&#xff1a;最大运算结果是 5 XOR…...

C++(20):自定义类型实现基于范围的for循环

C自定义类型&#xff0c;可以通过实现begin和end作为成员函数&#xff0c;来支持基于范围的for循环 #include <iostream>class D{ public:int* begin(){return m_data;}int* end(){return m_data 5;} private:int m_data[5]{1, 2, 3, 4, 5}; };int main() {D d;for (in…...

Linux常用命令:find、grep、vim、cat、less、more

目录 我的常用搜索命令 find 命令 grep 命令 vim 常用命令&#xff1a; 1.光标移动命令 2插入命令 3.删除命令 4.复制和粘贴命令 5.撤销和重做命令 6.查找和替换命令 7.文件操作命令 8.其他命令 cat命令 less 命令 more 命令 less和more命令的区别 less和vim命…...

Oracle导入,注意事项

在执行导入时&#xff0c;如果导入的触发器引用的表不存在&#xff0c;可能会导致错误。触发器通常会在相关的表结构之后导入&#xff0c;但在导入阶段&#xff0c;表的创建并不一定会立即执行。 在 Oracle 数据库中&#xff0c;触发器的创建可能涉及到对表的引用&#xff0c;…...

【数据结构】入队序列出队序列问题(以21年408真题举例)

题型说明 一般是一个队列&#xff0c;其中一边可以入队&#xff0c;另一边可以入队和出队只可入队的含义是从这个方向是以队列形式存在可以入队和出队表示此边以堆形式存在 怎么分析&#xff1f; 以21年408真题举例 考点分析 出队序列存在两种情况&#xff1a;入之后就出&…...

在ant构建脚本中调用maven的命令

有时候想用maven管理依赖&#xff0c;用ant构建。 在ant的build.xml文件中可以使用exec这个task来调用系统命令&#xff0c;也就可以调用maven的命令。 例如&#xff0c;执行maven的命令mvn dependency:copy-dependencies&#xff0c;可以将项目的依赖提取出来&#xff0c;放…...

美格智能5G RedCap模组顺利完成中国联通5G物联网OPENLAB开放实验室认证

近日&#xff0c;美格智能5G RedCap模组SRM813Q顺利通过中国联通5G物联网OPENLAB开放实验室端到端的测试验收&#xff0c;并获得OPENLAB实验室的认证证书。这标志着该模组产品各项性能均已符合RedCap商用标准&#xff0c;为5G RedCap规模商用奠定了坚实基础。 中国联通5G物联网…...

Git基础知识学习常用命令一

常用命令 $ git status 工作区域与仓库保持一致step2: 暂存状态 $ git add --all # 当前项目下的所有更改 $ git add . # 当前目录下的所有更改 $ git add xx/xx.py xx/xx2.py # 添加某几个文件Step3: commit $ git commit -m"<这里写commit的描述>" 已提…...

【2023.11.6】OpenAI发布会——近期chatgpt被攻击,不能使用

OpenAI发布会 写在最前面发布会内容GPT-4 Turbo 具有 128K 上下文函数调用更新改进了指令遵循和 JSON 模式可重现的输出和对数概率更新了 GPT-3.5 Turbo 助手 API、检索和代码解释器API 中的新模式GPT-4 Turbo 带视觉DALLE 3文字转语音 &#xff08;TTS&#xff09;收听语音样本…...

云原生 黑马Kubernetes教程(K8S教程)笔记——kubernetes介绍。Master集群控制节点、Node工作负载节点、Pod控制单元

参考文章&#xff1a;kubernetes介绍 文章目录 1. Kubernetes介绍1.1 应用部署方式演变传统部署&#xff1a;互联网早期&#xff0c;会直接将应用程序部署在物理机上虚拟化部署&#xff1a;可以在一台物理机上运行多个虚拟机&#xff0c;每个虚拟机都是独立的一个环境&#xff…...

Python爬虫实战:研究MechanicalSoup库相关技术

一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...

Linux链表操作全解析

Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表&#xff1f;1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...

AI Agent与Agentic AI:原理、应用、挑战与未来展望

文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例&#xff1a;使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例&#xff1a;使用OpenAI GPT-3进…...

vue3 字体颜色设置的多种方式

在Vue 3中设置字体颜色可以通过多种方式实现&#xff0c;这取决于你是想在组件内部直接设置&#xff0c;还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法&#xff1a; 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...

Springboot社区养老保险系统小程序

一、前言 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;社区养老保险系统小程序被用户普遍使用&#xff0c;为方…...

10-Oracle 23 ai Vector Search 概述和参数

一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI&#xff0c;使用客户端或是内部自己搭建集成大模型的终端&#xff0c;加速与大型语言模型&#xff08;LLM&#xff09;的结合&#xff0c;同时使用检索增强生成&#xff08;Retrieval Augmented Generation &#…...

Python ROS2【机器人中间件框架】 简介

销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...

AI病理诊断七剑下天山,医疗未来触手可及

一、病理诊断困局&#xff1a;刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断"&#xff0c;医生需通过显微镜观察组织切片&#xff0c;在细胞迷宫中捕捉癌变信号。某省病理质控报告显示&#xff0c;基层医院误诊率达12%-15%&#xff0c;专家会诊…...

短视频矩阵系统文案创作功能开发实践,定制化开发

在短视频行业迅猛发展的当下&#xff0c;企业和个人创作者为了扩大影响力、提升传播效果&#xff0c;纷纷采用短视频矩阵运营策略&#xff0c;同时管理多个平台、多个账号的内容发布。然而&#xff0c;频繁的文案创作需求让运营者疲于应对&#xff0c;如何高效产出高质量文案成…...

群晖NAS如何在虚拟机创建飞牛NAS

套件中心下载安装Virtual Machine Manager 创建虚拟机 配置虚拟机 飞牛官网下载 https://iso.liveupdate.fnnas.com/x86_64/trim/fnos-0.9.2-863.iso 群晖NAS如何在虚拟机创建飞牛NAS - 个人信息分享...