开始PostgreSQL的第一步 | SQL全面教程零:PostgreSQL安装及使用介绍

1,435 阅读6分钟

下面是PostgreSQL官网的介绍。

PostgreSQL是一个功能强大的开源对象关系数据库系统,它使用和扩展SQL语言,并结合了许多功能,这些功能可以安全地存储和扩展最复杂的数据工作负载。 PostgreSQL的起源可以追溯到1986年,它是加州大学伯克利分校的POSTGRES项目的一部分,在核心平台上已有30多年的积极开发经验。

PostgreSQL官网中文社区都可以用来了解和学习PostgreSQL。其生产版本从EDB下载,根据需要下载对应版本即可。

本文使用的Windows-x64下12.4版本。

执行安装

Windows下的安装比较简单,直接运行安装包,根据图形化提示,选择安装路径

推荐使用NTFS格式分区安装PostgreSQL

选择需要的组件,默认全选即可

选择数据存储的位置

设置超级用户(数据库管理员)的密码

设置端口号,保持默认即可

选择数据库的语言环境(数据库运行时的字符编码格式),地区设置。此处选择默认的[Default localt]或者"C"(不使用区域,如果"Default locale"会导致安装不正确可以选择"C")

之后进行安装

如下安装完成,“Launch Stack Builder atexit? ”下取消选中,“Launch Stack Builder”会安装各种相关的附带工具,如果仅仅使用PostgreSQL,则无需安装这些工具。 点击"Finish"安装完成

修改设置文件

在PostgreSQL的数据文件下data\,找到其设置文件postgresql.conf

打开文件,找到其设置项listen_addresses,默认其值为*,即所有主机都可以连接数据库。通常为了安全性考虑,数据库只允许本地连接,如下将其改为localhost,只允许本机连接。

listen_addresses = 'localhost'		# what IP address(es) to listen on;
					# comma-separated list of addresses;
					# defaults to 'localhost'; use '*' for all
					# (change requires restart)

需要重复PostgreSQL服务才能生效

PostgreSQL的管理和使用

PostgreSQL提供了基于web的图形化管理工具(pgAdmin 4),和SQL命令行管理工具SQL Shell(psql)

pgAdmin 4介绍

打开登陆pgAdmin 4

如下,打开pgAdmin 4,程序启动后会在浏览器打开其管理的web页面,输入密码进入。

pgAdmin 4使用使用Python和js/jQuery重写的pgAdmin。pgAdmin 4可以采用三种方式进行部署:桌面部署(Desktop Deployment)、服务器部署(Server Deployment,默认)和容器部署(Container Deployment)。

设置pgAdmin 4中文界面

pgAdmin支持多语言界面,默认为英语。但可以改为中文界面,点击“File”下拉菜单,选择“Preferences”;找到左侧列表中的“miscellaneous”(杂项设置) -> “User language”,然后在右侧下拉列表中选项“Chinese (Simplified)”,点击保存。

重新刷新页面即变为中文。

数据库的连接和管理

如下,点击pgAdmin的左侧,Servers(会提示输入登陆密码),展开后,会看到PostgreSQL 12及相关的数据库对象。

可以看到新安装的PostgreSQL(数据库管理系统)带有一个数据库postgres;两个表空间:pg_defaultpg_global

数据库默认的表空间pg_default是用来存储系统目录对象、用户表、用户表index、和临时表、临时表index、内部临时表的默认空间,他是模板数据库template0和template1的默认表空间。

pg_global是用来存储共享系统目录的默认空间。

新建服务器连接

右键点击左侧的Servers,选择"创建"——"服务器",在“创建-服务器”对话框中,设定一个连接名称,并指定一个服务器组

在"连接"中指定主机名或ip地址、端口、数据、用户名和密码。点击"保存"创建并连接到数据库服务器。

左侧的对象浏览器中可以查看和管理各种数据库对象。

在"数据库"节点下的任意节点位置,右键——选择"查询工具...",或者点击"数据库"下的任意节点,在"工具"菜单下——点击"查询工具",都可以打开查询编辑器。

查询工具用于执行各种SQL语句和命令,运行SQL脚本,显示查询执行计划,导出查询结果

创建数据库

在"服务器"或"数据库"节点下,右键——"创建"——选择“数据库”,即可创建数据库。

如下,指定数据库名、编码表空间等

在"SQL"选项卡下可以看到SQL语句

CREATE DATABASE demo
    WITH 
    OWNER = postgres
    ENCODING = 'UTF8'
    CONNECTION LIMIT = -1;

COMMENT ON DATABASE demo
    IS '创建数据库的测试';

创建表

在"架构"(Schemas,有的版本翻译为"模式")节点下,右击"表",选择创建表

在"创建表"的对话框中,指定表名,"列"选项卡下,添加必要的列名、类型等

SQL下可以看到对应的SQL语句

CREATE TABLE public.test
(
    "Id" integer NOT NULL,
    "Name" character varying(50),
    "Desc" character varying(120),
    PRIMARY KEY ("Id")
);

ALTER TABLE public.test
    OWNER to postgres;

