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

PostgreSQL学习笔记(二):PostgreSQL基本操作

PostgreSQL 是一个功能强大的开源关系型数据库管理系统 (RDBMS),支持标准的 SQL 语法,并扩展了许多功能强大的操作语法.

数据类型

  1. 数值类型
    数据类型描述存储大小示例值
    SMALLINT小范围整数,范围:-32,768 到 32,7672 字节-123
    INTEGERINT中范围整数,范围:-2,147,483,648 到 2,147,483,6474 字节12345
    BIGINT大范围整数,范围:-9,223,372,036,854,775,808 到 9,223,372,036,854,775,8078 字节12345678901234
    NUMERIC(p, s)DECIMAL(p, s)精确的数字,p 是总位数,s 是小数点后位数可变长1234.56
    REALFLOAT4单精度浮点数,范围:6 位小数精度4 字节1.23
    DOUBLE PRECISIONFLOAT8双精度浮点数,范围:15 位小数精度8 字节123.45678
    SERIAL自动递增整数,等同于 INTEGER + 自增4 字节1, 2, 3...
    BIGSERIAL自动递增整数,等同于 BIGINT + 自增8 字节1, 2, 3...
  2. 字符类型
    数据类型描述存储大小示例值
    CHAR(n)CHARACTER(n)固定长度字符串,不足位数会用空格补齐n 字节'abc '
    VARCHAR(n)CHARACTER VARYING(n)可变长度字符串,最多 n 个字符实际长度 + 1 字节'abc'
    TEXT不限长度的字符串可变长'Hello, world!'

    说明
    <1>:CHAR(n) 固定长度,适合存储固定格式的字符串。
    <2>:VARCHAR(n) 是常用的可变长度类型。
    <3>:TEXT 用于存储长文本。

  3. 布尔类型
    数据类型描述存储大小示例值
    BOOLEAN布尔值,TRUEFALSENULL1 字节TRUE
  4. 日期和时间类型
    数据类型描述存储大小示例值
    DATE日期(不包含时间)4 字节'2025-01-06'
    TIME [WITHOUT TIME ZONE]时间(不包含日期)8 字节'12:30:00'
    TIMESTAMP [WITHOUT TIME ZONE]日期和时间8 字节'2025-01-06 12:30:00'
    TIMESTAMP WITH TIME ZONE带时区的日期和时间8 字节'2025-01-06 12:30:00+08'
    INTERVAL时间间隔16 字节'1 year 2 months'
  5. 几何类型
    数据类型描述示例值
    POINT平面中的一个点'(1.5, 2.5)'
    LINE无限长的直线'{1, -1, 0}'
    LSEG有限线段'(1.5, 2.5), (3.5, 4.5)'
    BOX矩形框'((1, 2), (3, 4))'
    PATH路径(开或闭)'((1, 1), (2, 2), (3, 3))'
    POLYGON多边形'((1, 1), (2, 2), (3, 3))'
    CIRCLE圆形'<(1, 1), 5>'
    几何类型用于存储点、线、圆等几何信息
  6. 数组类型
    数据类型描述示例值
    INTEGER[]整数数组{1, 2, 3}
    TEXT[]文本数组{'hello', 'world'}
  7. JSON和JSONB类型
    数据类型描述示例值
    JSON原始 JSON 格式,保留格式'{"key": "value"}'
    JSONB二进制存储的 JSON,查询更快'{"key": "value"}'
  8. UUID类型
    数据类型描述示例值
    UUID通用唯一标识符 (128 位)'a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11'
  9. XML类型
    数据类型描述示例值
    XMLXML 数据'<note><to>Tove</to></note>'
  10. 枚举类型

     枚举类型允许定义一组固定值。

    CREATE TYPE mood AS ENUM ('happy', 'sad', 'neutral');
    

    使用:

    CREATE TABLE person (name TEXT,current_mood mood
    );
  11. 范围类型
    数据类型描述示例值
    INT4RANGE整数范围[1,10)
    NUMRANGE数字范围[1.5,2.5)
    TSRANGE不带时区的时间范围['2023-01-01', '2023-12-31')
    TSTZRANGE带时区的时间范围['2023-01-01 00:00:00+00', '2023-12-31 23:59:59+00')

数据操作

创建数据库和用户

