# postgresql学习笔记
**Repository Path**: HaiXiuDeDXianSheng/postgresql-learning-notes
## Basic Information
- **Project Name**: postgresql学习笔记
- **Description**: 用于记录postgresql学习笔记
- **Primary Language**: SQL
- **License**: GPL-3.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 3
- **Forks**: 0
- **Created**: 2023-11-28
- **Last Updated**: 2024-08-19
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
- [1. postgresql 安装](#1-postgresql-安装)
- [2. postgresql 的基本使用](#2-postgresql-的基本使用)
- [2.1. 数据库操作](#21-数据库操作)
- [2.1.1. 命令行登录数据库](#211-命令行登录数据库)
- [2.1.2. 创建数据库](#212-创建数据库)
- [2.1.3. 查看有哪些数据库](#213-查看有哪些数据库)
- [2.1.4. 切换数据库](#214-切换数据库)
- [2.1.5. 删除数据库](#215-删除数据库)
- [2.2. 数据表操作](#22-数据表操作)
- [2.2.1. 数据类型](#221-数据类型)
- [2.2.1.1. 数值类型](#2211-数值类型)
- [2.2.1.2. 字符类型](#2212-字符类型)
- [2.2.1.3. 日期/时间类型](#2213-日期时间类型)
- [2.2.1.4. 其他数据类型](#2214-其他数据类型)
- [2.2.1.5. 自定义数据类型](#2215-自定义数据类型)
- [2.2.2. 创建表格](#222-创建表格)
- [2.2.3. DML 操作](#223-dml-操作)
- [2.2.3.1. INSERT 数据](#2231-insert-数据)
- [2.2.3.2. UPDATE 数据](#2232-update-数据)
- [2.2.3.3. DELETE 数据](#2233-delete-数据)
- [2.3. SCHEMA (模式)](#23-schema-模式)
- [2.3.1. 创建 schema](#231-创建-schema)
- [2.3.2. 查看 schema](#232-查看-schema)
- [2.3.3. 删除 schema](#233-删除-schema)
- [2.4. 视图 View](#24-视图-view)
- [2.4.1. 视图 VS 物化视图](#241-视图-vs-物化视图)
- [2.4.2. 创建视图](#242-创建视图)
- [2.4.3. 创建物化视图](#243-创建物化视图)
- [2.5. 函数](#25-函数)
- [2.5.1. 自定义函数](#251-自定义函数)
- [2.5.1.1. 用 sql 定义函数](#2511-用-sql-定义函数)
- [2.5.1.2. 用 pgsql 定义函数(类似于mysql存储过程)](#2512-用-pgsql-定义函数类似于mysql存储过程)
- [2.6. 存储过程](#26-存储过程)
- [2.7. 触发器](#27-触发器)
- [2.8. CURSORS 游标](#28-cursors-游标)
- [2.9. 备份 postresql 数据库](#29-备份-postresql-数据库)
- [2.9.1. 单数据库备份](#291-单数据库备份)
- [2.9.2. 备份所有数据库](#292-备份所有数据库)
- [2.9.3. 单恢复数据库](#293-单恢复数据库)
- [2.10. 用户操作](#210-用户操作)
- [2.10.1. 创建用户](#2101-创建用户)
- [2.10.2. 修改密码](#2102-修改密码)
- [2.10.3. 数据库授权](#2103-数据库授权)
- [2.10.3.1. 执行实例](#21031-执行实例)
- [2.10.4. 删除用户](#2104-删除用户)
- [2.11. 角色管理](#211-角色管理)
- [2.11.1. 角色属性](#2111-角色属性)
- [2.11.2. pgsql 控制台常用命令](#2112-pgsql-控制台常用命令)
- [3. 常用操作](#3-常用操作)
- [3.1. 使用正则匹配](#31-使用正则匹配)
# 1. postgresql 安装
- 参考资料
- http://www.manongjc.com/detail/56-pcaisabtofkskqf.html
- https://www.bilibili.com/video/BV1p44y1X78F
- 步骤
- 列出可用的 postgresql 模块
>```bash
>dnf module list postgresql
>```
- 安装可用的 pgsql 版本
>```bash
>sudo dnf install @postgresql:16
>```
- 安装 postgresql-contrib
,给 pgsql 数据库提供一些额外特性
>```bash
>sudo dnf install postgresql-contrib
>```
- 使用命令初始化 pgsql 数据库
>```
>[hadoop@node01 ~]$ sudo postgresql-setup initdb
>WARNING: using obsoleted argument syntax, try --help
>WARNING: arguments transformed to: postgresql-setup --initdb --unit postgresql # 提示要使用这个命令来进行初始化,上面的命令过时了
> * Initializing database in '/var/lib/pgsql/data'
> * Initialized, logs are in /var/lib/pgsql/initdb_postgresql.log
>```
- 启动 pgsql 服务,并且启用开机启动 pgsql 服务
>````bash
>[hadoop@node01 ~]$ sudo systemctl enable --now postgresql
>Created symlink /etc/systemd/system/multi-user.target.wants/postgresql.service → /usr/lib/systemd/system/postgresql.service.
>```
- pgsql 安装成功后,会默认创建一个名为 postgresql 的 linux 用户,初始化数据库后,会有名为 postgresql 的数据库,来存储数据库的基本信息,相当于 Mysql 中默认的名为 mysql 的数据库
- pgsql 数据库中会初始化一名 super 用户 postgres, 密码是 psql
- 使用 psql 工具连接 PostgreSQL 数据库服务器并且打印它的版本号,以验证安装过程
>```bash
>[hadoop@node01 ~]$ sudo -u postgres psql -c "SELECT version();"
>[sudo] hadoop 的密码:
> version
>-------------------------------------------------------------------------------------------------------------
> PostgreSQL 16.0 on x86_64-redhat-linux-gnu, compiled by gcc (GCC) 8.5.0 20210514 (Red Hat 8.5.0-21), 64-bit
>(1 行记录)
>```
- 认情况下,PostgreSQL 服务器仅仅监听本地网络接口:127.0.0.1, 为了允许远程访问你的 PostgreSQL 服务器,打开配置文件
>```bash
>sudo nano /var/lib/pgsql/data/postgresql.conf
>```
- 往下滑动到CONNECTIONS AND AUTHENTICATION部分,并且添加或者编辑下面的行:
>```conf
>#------------------------------------------------------------------------------
># CONNECTIONS AND AUTHENTICATION
>#------------------------------------------------------------------------------
>
># - Connection Settings -
>
>listen_addresses = '*' # what IP address(es) to listen on;
>```
- 保存文件,重启 pgsql 服务
>```bash
>sudo systemctl restart postgresql
>```
- 使用ss工具来验证这个修改
>```
>[hadoop@node01 ~]$ ss -nlt | grep 5432
>LISTEN 0 128 0.0.0.0:5432 0.0.0.0:*
>LISTEN 0 128 [::]:5432 [::]:*
>```
- 修改 pg_hba.conf 文件
>```bash
>[hadoop@node01 ~]$ sudo vim /var/lib/pgsql/data/pg_hba.conf
>```
>```conf
># IPv4 local connections:
>host all all 0.0.0.0/0 md5
>host all all 127.0.0.1/32 ident
>```
- 为了远程访问安全,需要开启访问端口和启用防火墙
>```bash
>[hadoop@node01 ~]$ sudo systemctl start firewalld.service
>[hadoop@node01 ~]$ sudo systemctl enable firewalld.service
>Created symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service → /usr/lib/systemd/system/firewalld.service.
>Created symlink /etc/systemd/system/multi-user.target.wants/firewalld.service → /usr/lib/systemd/system/firewalld.service.
>[hadoop@node01 ~]$ sudo systemctl status firewalld
>● firewalld.service - firewalld - dynamic firewall daemon
> Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)
> Active: active (running) since Tue 2023-11-28 10:29:22 EST; 50s ago
> Docs: man:firewalld(1)
> Main PID: 25014 (firewalld)
> Tasks: 2 (limit: 49275)
> Memory: 30.5M
> CGroup: /system.slice/firewalld.service
> └─25014 /usr/libexec/platform-python -s /usr/sbin/firewalld --nofork --nopid
>
>11月 28 10:29:22 node01.zhd.org systemd[1]: Starting firewalld - dynamic firewall daemon...
>11月 28 10:29:22 node01.zhd.org systemd[1]: Started firewalld - dynamic firewall daemon.
>11月 28 10:29:23 node01.zhd.org firewalld[25014]: WARNING: AllowZoneDrifting is enabled. This is considered an insecure configuration option. It will be removed in a>
>...skipping...
>● firewalld.service - firewalld - dynamic firewall daemon
> Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)
> Active: active (running) since Tue 2023-11-28 10:29:22 EST; 50s ago
> Docs: man:firewalld(1)
> Main PID: 25014 (firewalld)
> Tasks: 2 (limit: 49275)
> Memory: 30.5M
> CGroup: /system.slice/firewalld.service
> └─25014 /usr/libexec/platform-python -s /usr/sbin/firewalld --nofork --nopid
>
>11月 28 10:29:22 node01.zhd.org systemd[1]: Starting firewalld - dynamic firewall daemon...
>11月 28 10:29:22 node01.zhd.org systemd[1]: Started firewalld - dynamic firewall daemon.
>11月 28 10:29:23 node01.zhd.org firewalld[25014]: WARNING: AllowZoneDrifting is enabled. This is considered an insecure configuration option. It will be removed in a>
>~
>```
- 防火墙授权开放端口
>```bash
>[hadoop@node01 ~]$ sudo firewall-cmd --permanent --add-port=5432/tcp # 防火墙开放相关端口
>success
>[hadoop@node01 ~]$ sudo firewall-cmd --reload # 重载防护火墙
>success
>```
- 在外部使用 navicat 进行远程连接
\l
, 查看数据库中的所有 database
- 在 pgsql 中无法使用 show databases;
>```bash
>postgres=# \l
> 数据库列表
> 名称 | 拥有者 | 字元编码 | Locale Provider | 校对规则 | Ctype | ICU Locale | ICU Rules | 存取权限
>-----------+----------+----------+-----------------+-------------+-------------+------------+-----------+-----------------------
> postgres | postgres | UTF8 | libc | zh_CN.UTF-8 | zh_CN.UTF-8 | | |
> template0 | postgres | UTF8 | libc | zh_CN.UTF-8 | zh_CN.UTF-8 | | | =c/postgres +
> | | | | | | | | postgres=CTc/postgres
> template1 | postgres | UTF8 | libc | zh_CN.UTF-8 | zh_CN.UTF-8 | | | =c/postgres +
> | | | | | | | | postgres=CTc/postgres
> zhd_db | postgres | UTF8 | libc | zh_CN.UTF-8 | zh_CN.UTF-8 | | |
>(4 行记录)
>```
### 2.1.4. 切换数据库
- 使用\c target_database
切换数据库
- mysql 中使用use target_database
切换数据库
>```bash
>postgres=# \c zhd_db;
>您现在已经连接到数据库 "zhd_db",用户 "postgres".
>zhd_db=#
>```
### 2.1.5. 删除数据库
>```bash
>postgres=# drop database zhd_db;
>DROP DATABASE
>```
## 2.2. 数据表操作
### 2.2.1. 数据类型
- 参考资料: https://www.runoob.com/postgresql/postgresql-data-type.html
- pgsql 常用的三类数据类型
- 数值数据类型
- 字符串数据类型
- 日期/时间数据类型
#### 2.2.1.1. 数值类型
|名字 |存储长度 | 描述 |范围|
|:-:|:-:|:-:|:-:|
|smallint | 2 字节 | 小范围整数 | -32768 到 +32767|
|integer | 4 字节 | 常用的整数 | -2147483648 到 +2147483647|
|bigint | 8 字节 | 大范围整数 |-9223372036854775808 到 +9223372036854775807|
|decimal | 可变长 | 用户指定的精度,精确 | 小数点前 131072 位;小数点后 16383 位|
|numeric | 可变长 | 用户指定的精度,精确 | 小数点前 131072 位;小数点后 16383 位|
|real | 4 字节 | 可变精度,不精确 | 6 位十进制数字精度|
|double precision | 8 字节 | 可变精度,不精确 | 15 位十进制数字精度|
- postgresql 中使用序列来表示自增长,mysql 中用 auto increment
|名字 |存储长度 | 描述 |范围|
|:-:|:-:|:-:|:-:|
|smallserial | 2 字节 | 自增的小范围整数 | 1 到 32767|
|serial | 4 字节 | 自增整数 |1 到 2147483647|
|bigserial | 8 字节 | 自增的大范围整数 | 1 到 9223372036854775807|
#### 2.2.1.2. 字符类型
|序号|类型|描述|
|:-:|:-:|:-:|
|1|character varying(n),varchar(n)|变长,有长度限制|
|2|character(n),char(n)|定长,不足补空白|
|3|text|变长,无长度限制|
#### 2.2.1.3. 日期/时间类型
|名字 |存储空间 |描述 |最低值 |最高值 | 分辨率|
|:-:|:-:|:-:|:-:|:-:|:-:|
|timestamp [ (p) ] [ without time zone ] |8 字节 |日期和时间(无时区) |4713 BC |294276 AD | 1 毫秒 / 14 位|
|timestamp [ (p) ] with time zone |8 字节 |日期和时间,有时区 |4713 BC |294276 AD | 1 毫秒 / 14 位|
|date |4 字节 |只用于日期 |4713 BC |5874897 AD | 1 天|
|time [ (p) ] [ without time zone ] |8 字节 |只用于一日内时间 |00:00:00 |24:00:00 | 1 毫秒 / 14 位|
|time [ (p) ] with time zone |12 字节 |只用于一日内时间,带时区 |00:00:00+1459 |24:00:00-1459 | 1 毫秒 / 14 位|
|interval [ fields ] [ (p) ] |12 字节 |时间间隔 |-178000000 年 |178000000 年 | 1 毫秒 / 14 位|
#### 2.2.1.4. 其他数据类型
- 还支持 boolean、货币、枚举、集合、json、数组等数据类型
#### 2.2.1.5. 自定义数据类型
- 在 [创建用户/角色](#253-数据库授权) 后还要进行如下授权
>```bash
>[hadoop@node01 ~]$ psql -U postgres -d postgres
>用户 postgres 的口令:
>psql (16.0)
>输入 "help" 来获取帮助信息.
>
>postgres=# \du
> 角色列表
> 角色名称 | 属性
>----------+--------------------------------------------
> postgres | 超级用户, 建立角色, 建立 DB, 复制, 绕过RLS
> zhd |
>
>postgres=# \c zhd_test_db;
>您现在已经连接到数据库 "zhd_test_db",用户 "postgres".
>
>zhd_test_db=# grant create on schema public to zhd;
>GRANT
>zhd_test_db=# \du
>```
- 执行如下创建自定义数据类型语句
>```sql
>create type sex_type as enum('M','F')
>```
CREATE USER
是 CREATE ROLE
的别名,这两个几乎是相同的,唯一的区别是CREATE USER
命令创建的用户默认带有一个LOGIN
属性,而CREATE ROLE
命令创建的用户默认不带LOGIN
属性
### 2.11.1. 角色属性
|属性|说明|
|:-:|:-:|
|login|只有具有 LOGIN 属性的角色可以用做数据库连接的初始角色名|
|superuser|数据库超级用户|
|createdb|创建数据库权限|
|createrole|允许其创建或删除其他普通的用户角色(超级用户除外)|
|replication|做流复制的时候用到的一个用户属性,一般单独设定。|
|password|在登录时要求指定密码时才会起作用,比如md5或者password模式,跟客户端的连接认证方式有关|
|inherit|用户组对组员的一个继承标志,成员可以继承用户组的权限特性|
- 指定一个用户有什么角色属性,实际上就是相当于赋予用户什么权限(角色属性)
- 权限是加在角色中的
### 2.11.2. pgsql 控制台常用命令
>```
>\q 退出
>\h 查看命令解释。例如 \h select
>\? 查看psql 命令列表
>\c [database_name] 切换其他数据库
>\d 列出当前数据库所有表格
>\d [table_name] 列出某一张表的结构
>\du 列出所有用户
>\password 设置密码
>```
# 3. 常用操作
- 创建索引
>```SQL
>CREATE INDEX transation_id ON transaction_table(name);
>```
- 清空表数据, truncate table 仅清空数据不删除表结构,drop table 才会删除表结构
>```sql
>truncate table table_name
>```
- postgresql 的几种 join
- cross join: 会产生笛卡尔积
- inner join:
- left outer join: 等同于 left join
- right outer join: 等同于 right join
- similar to, 相当于 mysql 的 like (psql 中也可以使用 like)
>```sql
> SELECT first_name, last_name
> FROM customer
> WHERE first_name SIMILAR TO 'M%';
>```
## 3.1. 使用正则匹配
- 表里面数据长这样
>```
>3 wangwu
>4 qianliu
>1 zhangsan_01
>5 zhangsan01
>6 zhangsan02
>7 zang
>8 zhong
>```
- 正则匹配带有数字结尾的名字
>```sql
>select * from zhd_test_01 where name ~ '([a-z]|[A-Z])*[0-9]$'; -- like、similar to 都可以
>```
- 得到结果
>```
>1 zhangsan_01
>5 zhangsan01
>6 zhangsan02
>```