CodeGym /课程 /SQL SELF /使用数组(`ARRAY`)

使用数组(`ARRAY`)

SQL SELF
第 16 级 , 课程 2
可用

今天我们来聊聊数组——PostgreSQL里很强大的一个工具,可以让你在一列里存储同一类型的值的列表。后面我们还会更详细地讲数组。

说到“数组”,大家肯定会想到列表。就像你去超市前写购物清单一样:苹果、香蕉、牛奶、面包。在PostgreSQL里,数组就像这样的清单,可以在一个字段里存好几个值,而且这些值都是同一种数据类型。比如数字数组、文本数组、日期数组等等。

来几个例子:

数字数组:

{1, 2, 3, 4}

字符串数组:

{"apple", "banana", "cherry"}

日期数组:

{2024-10-01, 2024-10-02, 2024-10-03}

数组让你能把很多值塞进一个字段,省表空间,还能让查询更灵活。

为什么要用数组?主要优点

数据存储更紧凑:多个值放一个字段里。对于逻辑上相关的数据特别有用。比如文章的标签列表,或者学生的成绩列表。为几个标签单独建一张表?

查询方便:数组可以直接从一个字段里拿到一整个值的列表,还能很容易操作数组里的单个元素。

性能:有些场景下,数组能避免为关联数据建额外的表,这样数据库结构更简单,开发也快点。谁不喜欢呢。

怎么在PostgreSQL里用数组?

在SELECT里创建数组

可以用ARRAY[]构造数组。比如:

-- 数字数组例子
SELECT ARRAY[1, 2, 3, 4];

-- 字符串数组例子
SELECT ARRAY['apple', 'banana', 'cherry'];

太简单了。我们来建个表,试试在里面查点东西。

创建带数组的表

先建个表,其中一列是数组。

id name - VARCHAR(50) subjects - TEXT[]
1 Alex {数学,物理}
2 Maria {化学,生物,英语}
3 Peter {信息学}

看看结果:

SELECT * FROM students;
id name subjects
1 Alex {数学,物理}
2 Maria {化学,生物,英语}
3 Peter {信息学}

从数组里取数据

PostgreSQL有不少函数和操作符可以用来从数组里取数据。

取数组的某个元素

要按索引取数组元素,用中括号[]。注意,索引从1开始(不是像大多数编程语言那样从0开始)。

-- 取每个学生的第一个科目
SELECT name, subjects[1] AS 第一个科目 FROM students;

结果如下:

name 第一个科目
Alex 数学
Maria 化学
Peter 信息学

取整个数组字段

要拿到数组的所有元素,直接用SELECT就行:

SELECT name, subjects FROM students;

在数组里查找值

有时候我们想知道数组里有没有某个值。可以用ANY操作符。

-- 查找学“数学”的学生
SELECT name
FROM students
WHERE '数学' = ANY(subjects);

查询结果:

name
Alex

PostgresQL里有超多数组相关的函数和操作符,后面还会讲到,敬请期待 :P

用数组时常见的坑

把0和1的索引搞混。

PostgreSQL数组索引是从1开始的。如果你习惯了Python或JavaScript那种从0开始的,容易搞晕。

空数组。

空数组{}NULL在PostgreSQL里不是一回事。比较数组时别搞混了。

大数组的处理。

在数组里存太多数据会让查询变慢。数组适合存小量数据。

2
任务
SQL SELF, 第 16 级, 课程 2
已锁定
在数组中查找值
在数组中查找值
2
任务
SQL SELF, 第 16 级, 课程 2
已锁定
提取数组的第一个元素
提取数组的第一个元素
评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION