PostgreSQL的使用

基础命令

initdb 命令

#### 介绍

initdb 用于初始化一个 PostgreSQL 数据库簇。

语法

initdb [选项]... [DATADIR]

选项说明

选项 说明
-A, --auth=METHOD 本地连接的默认认证方法
--auth-host=METHOD 本地 TCP/IP 连接的默认认证方法
--auth-local=METHOD 本地 socket 连接的默认认证方法
-D, --pgdata=DATADIR 当前数据库簇的位置
-E, --encoding=ENCODING 为新数据库设置默认编码
-g, --allow-group-access 允许组对数据目录进行读/执行
--icu-locale=LOCALE 设置 ICU 语言环境 ID
-k, --data-checksums 使用数据页产生校验和
--locale=LOCALE 为新数据库设置默认语言环境
--lc-collate, --lc-ctype, --lc-messages=LOCALE 分别为各目录设定默认语言环境
--lc-monetary, --lc-numeric, --lc-time=LOCALE 分别为各目录设定默认语言环境
--no-locale 等同于 --locale=C
--locale-provider={libc\|icu} 设置默认语言环境提供者
--pwfile=FILE 从文件读取超级用户口令
-T, --text-search-config=CFG 默认的文本搜索配置
-U, --username=NAME 数据库超级用户名
-W, --pwprompt 提示输入超级用户口令
-X, --waldir=WALDIR 预写日志目录的位置
--wal-segsize=SIZE WAL 段的大小(兆字节)

非普通使用选项

选项 说明
-d, --debug 产生大量调试信息
--discard-caches 设置 debug_discard_caches=1
-L DIRECTORY 输入文件的位置
-n, --no-clean 出错后不清理
-N, --no-sync 不用等待变化安全写入磁盘
--no-instructions 不打印后续步骤的说明
-s, --show 显示内部设置
-S, --sync-only 仅同步数据库文件到磁盘后退出

其他选项

选项 说明
-V, --version 输出版本信息后退出
-?, --help 显示帮助信息后退出

注意: 如果没有指定数据目录,将使用环境变量 PGDATA

示例

# 初始化数据库
initdb -D /path/to/data

pg_ctl 命令

介绍

pg_ctl 是用于初始化、启动、停止或控制 PostgreSQL 服务器的工具。

语法

pg_ctl init[db]   [-D 数据目录] [-s] [-o 选项]
pg_ctl start      [-D 数据目录] [-l 文件名] [-W] [-t 秒数] [-s] [-o 选项] [-p 路径] [-c]
pg_ctl stop       [-D 数据目录] [-m SHUTDOWN-MODE] [-W] [-t 秒数] [-s]
pg_ctl restart    [-D 数据目录] [-m SHUTDOWN-MODE] [-W] [-t 秒数] [-s] [-o 选项] [-c]
pg_ctl reload     [-D 数据目录] [-s]
pg_ctl status     [-D 数据目录]
pg_ctl promote    [-D 数据目录] [-W] [-t 秒数] [-s]
pg_ctl logrotate  [-D 数据目录] [-s]
pg_ctl kill       信号名称 进程号
pg_ctl register   [-D 数据目录] [-N 服务名称] [-U 用户名] [-P 口令] [-S 启动类型] [-e 源] [-W] [-t 秒数] [-s] [-o 选项]
pg_ctl unregister [-N 服务名称]

普通选项

选项 说明
-D, --pgdata=数据目录 数据库存储区域的位置
-e SOURCE 作为服务运行时记录事件的来源
-s, --silent 只打印错误信息
-t, --timeout=SECS 使用 -w 选项时需要等待的秒数
-V, --version 输出版本信息后退出
-w, --wait 等待直到操作完成(默认)
-W, --no-wait 不用等待操作完成
-?, --help 显示帮助信息后退出

注意: 如果省略了 -D 选项,将使用 PGDATA 环境变量。

启动或重启的选项

选项 说明
-c, --core-files 此平台不可用
-l, --log=FILENAME 写入(或追加)服务器日志到文件
-o, --options=OPTIONS 传递给 postgres 或 initdb 的命令行选项
-p PATH-TO-POSTMASTER 正常情况下不必要

停止或重启的选项

选项 说明
-m, --mode=MODE 关闭模式,可以是 smartfastimmediate

关闭模式说明

模式 说明
smart 所有客户端断开连接后退出
fast 直接退出,正确关闭(默认)
immediate 不完全关闭退出,重启后恢复

