第 5 章 Postgres SQL 的高级特性
在介绍了使用
Postgres SQL
访问数据的基础知识之后,我们现在来讨论
Postgres 区别于传统数据管理器的那些特性。这些特性包括继承、时间旅行以及非原子数据值(数组值和集合值属性)。本节的示例也可以在教程目录的
advance.sql 中找到。(关于如何使用它,请参阅第 4 章。)
5.1. 继承
让我们创建两个类。capitals 类包含也是城市的州首府。自然,capitals 类应当从 cities 继承。
CREATE TABLE cities (
name text,
population float,
altitude int -- (in ft)
);
CREATE TABLE capitals (
state char2
) INHERITS (cities);
在这种情况下,capitals 的一个实例会从它的父类
cities 继承全部属性(name、population 和
altitude)。属性 name 的类型是
text,这是 Postgres
原生的一种变长 ASCII 字符串类型。属性 population 的类型是
float,一种
Postgres 原生的双精度浮点数类型。州首府有一个额外的属性
state,用来表示所在的州。在 Postgres
中,一个类可以从零个或多个其他类继承,而一个查询既可以引用一个类的所有实例,也可以引用一个类及其所有后代的所有实例。
注意
继承层次结构是一个有向无环图。
例如,下面的查询会找出所有海拔在 500 英尺或更高的城市:
SELECT name, altitude
FROM cities
WHERE altitude > 500;
+----------+----------+
|name | altitude |
+----------+----------+
|Las Vegas | 2174 |
+----------+----------+
|Mariposa | 1953 |
+----------+----------+
另一方面,要找出所有海拔超过 500 英尺的城市名称(包括州首府),查询是:
SELECT c.name, c.altitude
FROM cities* c
WHERE c.altitude > 500;它返回:
+----------+----------+ |name | altitude | +----------+----------+ |Las Vegas | 2174 | +----------+----------+ |Mariposa | 1953 | +----------+----------+ |Madison | 845 | +----------+----------+
这里,cities 后面的“*”表示该查询应当在
cities 以及继承层次中位于 cities
之下的所有类上运行。我们已经讨论过的许多命令(select、update 和 delete)以及 alter 等其他命令都支持这种“*”记法。