PostgreSQL学习笔记三:数据类型和运算符
数据类型和运算符
PostgreSQL 支持多种数据类型和运算符,以下是一些常见的数据类型和运算符的概述:
数据类型
-
基本数据类型
-
整数类型:
SMALLINT
:2 字节,范围 -32,768 到 32,767。INTEGER
:4 字节,范围 -2,147,483,648 到 2,147,483,647。BIGINT
:8 字节,范围 -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807。
-
浮点数类型:
REAL
:4 字节,单精度浮点数。DOUBLE PRECISION
:8 字节,双精度浮点数。NUMERIC
:可变精度,适合存储精确的小数。
-
字符类型:
CHAR(n)
:固定长度字符串。VARCHAR(n)
:可变长度字符串,最大长度为 n。TEXT
:可变长度字符串,没有长度限制。
-
-
日期和时间类型
DATE
:日期(年、月、日)。TIME
:时间(时、分、秒)。TIMESTAMP
:日期和时间。INTERVAL
:时间间隔。
-
布尔类型
BOOLEAN
:真(TRUE)、假(FALSE)或未知(NULL)。
-
复合类型
- 可以定义复合类型(类似于结构体),例如:
CREATE TYPE person AS (name VARCHAR(100),age INT );
- 可以定义复合类型(类似于结构体),例如:
-
数组类型
- 支持数组,例如:
CREATE TABLE example (id SERIAL PRIMARY KEY,numbers INT[] );
- 支持数组,例如:
-
JSON 和 JSONB
JSON
:存储 JSON 数据。JSONB
:二进制格式的 JSON,支持更快的查询。
-
地理空间数据类型
POINT
、LINE
、POLYGON
等,适用于地理信息系统(GIS)。
https://www.postgresql.org/docs/current/datatype.html
运算符
-
算术运算符
+
:加法-
:减法*
:乘法/
:除法%
:取模
-
比较运算符
=
:等于!=
或<>
:不等于>
:大于<
:小于>=
:大于等于<=
:小于等于
-
逻辑运算符
AND
:与OR
:或NOT
:非
-
字符串运算符
||
:字符串连接LIKE
:模式匹配ILIKE
:不区分大小写的模式匹配
-
数组运算符
@>
:包含<@
:被包含&&
:交集
-
JSON 运算符
->
:获取 JSON 对象的字段->>
:获取 JSON 对象字段的文本值#>
:获取 JSON 对象的嵌套字段
示例
-- 创建表
CREATE TABLE users (id SERIAL PRIMARY KEY,name VARCHAR(100),age INT,created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);-- 插入数据
INSERT INTO users (name, age) VALUES ('Alice', 30);-- 查询数据
SELECT * FROM users WHERE age > 25;-- 使用运算符
SELECT name || ' is ' || age || ' years old' AS description FROM users;
如何使用数组类型进行数据操作
在 PostgreSQL 中,数组类型是一种非常强大的数据类型,它允许你将多个值存储在一个数组数据结构中。你可以使用数组类型来存储一维或多维数组,并且可以使用一系列内置函数和运算符来操作这些数组。
以下是一些基本的数组操作示例:
创建数组类型的列
CREATE TABLE products (id SERIAL PRIMARY KEY,names TEXT[],prices NUMERIC[]
);
插入数组数据
INSERT INTO products (names, prices) VALUES
('{Alice,Bob,Charlie}', '{100,150,200}');
查询数组数据
SELECT * FROM products;
更新数组数据
UPDATE products SET prices = prices[1:2] || ARRAY[250] || prices[3:3] WHERE id = 1;
这将更新 prices
数组,将第三个元素更改为 250。
数组内置函数和运算符
-
数组赋值:
SELECT prices[1] FROM products; -- 获取数组的第一个元素
-
数组连接:
SELECT prices || ARRAY[300] FROM products; -- 将新元素添加到数组末尾
-
数组切片:
SELECT prices[1:2] FROM products; -- 获取数组的第1到第2个元素(不包括索引2)
-
数组长度:
SELECT array_length(prices, 1) FROM products; -- 获取数组的长度
-
数组重叠:
SELECT prices && ARRAY[100, 200, 300] FROM products; -- 检查数组是否有重叠的元素
-
数组元素的存在性:
SELECT prices @> ARRAY[100] FROM products; -- 检查数组中是否存在特定的元素
-
数组位置:
SELECT prices <@ ARRAY[100, 150, 200, 250] FROM products; -- 检查数组是否是另一个数组的子集
-
数组交集和差集:
SELECT (prices * ARRAY[100, 150, 200]) AS intersection, -- 交集(prices - ARRAY[100, 150, 200]) AS difference -- 差集 FROM products;
-
多维数组:
CREATE TABLE matrices (id SERIAL PRIMARY KEY,matrix NUMERIC[][] ); INSERT INTO matrices (matrix) VALUES (ARRAY[[1,2],[3,4]]);
多维数组操作
对于多维数组,你可以使用更复杂的切片语法来获取元素。
-- 获取二维数组的第一行
SELECT matrix[1:2] FROM matrices;-- 获取二维数组的第一列
SELECT matrix[1:2:1] FROM matrices;
注意事项
- 数组中的所有元素必须是相同的数据类型。
- 数组可以使用下标访问,但是下标是从 1 开始的,而不是从 0 开始。
- PostgreSQL 中的数组是一维数组的变体,对于多维数组,实际上是存储一系列数组。
这些是 PostgreSQL 中数组类型的基本操作。PostgreSQL 提供了大量的数组处理函数,可以进行更复杂的操作,如数组排序、反转、转换等。你可以在 PostgreSQL 的官方文档中找到完整的数组函数列表。
数组类型的特性和限制
特性:
- 多维数组:PostgreSQL 允许定义可变长度的多维数组,可以是任何内置或用户定义的基本类型、枚举类型、复合类型等。
- 灵活性:数组的维度和大小可以在创建表时指定,但 PostgreSQL 不强制执行这些限制,实际行为与未指定长度的数组相同。
- 数组操作:支持多种数组操作符和函数,如连接、包含、重叠等。
限制:
- 不强制维度和大小:虽然可以在定义中指定数组的维度和大小,但 PostgreSQL 不会强制这些限制,数组的实际维度和大小取决于插入的数据。
- 性能考虑:在某些情况下,使用数组可能会导致性能问题,尤其是在需要频繁搜索数组元素时,建议考虑将数组元素拆分到独立的表中。
- 不支持域类型:目前 PostgreSQL 不支持域类型的数组。
JSON 和 JSONB 的区别
-
存储格式:
- JSON:以文本形式存储,保留输入的空格、重复键和顺序。每次查询时需要解析,因此性能较低。
- JSONB:以二进制格式存储,解析后删除不必要的空格和重复键,顺序可能不同。JSONB 的查询性能更好,因为它在存储时进行了优化。
-
索引支持:
- JSON:不支持 GIN 或 GiST 索引,查询性能较差。
- JSONB:支持 GIN 和 GiST 索引,能够显著提高查询性能。
-
使用场景:
- JSON:适用于不需要频繁查询和操作的场景。
- JSONB:适用于需要高性能和频繁查询的场景,特别是处理大量 JSON 数据时。
-
性能:
- JSON 在写入时速度较快,但读取速度较慢;JSONB 写入速度稍慢,但读取速度较快。
根据具体需求选择合适的数据类型,可以有效提高数据库的性能和灵活性。
相关文章:

PostgreSQL学习笔记三:数据类型和运算符
数据类型和运算符 PostgreSQL 支持多种数据类型和运算符,以下是一些常见的数据类型和运算符的概述: 数据类型 基本数据类型 整数类型: SMALLINT:2 字节,范围 -32,768 到 32,767。INTEGER:4 字节࿰…...

ROS理论与实践学习笔记——6 ROS机器人导航(仿真)
在 ROS 中,机器人导航(Navigation)是由多个功能包组合而成的系统,统称为导航功能包集(navigation stack)。它提供了一个全面的框架,使得移动机器人能够自主导航到指定目标点,同时避开…...
uniapp开发微信小程序,button的open-type=“share“ 分享给个人跳转到首页问题
当使用button标签带上open-type"share"属性,点击之后可分享当前页面给微信好友,但是分享之后朋友点开跳转到了首页问题。 需要使用 onShareAppMessage 函数 export default {onShareAppMessage(res) {if (res.from button) {// 来自页面内分…...

【jQuery】 jQuery基础及选择器介绍(基本选择器 层次选择器 属性选择器 过滤选择器)
文章目录 jQuery基础1. 优势2. 版本3. 基本语法4. 选择器基本选择器层次选择器属性选择器过滤选择器基本过滤选择器可见性过滤选择器 注意事项 jQuery基础 jQuery 是一个功能强大且易于使用的 JavaScript 库,它极大地简化了前端开发的工作。无论是 DOM 操作、事件处…...

网站在对抗机器人攻击的斗争中失败了
95% 的高级机器人攻击都未被发现,这一发现表明当前的检测和缓解策略存在缺陷。 这表明,虽然一些组织可能拥有基本的防御能力,但他们没有足够的能力应对更复杂的攻击。 例如利用人工智能和机器学习来模仿人类行为的攻击。 这些统计数据强调…...
Centos7 搭建logstash
下载并安装公共签名密钥: sudo rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch 创建一个名为 /etc/yum.repos.d/logstash.repo 的文件,并添加以下内容: [logstash-7.x] nameElastic repository for 7.x packages baseu…...

面试题:Redis(五)
1. 面试题 面试问 记录对集合中的数据进行统计 在移动应用中,需要统计每天的新增用户数和第2天的留存用户数; 在电商网站的商品评论中,需要统计评论列表中的最新评论; 在签到打卡中,需要统计一个月内连续打卡的用户数&…...

LeetCode18.四数之和
题目链接:18. 四数之和 - 力扣(LeetCode) 这道题是在三数之和上改编出来的,在写这道题之前可以尝试以下三数之和(15. 三数之和 - 力扣(LeetCode)); 1.常规解法…...

jmeter出参保存到文件,保存失败解决
1、添加JSON提取 2、添加beanshell FileWriter writer new FileWriter("C:/Users/xxx/Desktop/signUrl.csv", true); writer.write(vars.get("company_name")"\t"vars.get("signUrl")"\n"); writer.close(); 写文件的两个…...
黑龙江网络安全等级保护办理机制
黑龙江的网络安全等级保护机制根据《网络安全法》和相关法规要求,信息系统按照安全等级从低到高分为五级,分别为一般、重要、非常重要、特别重要和特别敏感。不同等级的信息系统必须实施相应的安全措施,以确保系统免受内外部威胁,…...
小红的行列式构造
链接:登录—专业IT笔试面试备考平台_牛客网 来源:牛客网 题目描述 小红希望你构造一个3阶行列式,满足每个元素的绝对值不小于1,且行列式的值等于xxx。你能帮帮她吗? 输入描述: 一个整数xxx −100≤x≤100 输出描…...
pyflink过滤kafka数据
from pyflink.table import (TableEnvironment, EnvironmentSettings)# 输入、输出、过滤条件 columns_in [ ... ]columns_out [ ... ] filter_condition "name 蒋介石 and sex 男"# 创建执行环境t_env TableEnvironment.create(EnvironmentSettings.in_stream…...

Webpack 完整指南
🌈个人主页:前端青山 🔥系列专栏:Webpack篇 🔖人终将被年少不可得之物困其一生 依旧青山,本期给大家带来webpack篇专栏内容:webpack介绍 目录 介绍 一、webpack 1.1、webpack是什么 1.2 webpack五个核心配置 1.…...
如何在 Ubuntu20.04 安装FTP Server vsftpd
1.安装: sudo apt-get install vsftpd 2.启动 sudo service vsftpd start //启动 sudo service vsftpd stop //停止 sudo service vsftpd restart //重新启动 3.打开配置文件 sudo nano /etc/vsftpd.conf 4.配置:限制在指定目录&…...

基于FPGA的DDS信号发生器(图文并茂+深度原理解析)
篇幅有限,本文详细源文件已打包 至个人主页资源,需要自取...... 前言 DDS(直接数字合成)技术是先进的频率合成手段,在数字信号处理与硬件实现领域作用关键。它因低成本、低功耗、高分辨率以及快速转换时间等优点备受认可。 本文着重探究基于 FPGA 的简易 DDS 信号发生器设…...

QT:绘制事件和定时器
1.绘制时针 xx.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QTimer> #include<QPainter> #include <QTime>QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Widget : public QWidget {Q_OBJECTpubl…...
【算法——递归回溯】
这个东西还是很重要的,直接决定了你的动态规划章节的学习深度 78. 子集 方法1: vector<vector<int>>V; void dfs(vector<int> v,vector<int> nums,int index) {if(indexnums.size()) V.push_back(v);else{v.push_back(nums[i…...
手机在网状态接口的使用和注意事项
手机在网状态接口是用于查询手机号码在运营商数据库中的实时状态的工具,这种接口在互联网金融、贷款、租赁、保险等相关行业中尤为重要,因为它可以帮助这些行业进行更有效的风控审核。以下是对手机在网状态接口的详细介绍: 一、手机在网状态…...

WebGl 使用uniform变量动态修改点的颜色
在WebGL中,uniform变量用于在顶点着色器和片元着色器之间传递全局状态信息,这些信息在渲染过程中不会随着顶点的变化而变化。uniform变量可以用来设置变换矩阵、光照参数、材料属性等。由于它们在整个渲染过程中共享,因此可以被所有使用该着色…...

Leetcode 划分字母区间
题目要求: 将字符串 s 划分成尽量多的片段,保证每个片段中出现的字母不会出现在其他片段中。 具体解释如下: 尽量多的片段:题目要求的是在划分过程中,我们要尽量让划分的片段数量最大化,而不是最少化。每…...

C++实现分布式网络通信框架RPC(3)--rpc调用端
目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中,我们已经大致实现了rpc服务端的各项功能代…...
Linux简单的操作
ls ls 查看当前目录 ll 查看详细内容 ls -a 查看所有的内容 ls --help 查看方法文档 pwd pwd 查看当前路径 cd cd 转路径 cd .. 转上一级路径 cd 名 转换路径 …...
Spring Boot面试题精选汇总
🤟致敬读者 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉 📘博主相关 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...
相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...

零基础设计模式——行为型模式 - 责任链模式
第四部分:行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习!行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想:使多个对象都有机会处…...

SpringCloudGateway 自定义局部过滤器
场景: 将所有请求转化为同一路径请求(方便穿网配置)在请求头内标识原来路径,然后在将请求分发给不同服务 AllToOneGatewayFilterFactory import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; impor…...

算法笔记2
1.字符串拼接最好用StringBuilder,不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...
C++.OpenGL (14/64)多光源(Multiple Lights)
多光源(Multiple Lights) 多光源渲染技术概览 #mermaid-svg-3L5e5gGn76TNh7Lq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-3L5e5gGn76TNh7Lq .error-icon{fill:#552222;}#mermaid-svg-3L5e5gGn76TNh7Lq .erro…...
【无标题】路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论
路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论 一、传统路径模型的根本缺陷 在经典正方形路径问题中(图1): mermaid graph LR A((A)) --- B((B)) B --- C((C)) C --- D((D)) D --- A A -.- C[无直接路径] B -…...

如何更改默认 Crontab 编辑器 ?
在 Linux 领域中,crontab 是您可能经常遇到的一个术语。这个实用程序在类 unix 操作系统上可用,用于调度在预定义时间和间隔自动执行的任务。这对管理员和高级用户非常有益,允许他们自动执行各种系统任务。 编辑 Crontab 文件通常使用文本编…...