允许关闭的信号名称

ABRT HUP INT KILL QUIT TERM USR1 USR2

注册或注销的选项

选项 说明
-N 服务名称 注册到 PostgreSQL 服务器的服务名称
-P 口令 注册到 PostgreSQL 服务器帐户的口令
-U 用户名 注册到 PostgreSQL 服务器帐户的用户名
-S START-TYPE 注册到 PostgreSQL 服务器的服务启动类型

启动类型

类型 说明
auto 系统启动时自动启动服务(默认)
demand 按需启动服务

示例

# 启动 PostgreSQL
pg_ctl start -D /path/to/data

# 注册为系统服务
pg_ctl register -N "PostgreSQL" -D "/path/to/data"

psql 命令

介绍

psql 是 PostgreSQL 的交互式客户端工具。

语法

psql [选项]... [数据库名称 [用户名称]]

通用选项

选项 说明
-c, --command=命令 执行单一命令(SQL 或内部指令)后退出
-d, --dbname=DBNAME 指定要连接的数据库
-f, --file=文件名 从文件中执行命令后退出
-l, --list 列出所有可用数据库后退出
-v, --set=, --variable=NAME=VALUE 设置 psql 变量
-V, --version 输出版本信息后退出
-X, --no-psqlrc 不读取启动文档 ~/.psqlrc
-1, --single-transaction 作为单一事务执行命令文件
-?, --help[=options] 显示帮助信息后退出
--help=commands 列出反斜线命令后退出
--help=variables 列出特殊变量后退出

输入和输出选项

选项 说明
-a, --echo-all 显示所有来自脚本的输入
-b, --echo-errors 回显失败的命令
-e, --echo-queries 显示发送给服务器的命令
-E, --echo-hidden 显示内部命令产生的查询
-L, --log-file=文件名 将会话日志写入文件
-n, --no-readline 禁用增强命令行编辑功能(readline)
-o, --output=FILENAME 将查询结果写入文件(或 \| 管道)
-q, --quiet 以沉默模式运行
-s, --single-step 单步模式(确认每个查询)
-S, --single-line 单行模式(一行就是一条 SQL 命令)

输出格式选项