// 创建数据库
CREATE DATABASE database_name;// 删除数据库
DROP DATABASE database_name;// 创建用户
CREATE USER user_name WITH PASSWORD 'password';// 为用户授予权限
GRANT ALL PRIVILEGES ON DATABASE database_name TO user_name;

数据定义语言 (DDL)

// 创建表
CREATE TABLE table_name (column_name1 data_type [constraints],column_name2 data_type [constraints],...
);// 添加列
ALTER TABLE table_name ADD COLUMN column_name data_type;// 修改列
ALTER TABLE table_name ALTER COLUMN column_name TYPE new_data_type;// 删除列
ALTER TABLE table_name DROP COLUMN column_name;// 删除表
DROP TABLE table_name;

数据操作语言 (DML)

基本查询:

// 插入数据
INSERT INTO table_name (column1, column2, ...) VALUES (value1, value2, ...);// 查询数据
SELECT column1, column2 FROM table_name WHERE condition;SELECT * FROM table_name;// 更新数据
UPDATE table_name SET column1 = value1, column2 = value2 WHERE condition;// 删除数据
DELETE FROM table_name WHERE condition;

扩展查询:

// 分组查询
SELECT column1, COUNT(*) FROM table_name GROUP BY column1 HAVING COUNT(*) > 1;// 连接查询(JOIN)
内连接:
SELECT a.column1, b.column2
FROM table1 a
INNER JOIN table2 b
ON a.common_column = b.common_column;左连接:
SELECT a.column1, b.column2
FROM table1 a
LEFT JOIN table2 b
ON a.common_column = b.common_column;右连接:
SELECT a.column1, b.column2
FROM table1 a
RIGHT JOIN table2 b
ON a.common_column = b.common_column;// 子查询
SELECT column1
FROM table_name
WHERE column2 IN (SELECT column2FROM another_tableWHERE condition
);

PostgreSQL特性

PostgreSQL提供了几种丰富的数据类型,有一些特定的用法。

数组

在 PostgreSQL 中,数组是一种非常强大的数据类型,它可以存储一组同类型的值(例如整数、文本等),以下是关于数组的详细用法。

创建数组字段:

CREATE TABLE users (id SERIAL PRIMARY KEY,name TEXT,favorite_numbers INTEGER[],  -- 整数数组字段favorite_colors TEXT[]       -- 文本数组字段
);

插入数组数据:

INSERT INTO users (name, favorite_numbers, favorite_colors)
VALUES ('Alice', '{1, 2, 3}', '{"red", "blue", "green"}');

查询数组数据:

// 查询 favorite_numbers 包含 2 的用户
SELECT name FROM users WHERE 2 = ANY (favorite_numbers);// 查询数组是否包含所有指定值
-- 查询 favorite_numbers 包含所有值 {1, 2} 的用户
SELECT name FROM users WHERE favorite_numbers @> '{1, 2, 4}';// 查询数组是否为另一个数组的子集
-- 查询 favorite_numbers 是 {1, 2, 3} 的子集的用户
SELECT name FROM users WHERE favorite_numbers <@ '{1, 2, 3}';

更新数组:

// 向 Alice 的 favorite_numbers 中追加一个新值 40
UPDATE users SET favorite_numbers = favorite_numbers || 40 WHERE name = 'Alice';// 将 Alice 的 favorite_numbers 的第 1 个元素更新为 100
UPDATE users SET favorite_numbers[1] = 100 WHERE name = 'Alice';

删除数据中元素:

UPDATE users SET favorite_numbers = array_remove(favorite_numbers, '40') WHERE name = 'Alice';

PostgreSQL 提供了许多用于数组操作的内置函数和操作符:

操作符/函数描述示例
ARRAY[...]创建数组SELECT ARRAY[1, 2, 3];
ANY (array)判断值是否在数组中SELECT 2 = ANY('{1, 2, 3}');
@>数组包含另一个数组SELECT '{1, 2, 3}'::int[] @> '{1, 2}';
<@数组是另一个数组的子集SELECT '{1, 2}'::int[] <@ '{1, 2, 3}';
array_length(array, n)获取数组的长度SELECT array_length('{1, 2, 3}', 1);
unnest(array)将数组展开为行SELECT unnest('{1, 2, 3}'::int[]);
array_remove删除数组中某个值UPDATE users SET favorite_numbers = array_remove(favorite_numbers, '40')

