PostgreSQL学习笔记三:数据类型和运算符

news2024/10/9 21:55:44

数据类型和运算符

在这里插入图片描述

PostgreSQL 支持多种数据类型和运算符,以下是一些常见的数据类型和运算符的概述:

数据类型

  1. 基本数据类型

    • 整数类型

      • 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:可变长度字符串,没有长度限制。
  2. 日期和时间类型

    • DATE:日期(年、月、日)。
    • TIME:时间(时、分、秒)。
    • TIMESTAMP:日期和时间。
    • INTERVAL:时间间隔。
  3. 布尔类型

    • BOOLEAN:真(TRUE)、假(FALSE)或未知(NULL)。
  4. 复合类型

    • 可以定义复合类型(类似于结构体),例如:
      CREATE TYPE person AS (
          name VARCHAR(100),
          age INT
      );
      
  5. 数组类型

    • 支持数组,例如:
      CREATE TABLE example (
          id SERIAL PRIMARY KEY,
          numbers INT[]
      );
      
  6. JSON 和 JSONB

    • JSON:存储 JSON 数据。
    • JSONB:二进制格式的 JSON,支持更快的查询。
  7. 地理空间数据类型

    • POINTLINEPOLYGON 等,适用于地理信息系统(GIS)。

在这里插入图片描述
https://www.postgresql.org/docs/current/datatype.html

运算符

  1. 算术运算符

    • +:加法
    • -:减法
    • *:乘法
    • /:除法
    • %:取模
  2. 比较运算符

    • =:等于
    • !=<>:不等于
    • >:大于
    • <:小于
    • >=:大于等于
    • <=:小于等于
  3. 逻辑运算符

    • AND:与
    • OR:或
    • NOT:非
  4. 字符串运算符

    • ||:字符串连接
    • LIKE:模式匹配
    • ILIKE:不区分大小写的模式匹配
  5. 数组运算符

    • @>:包含
    • <@:被包含
    • &&:交集
  6. 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 的官方文档中找到完整的数组函数列表。

数组类型的特性和限制

特性

  1. 多维数组:PostgreSQL 允许定义可变长度的多维数组,可以是任何内置或用户定义的基本类型、枚举类型、复合类型等。
  2. 灵活性:数组的维度和大小可以在创建表时指定,但 PostgreSQL 不强制执行这些限制,实际行为与未指定长度的数组相同。
  3. 数组操作:支持多种数组操作符和函数,如连接、包含、重叠等。

限制

  1. 不强制维度和大小:虽然可以在定义中指定数组的维度和大小,但 PostgreSQL 不会强制这些限制,数组的实际维度和大小取决于插入的数据。
  2. 性能考虑:在某些情况下,使用数组可能会导致性能问题,尤其是在需要频繁搜索数组元素时,建议考虑将数组元素拆分到独立的表中。
  3. 不支持域类型:目前 PostgreSQL 不支持域类型的数组。

JSON 和 JSONB 的区别

  1. 存储格式

    • JSON:以文本形式存储,保留输入的空格、重复键和顺序。每次查询时需要解析,因此性能较低。
    • JSONB:以二进制格式存储,解析后删除不必要的空格和重复键,顺序可能不同。JSONB 的查询性能更好,因为它在存储时进行了优化。
  2. 索引支持

    • JSON:不支持 GIN 或 GiST 索引,查询性能较差。
    • JSONB:支持 GIN 和 GiST 索引,能够显著提高查询性能。
  3. 使用场景

    • JSON:适用于不需要频繁查询和操作的场景。
    • JSONB:适用于需要高性能和频繁查询的场景,特别是处理大量 JSON 数据时。
  4. 性能

    • JSON 在写入时速度较快,但读取速度较慢;JSONB 写入速度稍慢,但读取速度较快。

根据具体需求选择合适的数据类型,可以有效提高数据库的性能和灵活性。

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

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

相关文章

vue3 vue2