选项 说明
-A, --no-align 使用非对齐表格输出模式
--csv CSV(逗号分隔值)表输出模式
-F, --field-separator=STRING 为字段设置分隔符(默认:\|
-H, --html HTML 表格输出模式
-P, --pset=变量[=参数] 设置打印选项(参见 \pset 命令)
-R, --record-separator=STRING 设置记录分隔符(默认:换行)
-t, --tuples-only 只打印记录
-T, --table-attr=文本 设定 HTML 表格标记属性
-x, --expanded 打开扩展表格输出
-z, --field-separator-zero 设置字段分隔符为字节 0
-0, --record-separator-zero 设置记录分隔符为字节 0

连接选项

选项 说明
-h, --host=主机名 数据库服务器主机或 socket 目录(默认:本地接口)
-p, --port=端口 数据库服务器的端口(默认:5432
-U, --username=用户名 指定数据库用户名
-w, --no-password 永远不提示输入口令
-W, --password 强制提示口令

示例

# 连接 PostgreSQL,默认数据库和用户为 postgres
psql -h host -p port -U username -d dbname

# 连接 PostgreSQL 并执行 SQL 文件
psql -h host -p port -U username -d dbname -f xxx.sql

数据库操作

查询所有数据库

\\l

创建数据库

语法

CREATE DATABASE 名称
    [ WITH ] [ OWNER [=] 用户名 ]
           [ TEMPLATE [=] 模版 ]
           [ ENCODING [=] 字符集编码 ]
           [ STRATEGY [=] strategy ]
           [ LOCALE [=] 本地化语言 ]
           [ LC_COLLATE [=] 排序规则 ]
           [ LC_CTYPE [=] 字符分类 ]
           [ ICU_LOCALE [=] icu_locale ]
           [ LOCALE_PROVIDER [=] locale_provider ]
           [ COLLATION_VERSION = collation_version ]
           [ TABLESPACE [=] 表空间的名称 ]
           [ ALLOW_CONNECTIONS [=] allowconn ]
           [ CONNECTION LIMIT [=] 连接限制 ]
           [ IS_TEMPLATE [=] istemplate ]
           [ OID [=] oid ]

示例

-- 本地创建数据库
CREATE DATABASE dbname;

-- 远程创建数据库
createdb -h host -p port -U username dbname;

删除数据库

语法

DROP DATABASE [ IF EXISTS ] 名称 [ [ WITH ] ( 选项 [, ...] ) ]

选项

选项 说明
FORCE 强制删除

示例

DROP DATABASE IF EXISTS dbname;

修改数据库

语法

ALTER DATABASE 名称 [ [ WITH ] 选项 [ ... ] ]

ALTER DATABASE 名称 RENAME TO 新的名称

ALTER DATABASE 名称 OWNER TO { 新的属主 | CURRENT_ROLE | CURRENT_USER | SESSION_USER }

ALTER DATABASE 名称 SET TABLESPACE 新的表空间

ALTER DATABASE 名称 REFRESH COLLATION VERSION

ALTER DATABASE 名称 SET 配置参数 { TO | = } {| DEFAULT }
ALTER DATABASE 名称 SET 配置参数 FROM CURRENT
ALTER DATABASE 名称 RESET 配置参数
ALTER DATABASE 名称 RESET ALL

选项

选项 说明
ALLOW_CONNECTIONS allowconn 是否允许连接
CONNECTION LIMIT 连接限制 连接数限制
IS_TEMPLATE istemplate 是否为模板数据库

示例

ALTER DATABASE dbname RENAME TO newdbname;

切换数据库

\\c dbname

表操作

创建表

语法

CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } | UNLOGGED ] TABLE [ IF NOT EXISTS ] 表名 ( [
  { 列名称 数据类型 [ COMPRESSION 压缩方法 ] [ COLLATE 校对规则 ] [ 列约束 [ ... ] ]
    | 表约束
    | LIKE 源表 [ like选项 ... ] }
    [, ... ]
] )
[ INHERITS ( 父表 [, ... ] ) ]
[ PARTITION BY { RANGE | LIST | HASH } ( { 列名称 | ( 表达式 ) } [ COLLATE 校对规则 ] [ 操作符类型的名称 ] [, ... ] ) ]
[ USING 方法 ]
[ WITH ( 存储参数 [=] [, ... ] ) | WITHOUT OIDS ]
[ ON COMMIT { PRESERVE ROWS | DELETE ROWS | DROP } ]
[ TABLESPACE 表空间的名称 ]

列约束

[ CONSTRAINT 约束名称 ]
{ NOT NULL |
  NULL |
  CHECK ( 表达式 ) [ NO INHERIT ] |
  DEFAULT 默认表达式 |
  GENERATED ALWAYS AS ( 生成表达式 ) STORED |
  GENERATED { ALWAYS | BY DEFAULT } AS IDENTITY [ ( 序列选项 ) ] |
  UNIQUE [ NULLS [ NOT ] DISTINCT ] 索引参数 |
  PRIMARY KEY 索引参数 |
  REFERENCES 所引用的表 [ ( 所引用的列 ) ] [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ]
    [ ON DELETE 参考行动 ] [ ON UPDATE 参考行动 ] }
[ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]

表约束

[ CONSTRAINT 约束名称 ]
{ CHECK ( 表达式 ) [ NO INHERIT ] |
  UNIQUE [ NULLS [ NOT ] DISTINCT ] ( 列名称 [, ... ] ) 索引参数 |
  PRIMARY KEY ( 列名称 [, ... ] ) 索引参数 |
  EXCLUDE [ USING 访问索引的方法 ] ( 排除项 WITH 运算符 [, ... ] ) 索引参数 [ WHERE ( 谓词 ) ] |
  FOREIGN KEY ( 列名称 [, ... ] ) REFERENCES 所引用的表 [ ( 所引用的列 [, ... ] ) ]
    [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ] [ ON DELETE 参考行动 ] [ ON UPDATE 参考行动 ] }
[ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]

示例

CREATE TABLE t_name (
    字段名1 数据类型,
    字段名2 数据类型,
    PRIMARY KEY (字段名1, 字段名2, ...)
);

查看表结构

\\d

删除表

语法

-- 删除一个表
DROP TABLE [ IF EXISTS ] table_name;

-- 删除多个表
DROP TABLE [ IF EXISTS ] table1_name, table2_name;

修改表结构

新增一列

ALTER TABLE table_name ADD 字段名 数据类型;

删除一列

ALTER TABLE table_name DROP COLUMN 字段名;

修改某列的数据类型

ALTER TABLE table_name ALTER COLUMN 字段名 TYPE 数据类型;