JSON和JSONB

在 PostgreSQL 中,JSONJSONB 是两种用于存储 JSON 数据的列类型。它们功能强大,广泛用于现代应用中。

JSON 与 JSONB 的主要区别

  1. 存储方式

    • JSON:以文本格式存储数据,存储和检索时保持输入顺序。
    • JSONB:以二进制格式存储,经过解析和去重处理(键的顺序不保存)。
  2. 性能

    • JSON:适合读取为原始 JSON 字符串,查询效率较低。
    • JSONB:支持索引,查询和操作效率更高。
  3. 使用场景

    • JSON:需要保持原始 JSON 数据格式(如调试或日志记录)。
    • JSONB:需要高效查询、过滤或处理 JSON 数据。

创建表:

CREATE TABLE example (id SERIAL PRIMARY KEY,data JSON,      -- 存储为 JSON 格式data_b JSONB    -- 存储为 JSONB 格式
);

插入数据:

INSERT INTO example (data, data_b) VALUES 
('{"name": "Alice", "age": 25, "tags": ["developer", "gamer"]}', '{"name": "Alice", "age": 25, "tags": ["developer", "gamer"]}');

查询数据:

1. 访问 JSON 数据的字段

使用 ->->> 操作符:

  • ->:提取字段为 JSON 类型。
  • ->>:提取字段为文本类型。
-- 提取 JSON 对象的字段
SELECT data->'name' AS name_json, data_b->'name' AS name_jsonb FROM example;-- 提取字段值为文本
SELECT data->>'name' AS name_text, data_b->>'name' AS name_text FROM example;

2、查询嵌套数据

-- 提取嵌套 JSON 对象中的字段值
SELECT data->'tags'->>0 AS first_tag, data_b->'tags'->>0 AS first_tag FROM example;

3、JSONB函数和操作符

  • 检查字段是否存
    -- 检查 JSONB 中是否包含某个字段
    SELECT data_b ? 'name' AS has_name FROM example;-- 检查多个字段是否存在
    SELECT  data_b ?& array['name', 'age'] AS has_all 
    FROM example;
  • 数组操作
    -- 查询 JSONB 数组是否包含某个值
    SELECT data_b->'tags' ? 'developer' AS contains_tag FROM example;
  • 删除字段
    SELECT data_b - 'age' AS without_age FROM example;

数据更新:

// 更新json数据中age字段值为30
UPDATE example SET data_b = jsonb_set(data_b, '{age}', '30')
WHERE data_b->>'name' = 'Alice';

相关文章:

PostgreSQL学习笔记(二):PostgreSQL基本操作

PostgreSQL 是一个功能强大的开源关系型数据库管理系统 (RDBMS)&#xff0c;支持标准的 SQL 语法&#xff0c;并扩展了许多功能强大的操作语法. 数据类型 数值类型 数据类型描述存储大小示例值SMALLINT小范围整数&#xff0c;范围&#xff1a;-32,768 到 32,7672 字节-123INTE…...

关于内网外网,ABC类地址,子网掩码划分

本文的三个关键字是&#xff1a;内网外网&#xff0c;ABC类地址&#xff0c;子网掩码划分。围绕以下问题展开&#xff1a; 如何从ip区分外网、内网&#xff1f;win和linux系统中&#xff0c;如何查询自己的内网ip和外网ip。开发视角看内外网更多是处于安全考虑&#xff0c;接口…...

nginx 配置 本地启动

1.nginx下载地址&#xff1a;nginx: download nginx详解&#xff1a;Nginx配置终极版指南&#xff08;全网最详细&#xff09;_nginx_脚本之家 2.vue 项目打包生成dist文件里面的文件复制到下载好的nginx的html目录下 3.配置nginx配置文件 打包生成的dist前端包都是属于生产环…...

UE5 打包要点

------------------------- 1、需要环境 win sdk &#xff0c;大约3G VS&#xff0c;大约10G 不安装就无法打包&#xff0c;就是这么简单。 ----------------------- 2、打包设置 编译类型&#xff0c;开发、调试、发行 项目设置-地图和模式&#xff0c;默认地图 项目…...

OneFlow的简单介绍

