国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數據庫 > PostgreSQL > 正文

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 用戶的.這些特性將在用戶手冊和程序員手冊中詳細描述.

-----------------------------------------------------------------------------
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 乳山市| 通许县| 芜湖县| 白河县| 阜康市| 冀州市| 来安县| 巴南区| 枝江市| 林州市| 滦南县| 白朗县| 沁水县| 辽源市| 定结县| 兴城市| 常德市| 靖西县| 綦江县| 南充市| 岳池县| 兖州市| 荆州市| 尼玛县| 津市市| 娄烦县| 黎平县| 鲁山县| 大足县| 新化县| 尉犁县| 松原市| 佳木斯市| 治多县| 岚皋县| 临海市| 辽源市| 淅川县| 邢台市| 绥棱县| 乐至县|