新增 NOT NULL 约束

ALTER TABLE table_name ALTER 字段名 数据类型 NOT NULL;

新增约束

-- 主键
ALTER TABLE table_name ADD CONSTRAINT MyPrimaryKey PRIMARY KEY (column1, column2, ...);

-- 外键
ALTER TABLE table_name ADD CONSTRAINT MyForeignKey FOREIGN KEY (字段名) REFERENCES 主键表名(主键字段);

-- 唯一约束
ALTER TABLE table_name ADD CONSTRAINT MyUnique UNIQUE (column1, column2, ...);

-- 检查约束
ALTER TABLE table_name ADD CONSTRAINT MyCheck CHECK (条件);

删除约束

ALTER TABLE table_name DROP CONSTRAINT 约束名称;

数据操作

新增数据

语法

-- 插入一行指定字段的值
INSERT INTO TABLE_NAME (column1, column2, column3, ...) VALUES (value1, value2, value3, ...);

-- 插入一行全部字段的值
INSERT INTO TABLE_NAME VALUES (value1, value2, value3, ...);

-- 插入多行指定字段的值
INSERT INTO TABLE_NAME (column1, column2, column3, ...) VALUES
(value1, value2, value3, ...),
(value1, value2, value3, ...);

-- 插入多行全部字段的值
INSERT INTO TABLE_NAME VALUES
(value1, value2, value3, ...),
(value1, value2, value3, ...);

删除数据

语法

-- 删除整张表数据
DELETE FROM TABLE_NAME;

-- 删除指定条件的数据
DELETE FROM TABLE_NAME WHERE [condition];

修改数据

语法

UPDATE table_name
SET column1 = value1, column2 = value2, ..., columnN = valueN
WHERE [condition];

查询数据

基础查询

-- 查询所有字段(注意:使用 * 会导致索引失效)
SELECT * FROM table_name;

-- 查询指定字段
SELECT column1, column2, ... FROM table_name;

WHERE 子句

SELECT column1, column2, ... FROM table_name WHERE [condition];

LIKE 模糊查询

-- _:单一字符(有且只有一个)
-- 例如:_aaa 匹配 column1 第一位任意,第2、3、4位为 aaa 的所有数据
SELECT * FROM table_name WHERE column1 LIKE '_aaa';

-- %:通配符(任意多个字符)
-- 例如:%aaa 匹配 column1 结尾为 aaa 的所有数据
SELECT * FROM table_name WHERE column1 LIKE '%aaa';

-- 组合使用:_aaa% 匹配 column1 以 xaaa 开头的数据
SELECT * FROM table_name WHERE column1 LIKE '_aaa%';

WITH 子句(CTE)

介绍

WITH 子句提供了一种编写辅助语句的方法,以便在更大的查询中使用。这些语句通常称为通用表表达式(CTE),可以当作一个为查询而存在的临时表。

语法
WITH
   name_for_summary_data AS (
      SELECT Statement)
SELECT columns
FROM name_for_summary_data
WHERE conditions <=> (
  SELECT column
  FROM name_for_summary_data)
[ORDER BY columns]
示例
WITH CTE AS (
  SELECT
    column1,
    column2,
    column3,
    column4
  FROM XXX
)
SELECT * FROM CTE;

LIMIT 分页

语法
SELECT column1, column2, ...
FROM table_name
LIMIT [no of rows] | LIMIT [no of rows] OFFSET [row num];
示例
-- 第一页,每页4条
SELECT * FROM table_name LIMIT 4 OFFSET 0;

-- 第二页,每页4条
SELECT * FROM table_name LIMIT 4 OFFSET 4;

HAVING 子句

SELECT column1, column2, ...
FROM table_name
WHERE [conditions]
GROUP BY column1, column2, ...
HAVING [conditions]
ORDER BY column1, column2, ...;

AND / OR 条件

SELECT column1, column2, ...
FROM table_name
WHERE [condition1] AND/OR [condition2] AND/OR [conditionN];

ORDER BY 排序

SELECT column1, column2, ...
FROM table_name
[WHERE condition]
[ORDER BY column1, column2, ...] [ASC | DESC];

GROUP BY 分组

SELECT column1, column2, ...
FROM table_name
WHERE [conditions]
GROUP BY column1, column2, ...;

AS 别名

SELECT DISTINCT column1 AS COL1, column2 AS COL2, ... FROM table_name;

