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

PostgreSQL 入门与实践

1. SQL 概述

SQL(Structured Query Language)是一种用于管理和操作关系型数据库的标准语言。SQL 语句可用于数据的查询、插入、更新和删除,还可以创建和修改数据库的结构。

常见 SQL 操作:

  • 查询数据: SELECT

  • 插入数据: INSERT

  • 更新数据: UPDATE

  • 删除数据: DELETE

  • 创建表: CREATE TABLE

  • 删除表: DROP TABLE

2. PostgreSQL 与其他数据库的比较

PostgreSQL 是一款开源的、功能丰富的关系型数据库,它提供了与商业数据库相媲美的性能和可靠性。

2.1. PostgreSQL 与 MySQL 的比较

  • 功能扩展性:PostgreSQL 支持更多的高级功能,例如自定义函数、数组、JSON 数据类型、触发器等。

  • 事务与数据完整性:PostgreSQL 更注重 ACID 特性(原子性、一致性、隔离性和持久性),适合复杂事务处理。

  • 扩展性:PostgreSQL 允许通过插件进行功能扩展,支持地理空间数据(PostGIS),在大数据和分析场景中表现更好。

2.2. PostgreSQL 与 MongoDB 的比较

  • 关系型 vs 文档型:PostgreSQL 是关系型数据库,适合处理结构化数据;MongoDB 则是文档型数据库,适合处理非结构化或半结构化数据。

  • 事务支持:PostgreSQL 支持多事务,而 MongoDB 的事务处理相对较弱。

  • 查询性能:PostgreSQL 在处理复杂查询和分析时表现更优,尤其是在有大量联表操作的情况下。

3. PostgreSQL 数据类型

PostgreSQL 拥有多种数据类型,能够满足不同场景下的数据存储需求。

3.1. 基本数据类型

  • 整数类型:SMALLINT,INTEGER,BIGINT

  • 浮点数类型:REAL,DOUBLE PRECISION

  • 字符类型:VARCHAR(n),TEXT

  • 布尔类型:BOOLEAN

3.2. 高级数据类型

  • 数组:支持数组类型,可以存储一组同类型的数据。
CREATE TABLE example (data INT[]);
  • JSON/JSONB:PostgreSQL 支持 JSON 和 JSONB 数据类型,允许存储和查询 JSON 格式的数据。

CREATE TABLE users (id SERIAL PRIMARY KEY, info JSONB);
  • UUID:PostgreSQL 内置了对 UUID 的支持,适合用于唯一标识符。

CREATE TABLE devices (device_id UUID PRIMARY KEY);

4. PostgreSQL 存储过程与函数

PostgreSQL 允许创建存储过程(Procedures)和函数(Functions),用于封装业务逻辑,在数据库内直接执行复杂操作。

4.1. 示例 1:创建简单的加法函数

CREATE FUNCTION add_numbers(a INTEGER, b INTEGER) RETURNS INTEGER AS $$
BEGINRETURN a + b;
END;
$$ LANGUAGE plpgsql;

调用该函数:

SELECT add_numbers(10, 20);

4.2. 示例 2:创建复杂的存储过程

存储过程支持更复杂的业务逻辑,比如插入、更新或删除数据。

CREATE PROCEDURE insert_user(name TEXT, email TEXT)
LANGUAGE plpgsql
AS $$
BEGIN
INSERT INTO users (name, email) VALUES (name, email);
END;
$$;

调用该存储过程:

CALL insert_user('Alice', 'alice@example.com');

5. 项目建表实战

在实际应用中,通常需要创建用户表以及记录用户行为的表。这里我们通过创建一个用户表和一个用户行为表,展示如何管理用户数据以及跟踪用户的行为记录。

5.1. 创建用户表

首先,我们创建一个基本的用户表,存储用户的基础信息。

