安装 PostgreSQL
PostgreSQL 是一个功能强大的开源对象关系数据库系统。它经过数十年的积极开发和经过验证的架构,使其在可靠性、数据完整性和正确性方面赢得了良好的声誉。而其天生支持异步操作的特性,在高并发场景中倍受欢迎。同时,它的扩展性极强,只要你有能力,你可以使用任何你熟悉的其它开发语言来编写 PostgreSQL 脚本,比如:Rust、Python 等。PostgreSQL 对象
本章将介绍 PostgreSQL 常见的服务器和数据库对象。示例数据库
本章将介绍示例数据库,以便后续的演示。同时,你将学习到如何将已存在的数据导入到 PostgreSQL 中。基础 SELECT
本章将讨论如何使用简单的 `SELECT` 语句从 PostgreSQL 查询数据。PostgreSQL 的 `SELECT` 语句有诸多独特的特性,让我们一起感受一下。WHERE 子句
本章我们将学习 `WHERE` 子句,它不但能用于 `SELECT` 过滤查询结果,还能用于其它语句。LIMIT、OFFSET 和 FETCH 子句
本章我们学习 `LIMIT` 、`OFFSET` 和 `FETCH` 子句。和 `LIMIT` 一样,`FETCH` 也是为了限定返回的行数,但你不知道的是,`FETCH` 才是 SQL 标准,而 `LIMIT` 不是。LIKE 和 ILIKE
前面章节提过,在 PostgreSQL 中,`LIKE` 是区分大小写的。如果要像其它数据库那样不区分大小写,需要使用 `ILIKE`。PostgreSQL 还为它们提供了等价的运算符。连接
本章将讨论 PostgreSQL 的各种连接:内连接、左外连接、右外连接、交叉连接、自然连接、自连接和完全外连接。值得一提的是,哪怕到了 MySQL 8,MySQL 依然不支持完全外连接。分组
本章将讨论 PostgreSQL 的 `GROUP BY` 子句:将`SELECT` 语句返回的结果进行分组;对于每个分组,可以使用聚合函数。同时讨论与之相关的 `HAVING`、`CUBE`、`ROLLUP` 等。联合查询(并集)、交集查询及差集查询
本章将讨论 `UNION`:联合(并集)查询、`INTERSECT `:交集查询和`EXCEPT`:差集查询。子查询
本章我们将讨论如何使用 PostgreSQL 子查询来构建复杂的查询。同时会学习 `IN`、`EXISTS`、`ANY`、`SOME`、`ALL` 等操作。插入数据
本章将讨论如何使用 `INSERT` 向 PostgreSQL 中插入新行。同时介绍如何通过`REGURNING`子句返回最新插入行的ID以及批量插入数据的方法。修改数据
本章将讨论如何使用 `UPDATE` 语句修改 PostgreSQL 数据,以及配合 `RETURNING` 子句在修改数据的同时,返回修改后的内容。最后,还将介绍 `UPDATE JOIN`:根据另一张表中的数据进行修改。删除数据
本章将讨论如何使用 `DELETE` 语句删除 PostgreSQL 数据,以及配合 `RETURNING` 子句在删除数据的同时,返回已删除的内容。最后,还将介绍 `DELETE JOIN`:根据另一张表中的数据进行删除。插入或更新数据
在关系型数据库中,术语`upsert`称为合并:当插入数据时,如果数据已存在则进行更新,否则插入新行。PostgreSQL 使用 `INSERT ON CONFLICT` 实现这一功能。基础数据类型
本章我们讨论 PostgreSQL 的基本数据类型:布尔型、字符型、数值型和日期时间型。这些类型与其它数据库有着很多不同,让我们一起深入细节进行了解。表
本章将讨论和表相关的知识,包括:创建表、修改表、清空(截断)表和删除表。约束
本章将讨论 PostgreSQL 的约束,包括:主键约束、外键约束、唯一约束、非空约束、 CHECK 约束。条件表达式和运算符
本章将讨论 PostgreSQL 条件表达式和运算符,包括:使用 `CASE` 构造条件查询、使用 `COALESCE` 过滤非空参数、使用 `NULLIF` 处理 `NULL` 值以及使用 `CAST` 进行数据类型转换。视图
本章我们将讨论视图:创建、修改、删除视图。为高级篇的物化视图、递归视图等打好基础。性能分析
PostgreSQL 提供了 `EXPLAIN` 语句,它可以用来分析 SQL 的执行情况。本章将对其进行讨论。索引
PostgreSQL 索引是增强数据库查询性能的有效工具。然而,索引增加了数据库系统的写入和存储开销。因此,正确使用它们非常重要。本章我们将讨论如何使用索引。角色与权限
本章介绍角色与权限。PostgreSQL 使用角色来表示用户账号,而不是其它数据库那样使用用户概念。客户端鉴权
本章将讨论 PostgreSQL 客户端鉴权。回到之前安装 PostgreSQL 时的一个问题,为什么在本地登录 PostgreSQL 时,不需要输入密码?本章将回答这个问题。事务
本章将讨论如何使用 `BEGIN` 、 `COMMIT` 和 `ROLLBACK` 语句处理 PostgreSQL 事务。备份与还原
本章将介绍备份和还原 PostgreSQL 数据库。常用函数
本章对 PostgreSQL 常用函数进行汇总,包括:聚合函数、日期时间函数、字符串函数和数学函数。对于窗口函数,我们将在高级篇进行介绍。
安装 PostgreSQL
- 480
- 2023-07-28 06:34:26
安装
docker 安装无疑是最简单、最方便的安装方式:
docker run --name axum_rs_postgres -e POSTGRES_PASSWORD=axum_rs -p 5432:5432 -d postgres
--name
:取个名字吧,别到时候自己都不知道这是什么-e POSTGRES_PASSWORD=axum_rs
:设置环境变量POSTGRES_PASSWORD
,它将是超级管理员的密码(PostgreSQL的超级管理员的用户名是postgres
)-p 5432:5432
:端口映射。PostgreSQL 默认端口是5432
对于本地开发来说,上述 docker 命令已经足矣。但是,如你所知,站长是个负责任的站长,往往会告诉你如何尽可能的“压榨”各工具,让其能尽可能地以最优的状态来服务:
docker run \
--name axum_rs_postgres \
-e POSTGRES_PASSWORD=axum_rs \
-e POSTGRES_USER=axum_rs \
-e POSTGRES_DB=axum_rs \
-e TZ=PRC \
--restart=always \
-e PGDATA=/var/lib/postgresql/data/pgdata \
-v /var/docker/axum_rs_postgres:/var/lib/postgresql/data \
-p 127.0.0.1:5432:5432 \
-d postgres:alpine
多了几个选项,我们来看一下:
连接
直接使用 docker
你可以使用 docker 来连接:
docker exec -it axum_rs_postgres psql -U axum_rs
docker exec
:docker 提供的命令,用于执行容器内部的命令-it
:开启交互式终端axum_rs_postgres
:容器实例的名字psql
:PostgreSQL 的命令行工具-U axum_rs
:指定 执行psql
的用户名
- 如未指定
-U axum_rs
,将使用默认用户名。PostgreSQL 的用户有两种- 一是和 Linux 当前用户名相同的用户,docker 中默认用户名是
root
- PostgreSQL 的超级管理员的用户名是
postgres
,有些 Linux 发行版会将 Linux 的root
用户和 PostgreSQL 的postgres
进行映射;有些则不会 - 另一种是通过 SQL 语句创建的用户,我们将在后续章节进行讲解。本例中的
axum_rs
正是通过 SQL 语句创建——我们在docker run
时,通过POSTGRES_USER
指定的,这是自动创建的,不需要手动创建
- 一是和 Linux 当前用户名相同的用户,docker 中默认用户名是
- 我们相当于在本地运行
psql
,所以大部分情况下,不需要输入密码- 这不是 PostgreSQL 的默认特性,而是 docker 镜像帮我们做的
- 有关用户和角色,我们将在后续章节介绍
- 一是和 Linux 当前用户名相同的用户,docker 中默认用户名是
root
- PostgreSQL 的超级管理员的用户名是
postgres
,有些 Linux 发行版会将 Linux 的root
用户和 PostgreSQL 的postgres
进行映射;有些则不会 - 另一种是通过 SQL 语句创建的用户,我们将在后续章节进行讲解。本例中的
axum_rs
正是通过 SQL 语句创建——我们在docker run
时,通过POSTGRES_USER
指定的,这是自动创建的,不需要手动创建
- 这不是 PostgreSQL 的默认特性,而是 docker 镜像帮我们做的
- 有关用户和角色,我们将在后续章节介绍
运行 \d
可以查看当前数据库的对象:
axum_rs=# \d
Did not find any relations.
如果你看到类似上面的输出,说明你的 docker PostgreSQL 已经成功运行。此时,你可以输入 \q
退出。
如果你是使用简单的
docker run --name axum_rs_postgres -e POSTGRES_PASSWORD=axum_rs -p 5432:5432 -d postgres
来创建容器实例,那么,你应该使用如下命令进行连接:docker exec -it axum_rs_postgres psql -U postgres
嗯,就这么简单。
你甚至可以:
docker exec -it axum_rs_postgres psql
正如上文所说,如果没有指定
-U 用户名
,psql 将使用默认的用户,即超级管理员postgres
。这取决于 docker 镜像是否将postgres
和 Linux 的root
作映射。所以,始终带上-U 用户名
是最佳实践。
如果你是使用简单的 docker run --name axum_rs_postgres -e POSTGRES_PASSWORD=axum_rs -p 5432:5432 -d postgres
来创建容器实例,那么,你应该使用如下命令进行连接:
docker exec -it axum_rs_postgres psql -U postgres
嗯,就这么简单。
docker exec -it axum_rs_postgres psql
正如上文所说,如果没有指定 -U 用户名
,psql 将使用默认的用户,即超级管理员 postgres
。这取决于 docker 镜像是否将 postgres
和 Linux 的 root
作映射。所以,始终带上 -U 用户名
是最佳实践。
使用 GUI 工具连接
当然你完全不必用这么原始的方式连接 PostgreSQL,官方推荐的PgAdmin是一个由 Python 和 Flask 开发的、开源的、Web 形式的 GUI工具(它也有 docker 版本,你可以自己去试试)。
这边推荐DBeaver Community,它是一个跨平台(基于Java)的、支持多种数据库的 GUI 工具。
其它安装方式
在线免费实例
ElephantSQL 提供了免费的 PostgreSQL 实例,对于普通开发以及学习来说足够了,重点是,它提供了香港节点,对于国内用户来说,连接香港节点可能会比较快。
你可以使用 DBeaver 来连接 ElephantSQL 的免费实例
你可以使用 DBeaver 来连接 ElephantSQL 的免费实例