DISTINCT 去重

SELECT DISTINCT column1, column2, ...
FROM table_name
WHERE [condition];

COUNT 计数

SELECT COUNT(1) / COUNT(*) / COUNT(字段)
FROM table_name
WHERE [condition];

子查询

SELECT 子查询

语法

SELECT column_name [, column_name ]
FROM   table1 [, table2 ]
WHERE  column_name OPERATOR
      (SELECT column_name [, column_name ]
      FROM table1 [, table2 ]
      [WHERE])

示例

SELECT * FROM USER WHERE ID IN (SELECT * FROM USER WHERE AGE > 20);

INSERT 子查询

语法

INSERT INTO table_name [ (column1 [, column2 ]) ]
   SELECT [ *|column1 [, column2 ] ]
   FROM table1 [, table2 ]
   [ WHERE VALUE OPERATOR ]

示例

INSERT INTO USER1 SELECT * FROM USER WHERE ID IN (SELECT * FROM USER WHERE AGE > 20);

UPDATE 子查询

语法

UPDATE table
SET column_name = new_value
[ WHERE OPERATOR [ VALUE ]
   (SELECT COLUMN_NAME
   FROM TABLE_NAME)
   [ WHERE) ]

示例

UPDATE USER username="aaa" WHERE ID IN (SELECT * FROM USER WHERE AGE > 20);

DELETE 子查询

语法

DELETE FROM TABLE_NAME
[ WHERE OPERATOR [ VALUE ]
   (SELECT COLUMN_NAME
   FROM TABLE_NAME)
   [ WHERE) ]

示例

DELETE FROM USER WHERE ID IN (SELECT * FROM USER WHERE AGE > 20);

多表联查

内连接(INNER JOIN)

笛卡尔积形式

SELECT column_name1, column_name2
FROM   table1, table2
WHERE  table1.column = table2.column;

JOIN 形式

SELECT column_name1, column_name2
FROM table1 (INNER) JOIN table2 ON table1.column = table2.column;

左连接(LEFT JOIN)

SELECT column_name1, column_name2
FROM table1 LEFT JOIN table2 ON table1.column = table2.column;

右连接(RIGHT JOIN)

SELECT column_name1, column_name2
FROM table1 RIGHT JOIN table2 ON table1.column = table2.column;

外连接

左外连接

-- Oracle 风格
SELECT column_name1, column_name2
FROM   table1, table2
WHERE  table1.column = table2.column(+);

-- 标准 SQL
SELECT column_name1, column_name2
FROM table1 LEFT OUTER JOIN table2 ON table1.column = table2.column;

右外连接

-- Oracle 风格
SELECT column_name1, column_name2
FROM   table1, table2
WHERE  table1.column(+) = table2.column;

-- 标准 SQL
SELECT column_name1, column_name2
FROM table1 RIGHT OUTER JOIN table2 ON table1.column = table2.column;

交叉连接(CROSS JOIN)

SELECT column_name1, column_name2
FROM table1 CROSS JOIN table2;

全连接(FULL JOIN)

SELECT column_name1, column_name2
FROM table1 FULL JOIN table2 ON table1.column = table2.column;

完整查询语法

语法

SELECT column1, column2, ...
FROM table1
JOIN table2 ON table1.column = table2.column
WHERE [conditions]
GROUP BY column1, column2, ...
HAVING [conditions]
ORDER BY column1, column2, ... [ASC|DESC]
LIMIT [no of rows] OFFSET [row num];

执行顺序

  1. FROM 子句:标识出查询的主表及其关联表

  2. JOIN 子句:如果有的话,执行联结

  3. ON 子句:对 JOIN 的条件进行过滤

  4. WHERE 子句:对记录进行过滤

  5. GROUP BY 子句:按指定的列分组记录

  6. HAVING 子句:对分组的结果进行过滤

  7. SELECT 子句:选取特定的列

  8. DISTINCT 子句:去除重复数据

  9. ORDER BY 子句:按指定的列排序结果

  10. LIMIT 子句和 OFFSET 子句:限制结果集数量和偏移量

上一篇 大模型-初识大模型
距离活动开始
--
:
--
:
--
:
--
00 : 00 : 00
202686星期四

今日时光

00 : 00 :00
已过 0 剩余 0
0%
目录
涛哥

涛哥管理员

一名95后Java全栈开发程序员,95后技术分享博主,致力于技术分享和个人项目创作

本月创作热力图