CREATE TABLE users (id SERIAL PRIMARY KEY,name VARCHAR(50),email VARCHAR(100),password VARCHAR(100),created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

5.2. 创建用户行为表

接着,我们创建一个用户行为表,用于记录用户在系统中的行为。例如,用户登录、点击按钮等操作。

CREATE TABLE user_actions (id SERIAL PRIMARY KEY,user_id INTEGER REFERENCES users(id),action_type VARCHAR(50),action_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

5.3. 插入与查询示例

插入用户:

INSERT INTO users (name, email, password) VALUES ('Bob', 'bob@example.com', 'password123');

记录用户行为:

INSERT INTO user_actions (user_id, action_type) VALUES (1, 'login');

查询用户及其行为:

SELECT u.name, ua.action_type, ua.action_time
FROM users u
JOIN user_actions ua ON u.id = ua.user_id
WHERE u.id = 1;

6. PostgreSQL 高级应用

6.1. 全文检索(Full-Text Search)

PostgreSQL 内置了强大的全文检索功能,允许在大文本数据中进行高效的关键词搜索。这对于处理大量文本数据(如博客文章、文档等)时非常有用。

1. 创建支持全文检索的表

CREATE TABLE articles (id SERIAL PRIMARY KEY,title TEXT,body TEXT,tsv_body tsvector
);

2. 创建索引并插入数据

CREATE INDEX idx_tsv_body ON articles USING gin(tsv_body);INSERT INTO articles (title, body, tsv_body)
VALUES ('PostgreSQL Full Text Search','This is an example of using full-text search in PostgreSQL.',to_tsvector('english', 'This is an example of using full-text search in PostgreSQL.')
);

3. 使用全文检索查询

SELECT title, body FROM articles WHERE tsv_body @@ to_tsquery('english', 'full & text');

6.2. 数据分区(Table Partitioning)

数据分区是将一个大表按照一定的规则拆分为多个小表,从而提高查询效率。在处理大规模数据时,分区能够显著提高性能。

1. 创建分区表

我们可以通过范围分区(Range Partitioning)对表进行分区。例如,按年份将数据分开存储:

CREATE TABLE sales (id SERIAL PRIMARY KEY,sale_date DATE,amount DECIMAL
) PARTITION BY RANGE (sale_date);

2. 创建分区

CREATE TABLE sales_2023 PARTITION OF sales FOR VALUES FROM ('2023-01-01') TO ('2023-12-31');
CREATE TABLE sales_2024 PARTITION OF sales FOR VALUES FROM ('2024-01-01') TO ('2024-12-31');

3. 插入和查询数据

PostgreSQL 会自动将数据插入到正确的分区:

INSERT INTO sales (sale_date, amount) VALUES ('2023-05-15', 100.00);
SELECT * FROM sales WHERE sale_date = '2023-05-15';

6.3. 并行查询(Parallel Query)

PostgreSQL 支持并行查询,当处理大量数据时,可以通过多个 CPU 核心并行执行查询任务,从而提升查询性能。

1. 启用并行查询

默认情况下,并行查询是自动启用的,可以通过以下参数调整并行度:

SET max_parallel_workers_per_gather = 4; -- 设置最多使用 4 个并行工作线程

2. 执行并行查询

PostgreSQL 会自动决定何时使用并行查询,通常在处理大量数据或复杂查询时生效:

EXPLAIN ANALYZE SELECT COUNT(*) FROM large_table;

6.4. JSON 和 JSONB 数据类型

PostgreSQL 提供了强大的 JSON 和 JSONB 数据处理功能,特别适用于处理半结构化数据。JSONB 是二进制格式,支持索引操作,性能更优。

1. 示例:创建包含 JSONB 字段的表

CREATE TABLE products (id SERIAL PRIMARY KEY,data JSONB
);

2. 插入 JSON 数据

INSERT INTO products (data) VALUES ('{"name": "Laptop", "price": 1200, "tags": ["electronics", "computers"]}');

3. 查询 JSON 数据

SELECT data->'name' AS product_name, data->'price' AS product_price FROM products;

4. JSONB 索引

JSONB 数据类型可以创建索引,提高查询速度:

CREATE INDEX idx_products_data ON products USING gin(data);

6.5. 数据库逻辑复制(Logical Replication)

逻辑复制是一种允许将特定表的数据变更复制到其他数据库的方法,特别适合用于实时同步数据、数据库分片等场景。

1. 创建发布者

CREATE PUBLICATION my_publication FOR TABLE users;

2. 创建订阅者

CREATE SUBSCRIPTION my_subscription 
CONNECTION 'host=publisher_host dbname=mydb user=myuser'
PUBLICATION my_publication;

通过逻辑复制,PostgreSQL 可以在不同的数据库实例之间同步特定表的数据变化。

7. JavaScript 编写 postgresql 存储过程与函数

通过 PLV8 扩展,您可以在 PostgreSQL 中使用 JavaScript 编写函数和存储过程,这为开发者提供了更多的灵活性和可能性,尤其是在处理复杂业务逻辑和 JSON 数据时。上述示例展示了如何使用 JavaScript 编写简单的加法函数、插入数据以及返回 JSON 格式的数据。

首先,需要在 PostgreSQL 中安装 PLV8 扩展,然后我们再使用 JavaScript 编写存储过程或函数。

7.1. PLV8 扩展

为了能够充分统一开发环境,建议使用 docker 安装 postgresql,基于以上已经安装并且启动的 postgresql 容器,在其中安装并使用 PLV8 拓展。

7.1.1. 容器内安装

1. 进入容器

docker exec -it my-postgres /bin/bash

2. 在容器中安装 PLV8

  • 首先,确保容器中安装了 build-essential、git 和其他依赖库

git clone https://github.com/plv8/plv8.git
cd plv8
  • 克隆 PLV8 仓库

git clone https://github.com/plv8/plv8.git
cd plv8
  • 编译并安装 PLV8
make
make install

3. 退出容器并重新启动 PostgreSQL 服务

7.1.2. 启用 PLV8 扩展

安装完成后,您需要在 PostgreSQL 中启用 PLV8 扩展。进入 PostgreSQL 容器并执行以下命令:

docker exec -it my-postgres psql -U postgres

然后在 PostgreSQL 控制台中启用 PLV8:

CREATE EXTENSION plv8;

7.2. 使用 JavaScript 编写存储过程或函数

7.2.1. 示例 1:使用 JavaScript 编写加法函数

这是一个简单的加法函数,使用 PLV8 和 JavaScript 编写:

CREATE FUNCTION js_add(a integer, b integer) RETURNS integer AS $$return a + b;
$$ LANGUAGE plv8;

调用这个函数结果会返回 30。

SELECT js_add(10, 20);

7.2.2. 示例 2:使用 JavaScript 插入数据

我们可以编写一个使用 JavaScript 插入数据到用户表的存储过程:

CREATE FUNCTION js_insert_user(name TEXT, email TEXT) RETURNS VOID AS $$plv8.execute("INSERT INTO users (name, email) VALUES ($1, $2)", [name, email]);
$$ LANGUAGE plv8;

调用这个存储过程:

SELECT js_insert_user('Alice', 'alice@example.com');

这个函数会将 Alice 以及她的邮箱地址插入到 users 表中。

7.2.3. 示例 3:使用 JavaScript 查询并返回 JSON 数据

在此示例中,我们使用 JavaScript 查询用户表并返回结果的 JSON 格式数据:

CREATE FUNCTION js_get_users() RETURNS JSON AS $$var result = plv8.execute("SELECT * FROM users");return JSON.stringify(result);
$$ LANGUAGE plv8;

调用这个函数:

SELECT js_get_users();

它会返回所有用户的 JSON 数据,类似于:

[{"id": 1, "name": "Alice", "email": "alice@example.com"},{"id": 2, "name": "Bob", "email": "bob@example.com"}
]

7.3. 使用 JavaScript 进行更多高级操作

通过 PLV8,您可以在 PostgreSQL 中执行更加复杂的 JavaScript 逻辑,甚至是操作 JSON 数据、进行逻辑判断、循环处理等。以下是一个使用 JavaScript 操作 JSON 数据的示例:

7.3.1. 示例 1:处理 JSON 数据

CREATE FUNCTION js_update_user_info(user_id INTEGER, user_info JSONB) RETURNS VOID AS $$var user = plv8.execute("SELECT * FROM users WHERE id = $1", [user_id])[0];if (user) {plv8.execute("UPDATE users SET info = $1 WHERE id = $2", [user_info, user_id]);}
$$ LANGUAGE plv8;

这个函数会根据用户 ID 来更新用户的 info 字段,info 是一个 JSONB 类型字段。

http://www.dtcms.com/a/393023.html

相关文章:

  • pytorch基本运算-PyTorch.Tensor张量数据类型
  • 数据结构与算法 第三章 栈
  • Spring Boot 整合 MyBatis:从入门到企业级实践
  • FHook Java 层全函数 HOOK 框架
  • TDengine 聚合函数 STDDEV_POP 用户手册
  • 【 嵌入式Linux应用开发项目 | Rockit + FFmpeg+ Nginx】基于泰山派的IPC网络摄像头
  • 机器学习中的高准确、低召回
  • Go基础:Go基本数据类型详解
  • 项目管理(一)
  • 【STM8L101 执行函数FLASH_ProgramBlock出现问题】
  • ​​[硬件电路-278]:双向双电源电平转换收发器74AXP2T45DCH功能概述、管脚定义
  • 音视频同步的原理和实现方式
  • BUG调试案例十八:TPS5430输出震荡问题案例
  • Python读取Excel文件里面指定列中的指定范围行
  • C语言入门教程 | 阶段二:控制结构详解(条件语句与 switch 语句)
  • Linux 4.x hook系统调用的问题
  • 了解 Highcharts 响应式功能:构建适配各种屏幕的图表界面
  • 逻辑分析仪解码脚本实例解析——UART
  • 垃圾回收中的STW是什么?
  • redis未授权漏洞扫描器
  • LTE/EPC 架构
  • ANSYS学习
  • 【python】安装jieba库
  • tyza66的博客:专注软件开发、全栈开发与开源项目的技术分享
  • Redis最佳实践——购物车优化详解
  • Netty从0到1系列之Netty内存管理【下】
  • 【使用函数求余弦COS函数的近似值】2022-11-27
  • 前端违规页面车主信息优化说明
  • 成功安装了 Anaconda3。要启动它,您有以下几种主要方式:方式一:通过“开始菜单”启动(最直接的方法)1. 点击您电脑屏幕左下角的 “开始菜单”(Win
  • flex布局实现导航栏横向滚动切换