PostgreSQL7.0手册-教程 -73. Postgres SQL 高级特性
内容
继承
非原子数值
更多高级特性
在结束了使用 PostgresSQL 访问你的数据的基本方法的课程之后,我们将开始讨论Postgres区别于其他传统数据库管理器的特性.这些特性包括:继承,时间跟踪和非定量数值(数组和有值字段)(array- and set-valued attributes).本节的例子可以在教程目录的 advance.sql 文件中找到.(如何使用参见 第 72 章 。)
继承
让我们创建两个表.表 capitals 包含各州的首府,同时也是cities表.自然而然,表 capitals 应该从表 cities 继承下来.
CREATE TABLE cities (
name text,
population float,
altitude int -- (in ft)
);
CREATE TABLE capitals (
state char(2)
) INHERITS (cities);
在本例中,一条 capitals 的记录 继承 所有父表 cities 的字段(name,population,和 altitude). 字段 name 的类型是 text, Postgres 用于变长 ASCII 字符串的类型.字段 population 的类型是 float, Postgres 的双精度浮点数据类型.表 capitals 多一个字段,state,表明首府所在的州.在 Postgres 里,一个表可以从0或更多个其他表继承下来,一个查询可以检索一个表的所有记录,也可以检索一个表和其所有后代的记录.
注意: 继承层次是一种开放的不循环的图形.
例如,下面查询将找出所有海拔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.
--------------------------------------------------------------------------------
-------------------------------------------------------------------------------
非原子数值
关系型模型的一个要求就是所有关系的字段都是原子化(译注:意为不可分割,目前正在寻找最准确的译法.)的.Postgres没有这个限制;字段可以有自己的子值,这些值可以通过查询语言访问.例如,你可以创建数组类字段.
数组
Postgres 允许一个字段被定义成定长或不定长的多维数组.数组可以是任何基本类型或者用户自定义的类型.为说明这些,我们先创建一个由基本类型数组组成的表.
CREATE TABLE SAL_EMP (
name text,
pay_by_quarter int4[],
schedule text[][]
);
上面的查询语句将创建一个叫 SAL_EMP的表,表中有一个 text 串(name),一个 int4 型的一维数组(pay_by_quarter),代表以季度为单位的雇员薪水和一个二维的 text 型数组(schedule),代表雇员的周计划.现在我们做一些插入 (INSERTSs);注意当我们向数组中追加数据时,我们用大括号将数据括起来,并且用逗号将它们区别开.如果你懂 C,这和初始化一个结构的语法很像.
INSERT INTO SAL_EMP
VALUES ('Bill',
'{10000, 10000, 10000, 10000}',
'{{"meeting", "lunch"}, {}}');
INSERT INTO SAL_EMP
VALUES ('Carol',
'{20000, 25000, 25000, 25000}',
'{{"talk", "consult"}, {"meeting"}}');
Postgres 缺省使用 "1为基" 的数组(下标)计数方法,也就是说,一个 n 个元素的数组第一个元素是array[1],最后一个元素是array[n].现在,我们在 SAL_EMP 表上运行一些查询.首先,我们展示如何一次访问一个数组的某一元素.这个查询检索出在第二季度收入改变了的雇员名:
SELECT name
FROM SAL_EMP
WHERE SAL_EMP.pay_by_quarter[1] <>
SAL_EMP.pay_by_quarter[2];
+------+
name
+------+
Carol
+------+
下面的查询检索所有雇员第三季度的收入:
SELECT SAL_EMP.pay_by_quarter[3] FROM SAL_EMP;
+---------------+
pay_by_quarter
+---------------+
10000
+---------------+
25000
+---------------+
我们还可以访问数组任意片段或者子数组.下面查询检索 Bill 周计划头两天的第一项.
SELECT SAL_EMP.schedule[1:2][1:1]
FROM SAL_EMP
WHERE SAL_EMP.name = 'Bill';
+-------------------+
schedule
+-------------------+
{{"meeting"},{""}}
+-------------------+
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
更多的高级特性
Postgres 有许多这个教程没有提到的特性,这些特性是面向新SQL 用户的.这些特性将在用户手册和程序员手册中详细描述.
-----------------------------------------------------------------------------