OneFlow 是北京一流科技有限公司旗下的采用全新架构设计的开源工业级通用深度学习框架。以下是关于 OneFlow 的详细介绍&#xff1a; 本篇文章的目录 特点 功能 应用场景 发展历程 特点 简洁易用的接口&#xff1a;为深度学习相关的算法工程师提供一套简洁易用的用户接口…...

聊一聊 C#异步 任务延续的三种底层玩法

一&#xff1a;背景 1. 讲故事 最近聊了不少和异步相关的话题&#xff0c;有点疲倦了&#xff0c;今天再写最后一篇作为近期这类话题的一个封笔吧&#xff0c;下篇继续写我熟悉的 生产故障 系列&#xff0c;突然亲切感油然而生&#xff0c;哈哈&#xff0c;免费给别人看程序故…...

(k8s)Flannel Error问题解决!

1.问题描述 书接上回&#xff0c;我们在解决kubectl不断重启的时候引入了Flannel 网络插件&#xff0c;但是一上来就报错&#xff0c; 2.问题解决 自己的思路&#xff1a;照例开始检查 1.先检查一下目前Flannel的pod kubectl get pods --all-namespaces 2.检查 Flannel的po…...

Delaunay三角刨分算法理解及c#过程实现

Delaunay三角刨分算法理解及c#过程实现 0 引言1 关于三角剖分2 Delaunay三角剖分算法实现及对比3 结语0 引言 💻💻AI一下💻💻 三角剖分是什么? 三角剖分是一种将平面或曲面划分成三角形集合的方法。在二维平面中,给定一个平面区域(可以是多边形等),通过连接区域…...