vue3.0是如何变快的&#xff1f; diff算法优化 vue2的虚拟dom是进行全局的对比。vue3 新增了静态标记&#xff08;patchFlag&#xff09; 在与上次虚拟节点进行比较的时候&#xff0c;只对比带有patch Flag的节点&#xff0c;并且可以通过flag的信息得知当前节点要对比的具体内…

先进封装技术 Part03---重布线层(RDL)的科普

先进封装核心技术之一:重布线层(RDL)的科普文章 1、 引言 随着电子设备向更小型化、更高性能的方向发展,传统的芯片互连技术已经无法满足日益增长的需求。在这样的背景下,RDL(Re-distributed Layer,重布线层)技术应运而生,成为先进封装技术中的核心之一。 2、 RDL技术…

yolov8.yaml

前面说了yolov8的核心代码放在ultralytics里面&#xff0c;今天我们一起学习一下 YOLOv8模型下的Ultralytics文件目录结构。每个文件夹都有不同的作用&#xff0c;以下是对各个文件夹的解释&#xff1a; assets: 这个文件夹通常存放与模型相关的资源文件&#xff0c;可能包括训…

MySQL五千万大表查询优化实战

背景 DBA同事在钉钉发了两张告警截图&#xff0c;作为“始作俑者”的我很心虚&#xff0c;因为刚才是我在管理后台查询数据&#xff0c;结果很久都没出来&#xff0c;并且用多个维度查了N次 问题分析 这是当天上线的功能&#xff0c;完事我立马锁定SQL然后开启排查 # 原SQL&a…

系统性能优化

在程序员的职业生涯中&#xff0c;解决当前系统问题&#xff0c;优化性能&#xff0c;是走向高阶的必经之路。如果一辈子做着后台开发&#xff0c;写着CRUD&#xff0c;QPS低于10&#xff0c;那确实没必要去做性能优化&#xff0c;因为根本用不上。性能优化范围很广&#xff0c…

排序|插入排序|希尔排序|直接选择排序|堆排序的实现即特性(C)

插入排序 基本思想 直接插入排序是一种简单的插入排序法&#xff0c;其基本思想是&#xff1a; 把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中&#xff0c;直到所有的记录插入完为止&#xff0c;得到一个新的有序序列 。 单趟 当插入第 i ( i ≤ 1…

人数识别 人员超员识别系统 作业区域超员预警系统 ai#YOLO视觉

在当今复杂的生产作业与社会管理场景中&#xff0c;人员管理的精准性和高效性变得愈发重要。人数识别、人员超员识别系统、作业区域超员预警系统以及特殊岗位人员达标监测等&#xff0c;都是保障安全生产、提高运营效率和维护社会秩序的关键要素。随着人工智能(AI)技术的飞速发…

【Python实例】Python读取并绘制nc数据

【Python实例】Python读取并绘制nc数据 准备&#xff1a;安装netCDF库等读取nc数据相关信息绘制图形利用basemap绘图 参考 准备&#xff1a;安装netCDF库等 以【1960-2020年中国1km分辨率月降水数据集】中2020年降水为例。 先在Panopoly中查看数据属性&#xff0c;如下&#…

单细胞转录组 —— kb-python 原始数据处理

单细胞转录组 —— kb-python 原始数据处理 前言 kallisto|bustools 是一种用于预处理 scRNA-seq 数据的工作流程。 数据预处理步骤包括&#xff1a; 将 reads 与其来源细胞关联起来&#xff1b;根据唯一分子标识符&#xff08;UMI&#xff09;对 reads 进行去重&#xff1…

西门子S7-200 SMART高速计数器指令向导

在 Micro/WIN SMART 中的命令菜单中选择 Tools&#xff08;工具&#xff09;> Wizards&#xff08;向导&#xff09;中选择 High Speed Counter&#xff08;高速计数器向导&#xff09; &#xff0c;也可以在项目树中选择 Wizards&#xff08;向导&#xff09;文件夹中的 Hi…

下载相应版本的PyTorch

1、前置条件 下载某个版本的Python&#xff0c;本文涉及的Python版本为3.10 2、查看该Python版本可以下载的whl文件格式 pip debug --verbose 从上图可以发现python3.10可以下载格式为cp310-cp310-win_amd64的whl文件 PyTorch各稳定版本下载链接&#xff1a;https://downloa…

