[ 永遠的UNIX::UNIX技術資料的寶庫 ]   GB | BIG5

首頁 > 數據庫 > 其它 > 正文
PostgreSQL7.0手冊-教程 -73. Postgres SQL 高級特性
編譯:何偉平 laser@zhengmai.com.cn (2001-04-21 23:45:36)
第七十三章. 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 用戶的.這些特性將在用戶手冊和程序員手冊中詳細描述.

--------------------------------------------------------------------------------

(http://www.fanqiang.com)
    進入【UNIX論壇

相關文章
PostgreSQL7.0手冊-附錄-文檔 (2001-04-21 23:50:44)
PostgreSQL7.0手冊-附錄-日期/時間支持-CVS 倉庫 (2001-04-21 23:48:48)
PostgreSQL7.0手冊-教程 -73. Postgres SQL 高級特性 (2001-04-21 23:45:36)
PostgreSQL7.0手冊-教程 -72. 查詢語言 (2001-04-21 23:44:40)
PostgreSQL7.0手冊-教程 -71. 開始 (2001-04-21 23:42:54)
PostgreSQL7.0手冊-教程 -70. 體系結構 (2001-04-21 23:41:58)
PostgreSQL7.0手冊-教程 -69. SQL (2001-04-21 23:41:23)
PostgreSQL7.0手冊-開發者手冊 -68. 分頁文件 (2001-04-21 23:39:22)
PostgreSQL7.0手冊-開發者手冊 -67. 端接口 (2001-04-21 23:38:34)
PostgreSQL7.0手冊-開發者手冊 -66. gcc 缺省優化 (2001-04-21 23:37:20)

===更多相關===
 

★  樊強制作 歡迎分享  ★