Backend - ADO.NET(C# 操作Oracle、PostgreSQL DB)

目录 一、引入参考 1. ConfigurationManager的调用前提&#xff1a; 2. NpgsqlConnection的调用前提&#xff1a; 3. OracleConnection的调用前提&#xff1a; 二、设置数据库链接字串 1. 在App.config中设定链接数据库详情 2. 获取数据库链接字串 三、调用 1.调用Oracle数据库…...

Idea-离线安装SonarLint插件地址

地址&#xff1a; SonarQube for IDE - IntelliJ IDEs Plugin | Marketplace 选择Install Plugin from Disk..&#xff0c;选中下载好的插件&#xff0c;然后重启idea...

Leetcode Hot100 第三题 234. 回文链表

用快慢指针找到链表中间节点反转后面一段链表遍历每个节点做判断为什么是while pre: 不能写while head呢 ? 答&#xff1a;因为slow节点在反转后&#xff0c;他的前序节点除了反转之后的节点&#xff0c;之前正序的节点仍然存在的&#xff0c;即slow.pre 的next依旧是slow, 我…...

Python教程丨Python环境搭建 (含IDE安装)——保姆级教程!

工欲善其事&#xff0c;必先利其器。 学习Python的第一步不要再加收藏夹了&#xff01;提高执行力&#xff0c;先给自己装好Python。 1. Python 下载 1.1. 下载安装包 既然要下载Python&#xff0c;我们直接进入python官网下载即可 Python 官网&#xff1a;Welcome to Pyt…...

SpringBoot项目实战(39)--Beetl网页HTML文件中静态图片及CSS、JS文件的引用和展示

使用Beetl开发网页时&#xff0c;在网页中使用的CSS、JS、图片等静态资源需要进行适当的配置才可以展示。大致的过程如下&#xff1a; &#xff08;1&#xff09;首先Spring Security框架需要允许js、css、图片资源免授权访问。 &#xff08;2&#xff09;网站开发时&#xff0…...

ARIMA模型 (AutoRegressive Integrated Moving Average) 算法详解与PyTorch实现

ARIMA模型 (AutoRegressive Integrated Moving Average) 算法详解与PyTorch实现 目录 ARIMA模型 (AutoRegressive Integrated Moving Average) 算法详解与PyTorch实现1. ARIMA模型概述1.1 时间序列预测1.2 ARIMA的优势2. ARIMA的核心技术2.1 自回归 (AR)2.2 差分 (I)2.3 移动平…...

【Uniapp-Vue3】swiper滑块视图容器的用法

我们使用swiper标签就可以实现轮播图的效果。 一、swiper组件的结构 整体的轮播图使用swiper标签&#xff0c;轮播的每一页使用swiper-item标签。 <template><swiper class"swiper"><swiper-item><view class"swiper-item">111…...

allure报告修改默认语言为中文

1、项目根目录创建.py文件&#xff0c;把代码复制进去 import os from pathlib import Pathdef create_settings_js_file(directory"../pytest_mytt/reports/allures/", filenamesettings.js):# 创建或确认目录存在Path(directory).mkdir(parentsTrue, exist_okTrue…...

国产3D CAD将逐步取代国外软件

在工业软件的关键领域&#xff0c;计算机辅助设计&#xff08;CAD&#xff09;软件对于制造业的重要性不言而喻。近年来&#xff0c;国产 CAD 的发展态势迅猛&#xff0c;展现出巨大的潜力与机遇&#xff0c;正逐步改变着 CAD 市场长期由国外软件主导的格局。 国产CAD发展现状 …...

GolangWeb开发- net/http模块

文章目录 Golang开发-案例整理汇总一、net/http介绍二、HTTP客户端Get请求Post请求三、HTTP服务端总结Golang开发经典案例,点击下方链接 Golang开发-案例整理汇总 一、net/http介绍 Go语言内置的net/http包提供了HTTP客户端和服务端的实现。 文档链接: https://pkg.go.dev/n…...

Vue2中使用Echarts

1.安装echarts 在项目根目录下&#xff0c;使用npm或yarn安装ECharts&#xff1a; npm install echarts --save 或者 yarn add echarts 2.在相应的vue页面中引入echarts <script> import * as echarts from "echarts"; </script> 3.代码解析 <…...

AI赋能服装零售:商品计划智能化,化危机为转机

在服装零售这片竞争激烈的战场上&#xff0c;每一个细微的决策都可能成为品牌兴衰的关键。当市场波动、消费者口味变化、供应链挑战接踵而至时&#xff0c;许多品牌往往将危机归咎于外部环境。然而&#xff0c;真相往往更为深刻——“危机不是外部的&#xff0c;而是你的商品计…...

应用升级/灾备测试时使用guarantee 闪回点迅速回退

1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间&#xff0c; 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点&#xff0c;不需要开启数据库闪回。…...

STM32+rt-thread判断是否联网

一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...

条件运算符

C中的三目运算符&#xff08;也称条件运算符&#xff0c;英文&#xff1a;ternary operator&#xff09;是一种简洁的条件选择语句&#xff0c;语法如下&#xff1a; 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true&#xff0c;则整个表达式的结果为“表达式1”…...

【Oracle】分区表

个人主页&#xff1a;Guiat 归属专栏&#xff1a;Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...

鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南

1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发&#xff0c;使用DevEco Studio作为开发工具&#xff0c;采用Java语言实现&#xff0c;包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...

rnn判断string中第一次出现a的下标

# coding:utf8 import torch import torch.nn as nn import numpy as np import random import json""" 基于pytorch的网络编写 实现一个RNN网络完成多分类任务 判断字符 a 第一次出现在字符串中的位置 """class TorchModel(nn.Module):def __in…...

中医有效性探讨

文章目录 西医是如何发展到以生物化学为药理基础的现代医学&#xff1f;传统医学奠基期&#xff08;远古 - 17 世纪&#xff09;近代医学转型期&#xff08;17 世纪 - 19 世纪末&#xff09;​现代医学成熟期&#xff08;20世纪至今&#xff09; 中医的源远流长和一脉相承远古至…...

视觉slam十四讲实践部分记录——ch2、ch3

ch2 一、使用g++编译.cpp为可执行文件并运行(P30) g++ helloSLAM.cpp ./a.out运行 二、使用cmake编译 mkdir build cd build cmake .. makeCMakeCache.txt 文件仍然指向旧的目录。这表明在源代码目录中可能还存在旧的 CMakeCache.txt 文件,或者在构建过程中仍然引用了旧的路…...

华为OD机考-机房布局

import java.util.*;public class DemoTest5 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseSystem.out.println(solve(in.nextLine()));}}priv…...

Mysql故障排插与环境优化

前置知识点 最上层是一些客户端和连接服务&#xff0c;包含本 sock 通信和大多数jiyukehuduan/服务端工具实现的TCP/IP通信。主要完成一些简介处理、授权认证、及相关的安全方案等。在该层上引入了线程池的概念&#xff0c;为通过安全认证接入的客户端提供线程。同样在该层上可…...