COMMENT ON TABLE public.test
    IS '创建表测试';

保存后在表下就能看到刚创建的表test了

删除表

右键表"test",选择删除/移除

删除数据库

右键数据库"demo",选择删除/移除

命令行管理接口psql

psql使用

命令行管理接口

Windows下在开始菜单——PostgreSQL 12下,或者直接在开始菜单处搜索psql

打开psql后,输入server、数据库、端口、用户名密码登陆

\help可以查看各个命令的语法

命令行中使用psql

也可以直接在命令行(cmd或powershell)中使用psql登陆PostgreSQL进行查询管理等操作

可以将<PostgerSQL安装目录>\bin\psql.exe路径加入到环境变量中,便于直接在命令中使用

执行psql -U postgres使用plsql登陆PostgreSQL,出现postgres=#表示登陆连接成功

PS C:\WINDOWS\system32> psql -U postgres
用户 postgres 的口令:
psql (12.4)
输入 "help" 来获取帮助信息.

postgres=#

psql中创建数据库

如下创建数据库并切换到新数据库

postgres=# CREATE DATABASE SHOP;
CREATE DATABASE
postgres=# \c shop
您现在已经连接到数据库 "shop",用户 "postgres".
shop=#

切换数据库:\c [database_name]

切换用户:\c - [user_name]

psql其他命令

登录时指定用户名和数据库

登陆PostgreSQL时指定用户名和数据库:psql -U user -d dbname

psql -U postgres -d postgres

列出所有的数据库:\l

shop=# \l
                                                        数据库列表
   名称    |  拥有者  | 字元编码 |            校对规则            |             Ctype              |       存取权限
-----------+----------+----------+--------------------------------+--------------------------------+-----------------------
 demo      | postgres | UTF8     | Chinese (Simplified)_China.936 | Chinese (Simplified)_China.936 |
 postgres  | postgres | UTF8     | Chinese (Simplified)_China.936 | Chinese (Simplified)_China.936 |
 shop      | postgres | UTF8     | Chinese (Simplified)_China.936 | Chinese (Simplified)_China.936 |
 template0 | postgres | UTF8     | Chinese (Simplified)_China.936 | Chinese (Simplified)_China.936 | =c/postgres          +
           |          |          |                                |                                | postgres=CTc/postgres
 template1 | postgres | UTF8     | Chinese (Simplified)_China.936 | Chinese (Simplified)_China.936 | =c/postgres          +
           |          |          |                                |                                | postgres=CTc/postgres
(5 行记录)


shop=#

切换数据库 \c dbname

列举表 \dt;查看索引 \di;查看表结构\d tablename

修改用户密码 \password [USERNAME]

退出psql \q

其他

关于查看表结构的SQL语句可以查看PostgreSQL - 查询表结构和索引信息的介绍

  • 通过系统数据字典查询表结构
select
col.table_schema,
col.table_name,
col.ordinal_position,
col.column_name,
col.data_type,
col.character_maximum_length,
col.numeric_precision,
col.numeric_scale,
col.is_nullable,
col.column_default,
des.description
from
information_schema.columns col left join pg_description des on
col.table_name::regclass = des.objoid
and col.ordinal_position = des.objsubid
where
table_schema = 'public'
and table_name = 'product'
order by
ordinal_position;

select * from information_schema.columns
where table_schema='public' and table_name='product';
  • 通过系统数据字典查询索引信息
select
A.SCHEMANAME,
A.TABLENAME,
A.INDEXNAME,
A.TABLESPACE,
A.INDEXDEF,
B.AMNAME,
C.INDEXRELID,
C.INDNATTS,
C.INDISUNIQUE,
C.INDISPRIMARY,
C.INDISCLUSTERED,
D.DESCRIPTION
from
PG_AM B left join PG_CLASS F on
B.OID = F.RELAM left join PG_STAT_ALL_INDEXES E on
F.OID = E.INDEXRELID left join PG_INDEX C on
E.INDEXRELID = C.INDEXRELID left outer join PG_DESCRIPTION D on
C.INDEXRELID = D.OBJOID,
PG_INDEXES A
where
A.SCHEMANAME = E.SCHEMANAME
and A.TABLENAME = E.RELNAME
and A.INDEXNAME = E.INDEXRELNAME
and E.SCHEMANAME = 'public'
and E.RELNAME = 'product';
  • 查询所有表名
select
n.nspname,
relname
from
pg_class c,
pg_namespace n
where
c.relnamespace = n.oid
and nspname = 'public'
and relkind = 'r'
order by
relname;
  • 查看表结构
SELECT a.attnum, a.attname AS field, t.typname AS type, a.attlen AS length, a.atttypmod AS lengthvar
    , a.attnotnull AS notnull, b.description AS comment
FROM pg_class c, pg_attribute a
    LEFT JOIN pg_description b
    ON a.attrelid = b.objoid
        AND a.attnum = b.objsubid, pg_type t
WHERE c.relname = 'product'
    AND a.attnum > 0
    AND a.attrelid = c.oid
    AND a.atttypid = t.oid
ORDER BY a.attnum;