GNN与Transformer创新结合!模型性能起飞!

近年来&#xff0c;图神经网络&#xff08;GNN&#xff09;和Transformer模型因其在处理复杂数据结构和序列依赖性方面的卓越表现而受到广泛关注。这种优势使得将GNN与Transformer结合成为图表示学习领域的一个新兴且充满潜力的研究方向。通过结合这两种模型&#xff0c;我们不…

软考下午题1-数据流图

问题一&#xff1a;求实体的名称 例题&#xff1a; 1.提问方式-如问题1 从子图(0层数据流图)找比较快 外部实体可以是 人、物体、系统 在子图中找到加工&#xff0c;与文章中加工文字相对应&#xff0c;继续读文章&#xff0c;可以找到实体 E1-巴士列表文件 E2-机械师 E3-会…

《深度学习》LSTM 长短期记忆网络 结构及原理解析

目录 一、关于LSTM网络 1、什么是LSTM网络 举例&#xff1a; 2、RNN网络的结构 3、Tanh双曲正切函数 二、LSTM网络结构 1、遗忘门 1&#xff09;功能 2&#xff09;步骤 2、输入门 1&#xff09;功能 2&#xff09;步骤 3、输出门 1&#xff09;功能 2&#xff09;步骤…

斯坦福 CS229 I 机器学习 I 构建大型语言模型 (LLMs)

1. Pretraining -> GPT3 1.1. Task & loss 1.1.1. 训练 LLMs 时的关键点 对于 LLMs 的训练来说&#xff0c;Architecture&#xff08;架构&#xff09;、Training algorithm/loss&#xff08;训练算法/损失函数&#xff09;、Data&#xff08;数据&#xff09;、Evalu…

3D看车如何实现?有哪些功能特点和优势?

3D看车是一种创新的汽车展示方式&#xff0c;它利用三维建模和虚拟现实技术&#xff0c;将汽车以更真实、更立体的形式呈现在消费者面前。 一、3D看车的实现方式 1、三维建模&#xff1a; 通过三维建模技术&#xff0c;按照1:1的比例还原汽车外观&#xff0c;包括车身线条、细…

uniapp学习(003-2 vue3学习 Part.2)

零基础入门uniapp Vue3组合式API版本到咸虾米壁纸项目实战&#xff0c;开发打包微信小程序、抖音小程序、H5、安卓APP客户端等 总时长 23:40:00 共116P 此文章包含第15p-第p20的内容 文章目录 事件监听以及组件内置事件处理自定义模板快速创建uniapp条件渲染 v-if和v-elsev-e…

骨传导耳机哪个牌子好?五大选购妙计带你精准入手优质骨传导耳机!

随着骨传导耳机市场的蓬勃发展&#xff0c;此产品凭借优秀的佩戴体验以及可降低听力损伤等优点引起了广泛的关注。然而&#xff0c;随着热度提高&#xff0c;市面上开始出现了许多品牌&#xff0c;这些品牌实力技术各不相同&#xff0c;甚至其中还有一些劣质机型&#xff0c;这…

国内经典多模态大模型工作1——Qwen-VL系列(Qwen-VL、Qwen2-VL解读)

Qwen-VL 论文标题&#xff1a;《Qwen-VL: A Versatile Vision-Language Model for Understanding, Localization, Text Reading, and Beyond》 论文链接&#xff1a;https://arxiv.org/pdf/2308.12966.pdf 项目&#xff1a;https://github.com/QwenLM/Qwen-VL/tree/master 模…

如何构建某一行业的知识图谱

构建一个行业的知识图谱是一个系统而复杂的过程&#xff0c;它涉及到数据收集、处理、分析等多个环节。以下是构建行业知识图谱的基本步骤&#xff1a; 1. 需求分析&#xff1a; - 明确构建知识图谱的目的和应用场景&#xff0c;比如是用于辅助决策、市场分析、产品推荐等。…