PostgreSQL7.0手冊-教程 -73. Postgres SQL 高級特性
2019-09-08 23:34:00
供稿:網友
第七十三章. 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 用戶的.這些特性將在用戶手冊和程序員手冊中詳細描述.
-----------------------------------------------------------------------------