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

数据类型和运算符

在这里插入图片描述

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.xdnf.cn/news/1558974.html

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

相关文章

minio简单使用

文章目录 简介官方地址Linux下载安装安装服务启动关闭帮助命令 java开发minio依赖包新建项目pom配置文件配置类Service测试类运行测试 Api使用前言针对桶的操作查看某个桶是否存在创建一个桶返回桶列表删除一个桶 针对文件的操作上传文件到桶中(本地文件上传)上传文件到桶中(基…

C++标准模板库STL之容器--string

STL简介 STL&#xff08;standard template libaray - 标准模板库&#xff09;是C标准库的重要组成部分&#xff0c;不仅是一个可复用的组件库&#xff0c;还是一个包罗了数据结构与算法的软件框架。 STL的六大组件及相关函数 仿函数greater、less……算法find、swap、reverse、…

2020年华为杯数学建模竞赛D题论文和代码

无人机集群协同对抗 摘 要&#xff1a; 本文针对非线性约束条件下红蓝双方无人机集群协同对抗的最优规划问题&#xff0c;结合贪婪队形、非线性规划、内点法、蒙特卡洛方法和全联立正交配置有限元法&#xff0c;构建了无人机集群协同对抗推演模型。 针对问题一&#…

OBOO鸥柏全户外液晶广告机室外触控一体机技术标参数公布

整机参数技术公布&#xff1a; OBOO鸥柏智能43寸/49寸/55寸/65寸/75寸/86寸/98寸/110寸全户外LCD液晶安卓系统网络广告屏/室外触摸屏查询一体机投标参数投标标准款。 1、液晶屏具工业级液晶面板&#xff0c;亮度为2000cd/㎡&#xff0c;并且具备自动感光亮度调节&#xff0c;…

工业网关的主要功能-天拓四方

引言&#xff1a; 在当今工业自动化的浪潮中&#xff0c;工业网关作为一种重要的网络连接设备&#xff0c;扮演着不可或缺的角色。其强大的功能使得工业设备能够无缝接入网络&#xff0c;实现远程监控、控制、数据采集和协议转换等&#xff0c;极大地提升了工业生产的效率和智…

算法专题五: 位运算

目录 常见位运算总结1. 位1的个数2. 比特位计数3. 汉明距离4. 只出现一次的数字5. 只出现一次的数字Ⅲ6. 判定字符是否唯一7. 丢失的数字8. 两正数之和9. 只出现一次的数字Ⅲ10. 消失的两个数字 常见位运算总结 重点 : 1. 位1的个数 算法思路: 这道题就用到了我们总结的那个第…

图解 微信开发者工具 小程序源码 调试、断点标记方法 , 微信小程序调试器,真机调试断点调试方法,小程序网络API请求调试方法 总结

在我们使用微信开发者工具进行微信小程序开发的时候&#xff0c;在这个微信开发者工具的代码编辑框里面我们是无法像使用vscode, idea等IDE工具时那样直接对代码打断点进行调试&#xff0c; 原因是小程序实际上他就是一个web浏览器应用的包装, 在其内部使用的还是类似chrome的…

C/C++程序员为什么要了解汇编?了解汇编有哪些好处?如何学习汇编?

目录 1、概述 2、从汇编的角度去理解问题的若干实例说明 2.1、使用空指针去访问类的数据成员或调用类的虚函数为什么会引发崩溃&#xff1f; 2.2、从汇编代码的角度去理解多线程的执行细节&#xff0c;去理解多线程在访问共享资源时为什么要加锁 2.3、使用Windbg静态分析d…

Canal 扩展篇(阿里开源用于数据同步备份,监控表和表字段(日志))

1.Canal介绍 Canal把自己伪装成从数据库&#xff0c;获取mysql主数据库的日志&#xff08;binlog&#xff09;信息&#xff0c;所以要想使用canal就得先开启数据库日志 https://github.com/alibaba/canal Canal 主要用途是基于 MySQL 数据库增量日志解析&#xff0c;提供增量…

Spring Boot2.x教程:(五)日志分割

日志分割 1、概述2、为什么选择Logback2.1、创建配置文件2.2、配置说明2.3、修改应用程序配置2.4、启动应用程序 3、总结 大家好&#xff0c;我是欧阳方超&#xff0c;可以扫描下方二维码关注我的公众号“欧阳方超”&#xff0c;后续内容将在公众号首发。 1、概述 在现代应用程…

ubuntu18.04系统中图形化界面

一、Ubuntu 18.04 中&#xff0c;使用 GDM 作为默认的图形用户界面&#xff08;GUI&#xff09;管理器。GDM 是 GNOME Display Manager 的缩写&#xff0c;它是用于 Ubuntu 的显示管理器&#xff0c;负责处理登录和会话管理。 通过命令行重启 Ubuntu 18.04 上的图形界面服务&am…

技术路线图用什么画?用这个在线工具轻松完成绘制!

在当今快速发展的技术世界中&#xff0c;技术路线图已成为企业和团队不可或缺的战略规划工具。它不仅能够清晰地展示技术发展方向&#xff0c;还能帮助团队成员、利益相关者和投资者更好地理解和参与技术战略的制定过程。但不可否认的是&#xff0c;创建一个有效的技术路线图并…

付费计量系统实体和接口(6)

13.7.3 Sub-classification of the Metering functions计量功能的子分级 The Metering function primarily deals with the measurement of the quantity of delivered electrical energy to the consumer. These measurements are made available for use by other functions …

qt 3D编程

Qt 3D是一个用于构建交互式3D图形应用的库&#xff0c;它是Qt库的一 部分。Qt 3D提供了一组C和QMLAPI&#xff0c;帮助开发者快速构 建3D应用程序。 一、核心模块 Qt3DCore 功能&#xff1a;提供3D场景中的基本概念&#xff0c;如实体&#xff08;Entity&#xff09;、组件&…

R语言运行地理探测器模型

地理探测器&#xff08;GeoDetector&#xff09;是一种用于空间分析的统计模型&#xff0c;它能够探测空间分异性以及揭示其背后驱动力的一组方法。它的核心思想是基于这样的假设&#xff1a;如果某个自变量对某个因变量有重要影响&#xff0c;那么自变量和因变量的空间分布应该…

java的LinkedList

java的LinkedList 什么是LinkedListLinkedList的模拟实现LinkedList的使用ArrayList和LinkedList的区别 什么是LinkedList LinkedList的官方文档 LinkedList的底层是双向链表结构&#xff0c;由于链表没有将元素存储在连续的空间中&#xff0c;元素存储在单独的结点中&#xf…

【Redis】Set类型的常用命令与应用场景

目录 1.命令小结 2.命令解析 3.编码方式与应用场景 1.命令小结 &#xff08;1&#xff09;set的特点 1&#xff09;set中存放的数据也都是String类型 2&#xff09;set集合中的元素是无须的 3&#xff09;set集合中的元素是唯一的&#xff0c;不可重复 &#xff08;2&a…

MySql 之 Binglog 复制

复制是一种将数据从一个 MySQL 数据库服务器异步复制到另一个的技术。使用 MySQL 复制选项&#xff0c;您可以复制所有数据库、选定的数据库甚至选定的表&#xff0c;具体取决于您的使用情况。 前提条件 确保在源服务器上启用了二进制日志记录。确保复制配置中的所有服务器都有…

uniapp——h5的控制台调试、h5调试

介绍 小程序在调试的时候可以打开调试模式&#xff0c;可以看到console.log的打印情况。 但是H5运行到手机上没有默认的调试的模式&#xff0c;但是可以人为手动加一个。 如何实现 1、main.js文件 import Vconsole from ‘vconsole’ /** 关闭正式环境打印日志&#xff…

Centos7.5 安装和配置jdk17

目录 一、下载JDK17包 二、将安装包放入服务器 三、解压jdk包到/usr/lib/jvm 四、修改JDK环境配置 1、打开配置文件 2、最后一行插入 3、立即生效 4、检查版本 一、下载JDK17包 访问网址:Java Downloads | Oraclehttps://www.oracle.com/java/technologies/downloads…