PostgreSQL 学习 01

archive time: 2023-05-02

今天来重新学习一下 PostgreSQL

之前有更新过几次有关 SQL 的学习记录博客, 但是由于没有坚持下来或者没有记录,最后被我删除了

最近我发现了一个视频系列: SQL and PostgreSQL The Complete Developer’s Guide, 我打算跟着这个视频系列来重新学习一下 PostgreSQL

创建数据库

关于 PostgreSQL 数据库的安装和配置我在这里就不再多说, Linux 上可以参照 Arch Wiki, Windows 或者其他平台可以按照 PostgreSQL 的文档来安装

安装好后,还需要创建一个数据库, 这个数据库就是练习 SQL 的地方,可以使用 createdb 命令:

createdb "<database name>"

这里的 "<database name>" 可以替换为你想要的名字,我这里就是 psqldev

创建好后连接数据库,可以使用 psql 命令来链接

psql "<database name>"

这里要注意用户是否正确,如果链接不上或者出错,可以检查一下是否是 PostgreSQL 的服务没有启动:

# 如果使用 systemd 管理
systemctl status postgresql.service

如果服务正常,那么要想想是不是没有添加用户名到 PostgreSQL 导致无法链接,具体操作请参照 Arch Wiki

如果都没有问题,那么恭喜,一个数据库就创建好了

创建表格

数据库的结构可以类比于 Microsoft Excel, 数据库就是一个 *.xlsx 格式的文件,而数据库里的每个表,就是对应于文件中的一张表格, 数据库中的一个数据,就对应于表中的一行内容

要存储数据到数据库中,首先要创建一张存储数据的表, 这里按照视频里的内容,表中要存放城市的信息,包括四个字段

  • 城市姓名
  • 城市属于哪个国家
  • 城市的人口
  • 城市的面积

确定好表的内容后,还需要确定每个字段的类型, PostgreSQL 所支持的类型可以在 文档 中查询

这里,城市姓名和国家选择使用 character varying(n) 类型, 其中 n 代表最大字符数量,在这里, 就是个不错的数字, 而人口和面积使用 integer 类型

每个表格都需要一个索引用的字段,称为 主键,对应关键字就是 primary key, 主键要求字段内容唯一,这里可以选择城市的姓名作为主键

综上,创建城市表的代码如下

create table cities (
  name character varying(64) primary key,
  country character varying(64),
  population integer,
  area integer
);

create table 就是要创建一个表,cities 是表的名字, 括号里面是表中的字段,使用逗号分隔, 每个字段的基本格式是 <column> <type> [primary key],一张表只能有一个主键

如此一来,这个城市表就创建好了

插入数据

插入数据到某个表中,可以使用 insert into 语句来实现

insert into <table name> (..., <cols>)
values (..., <vals>),
  ...
  (..., <vals>)

这里 <table name> 就是要插入的表的名字,<cols> 表示插入数据对应的字段名, 而 <vals> 则是插入的数据,数据顺序要和 <cols> 中指定的一致,例如:

insert into cities (name, country, population, area)
values ('Tokyo', 'Japan', 37732000, 8231),
  ('Delhi', 'India', 32226000, 2344),
  ('Shanghai', 'China', 24073000, 4333),
  ('Sao Paulo', 'Brazil', 23086000, 3649);

这里的数据摘自 Wikipedia,人口和面积均指的是城镇(Urban)人口

查询数据

要查看表的内容,可以使用 select 语句

cities表内容

其中 * 是一个通配符,表示所有的字段,一般 select 的语法如下:

select ..., <cols> from <table name>;

<cols> 就是字段名,可以重复,并且还可以在查询时做一些运算和重命名,例如

select name,
  cast(population as real) / cast(area as real) as "population density"
from cities;

查询结果如下:

简单查询运算示例

其中,在 PostgreSQL 中,单引号表示字符串字面值, 而双引号可以用来表示字段名这种特殊的 名称cast(<col> as <type>) 是一种类型转换,表示把某一个字段转变为 <type> 类型, 这里由于要做除法运算,所以从 integer 类型转为了 real 类型, 而整个运算的结果使用 as 起了一个字段别名 population density

常见数学运算:

运算符号或函数
加法+
减法-
乘法*
除法/
取余%
乘方^
平方根,立方根|/||/
绝对值@
位与或非&|~
位异或#
位左移右移<<>>

对于字符串,或者文本值,也有一套操作符或函数可以使用:

字符串运算符号或函数
拼接||
转为大写upper()
转为小写lower()
字符长度character_length()
位长度bit_length()
字节长度octet_length()

筛选数据

在查询时,还可以添加一些条件作为筛选(filter)

一般逻辑关系可以有:

关系或操作符号
与或非andornot
大于,大于等于>>=
小于,小于等于<<=
等于=
不等<>!=
在一个范围内between
在一个列表内in
不再范围或列表内not betweennot in
有别于is distinct from
是 NULLis null

其中一些语句的示例

比较操作示例

而筛选则使用 where 语句,例如:

select name,
  area
from cities
where area > 4000;

查询结果如下

简单查询筛选示例

where 中同样可以使用数学运算和一些函数


今天就暂时把一些基础内容过了一遍, 后续还有 updatedelete 什么的,那就留到下次把