把 PostgreSQL 跑起来
读数据库的书,最好手边真有一个库。这一章我们花几分钟把 PostgreSQL 装好、连上,认识它的门面 psql——之后书里每一段 SQL,你都能亲手敲进去,看它当真地回你话。
三条路,任选一条
把 PostgreSQL 跑起来有很多种方式,挑最顺手的一条即可。目标只有一个:得到一个能连的库。
路一:本机安装(最适合边读边练)
# macOS(Homebrew) $ brew install postgresql@17 $ brew services start postgresql@17 # Ubuntu / Debian $ sudo apt install postgresql $ sudo systemctl start postgresql # Windows:官网下载 EDB 安装包,一路下一步,自带 pgAdmin
装好后,Homebrew 会以你的系统用户名建一个同名超级用户和同名数据库,直接就能连。Linux 上则通常有一个 postgres 系统用户,第一次用 sudo -u postgres psql 进去。
路二:Docker(最干净,用完即弃)
$ docker run --name pg -e POSTGRES_PASSWORD=secret \
-p 5432:5432 -d postgres:17
$ docker exec -it pg psql -U postgres
一行拉起一个全新的 PostgreSQL 17,端口映到本机 5432。练完 docker rm -f pg 一删,干干净净,不在你机器上留任何东西。
路三:一个免费云实例(零安装)
Neon、Supabase、Aiven 等都提供免费的 PostgreSQL 实例,注册完给你一个连接串(postgresql://user:pass@host/db),本地用 psql "连接串" 就能连。适合不想在本机装东西的人。
建一个练手的库
连上之后,先建一个专门用来读这本书的数据库,别在默认库里折腾:
$ createdb serious # 命令行直接建库(PG 自带的小工具) $ psql serious # 连进这个库 psql (17.2) Type "help" for help. serious=# # 这个 =# 提示符,就是你接下来的战场
那个 serious=# 提示符值得多看一眼。serious 是当前库名,=# 里的 # 表示你是超级用户(普通用户是 =>)。当你的语句还没写完(比如没打分号),提示符会变成 serious-#,提醒你「这句还没完」。
PostgreSQL 的一个实例(一个跑着的服务进程)里,可以有多个数据库(database);每个数据库里又有多个 schema(命名空间,默认叫 public);schema 里才是表。所以完整的层级是 实例 › 数据库 › schema › 表。这和 MySQL 不同——在 MySQL 里,database 和 schema 几乎是同义词,没有中间那一层。这个差别在卷 VI 讲权限和多租户时会变得重要。
psql:不是「简陋的命令行」,是一件趁手的工具
很多从图形工具过来的人小看 psql,觉得它就是个黑框框。其实它是 PostgreSQL 世界里最趁手的工具之一,核心是那套反斜杠元命令(backslash commands)——它们不是 SQL,是 psql 自己的快捷指令,用来查看数据库结构、控制显示。
最常用的一把:
| 元命令 | 作用 | MySQL 里的对应 |
|---|---|---|
\l | 列出所有数据库 | SHOW DATABASES; |
\dt | 列出当前库的所有表 | SHOW TABLES; |
\d 表名 | 看一张表的结构(列、类型、索引、约束) | DESCRIBE 表; / SHOW CREATE TABLE |
\di | 列出所有索引 | SHOW INDEX FROM 表; |
\du | 列出所有角色 / 用户 | SELECT user FROM mysql.user; |
\c 库名 | 切换到另一个数据库 | USE 库名; |
\x | 切换「竖排」显示(宽表神器) | \G(放在语句末尾) |
\timing | 开关每条语句的耗时显示 | 默认就显示 |
\e | 用外部编辑器写这条长 SQL | — |
\? / \h | 元命令帮助 / SQL 语法帮助 | help |
\d 表名 是你会用得最多的一个。它把一张表的全貌一次给你:
serious=# \d orders
Table "public.orders"
Column | Type | Nullable | Default
---------+---------------+----------+---------------------------------
id | integer | not null | nextval('orders_id_seq'::regclass)
ship_by | date | |
code | character varying(4) | |
qty | integer | |
Indexes:
"orders_pkey" PRIMARY KEY, btree (id)
列、类型、能不能为空、默认值、索引、约束,一屏看全——比在 MySQL 里 SHOW CREATE TABLE 读那一大段建表语句清爽得多。
\x auto:让 psql 自动决定横排还是竖排——窄结果横着显示,宽结果自动转竖排,一列一行,再宽的表也不串行。
把常用设置写进 ~/.psqlrc:比如 \timing on、\x auto、\set COMP_KEYWORD_CASE upper(关键字自动补全成大写)。每次连库自动生效,一劳永逸。
跑第一句 SQL
确认一切正常,来一句最没营养但最踏实的查询:
SELECT version();
PostgreSQL 17.2 on aarch64-apple-darwin, compiled by clang ... (1 row)
看到版本号,说明你已经站在一个真正的 PostgreSQL 面前了。从下一章起,我们建起示例数据,正式开挖。
顺便:怎么把一段 SQL 喂进去
三种方式,都会用到:
- 交互式:直接在
=#后面敲,分号结束。适合探索。 - 跑一个文件:
psql serious -f schema.sql,或在 psql 里\i schema.sql。适合建表、导数据。 - 一次性:
psql serious -c "SELECT count(*) FROM orders;",跑完就退。适合脚本、CI。
从 mysql 客户端过来,几处习惯要改一下:
- 看结构:不是
DESCRIBE t,是\d t;不是SHOW TABLES,是\dt;不是SHOW DATABASES,是\l。这些查看命令在 PG 里全是反斜杠元命令,不是 SQL。 - 竖排显示:MySQL 用语句末尾的
\G,PG 用\x开关(或\x auto)。 - 切库:MySQL 的
USE db在 PG 里是\c db;而且 PG 里切库是重新连接(跨库查询不能像 MySQL 那样db.table直接点过去,卷 VI 会讲原因)。 - 反引号:MySQL 用反引号
`col`包标识符,PG 用双引号"col"——而且 PG 里双引号还会让标识符区分大小写,这是个常见坑(卷 VI 详谈)。字符串两边一律用单引号,这点两家一致。
这一章的一句话
装好一个库、记住 psql 的 \d / \dt / \l 三件套,你就有了一个能随时验证的战场。接下来的每一个概念,都请顺手在真库里敲一遍——「当真」这件事,看别人讲一百遍,不如自己被它拒绝一次记得牢。