PostgreSql詳細介紹(三)

PostgreSQL 學習手冊(常用數據類型) 
一、數值類型: 
 
    下面是 PostgreSQL 所支持的數值類型的列表和簡單說明: 

   1. 整數類型:    

類型 smallint、integer 和 bigint 存儲各種範圍的全部是數字的數,也就是沒有小數部分的數字。試圖存儲超出範圍以外的數值 將導致一個錯誤。常用的類型是 integer,因爲它提供了在範圍、存儲空間和性能之間的最佳平衡。一般只有在磁盤空間緊張的時候 才使用 smallint。而只有在 integer 的範圍不夠的時候才使用 bigint,因爲前者(integer)絕對快得多。  
 
    2. 任意精度數值:    

類型 numeric 可以存儲最多 1000 位精度的數字並且準確地進行計算。因此非常適合用於貨幣金額和其它要求計算準確的數量。 不過,numeric 類型上的算術運算比整數類型或者浮點數類型要慢很多。     numeric 字段的最大精度和最大比例都是可以配置的。要聲明一個類型爲 numeric 的字段,你可以用下面的語法:     NUMERIC(precision,scale)     比如數字 23.5141 的精度爲 6,而刻度爲 4。     在目前的 PostgreSQL 版本中,decimal 和 numeric 是等效的。          

3. 浮點數類型:    

數據類型 real 和 double 是不準確的、犧牲精度的數字類型。不準確意味着一些數值不能準確地轉換成內部格式並且是以近似的 形式存儲的,因此存儲後再把數據打印出來可能顯示一些缺失。        

4. Serial(序號)類型:     serial 和 bigserial 類型不是真正的類型,只是爲在表中設置唯一標識做的概念上的便利。    

CREATE TABLE tablename (        

colname SERIAL    

);    

等價於    

CREATE SEQUENCE tablename_colname_seq;    

CREATE TABLE tablename(        

colname integer DEFAULT nextval('tablename_colname_seq') NOT NULL    

);    

這樣,我們就創建了一個整數字段並且把它的缺省數值安排爲從一個序列發生器取值。應用了一個 NOT NULL 約束以確保空值不 會被插入。在大多數情況下你可能還希望附加一個 UNIQUE 或者 PRIMARY KEY 約束避免意外地插入重複的數值,但這個不是自動 發生的。因此,如果你希望一個序列字段有一個唯一約束或者一個主鍵,那麼你現在必須聲明,就像其它數據類型一樣。     還需要另外說明的是,一個 serial 類型創建的序列在其所屬字段被刪除時,該序列也將被自動刪除,但是其它情況下是不會被刪 除的。因此,如果你想用同一個序列發生器同時給幾個字段提供數據,那麼就應該以獨立對象的方式創建該序列發生器。  
 
二、字符類型: 
 
    下面是 PostgreSQL 所支持的字符類型的列表和簡單說明: 

    SQL 定義了兩種基本的字符類型,varchar(n)和 char(n),這裏的 n 是一個正整數。兩種類型都可以存儲最多 n 個字符長的字 串,試圖存儲更長的字串到這些類型的字段裏會產生一個錯誤,除非超出長度的字符都是空白,這種情況下該字串將被截斷爲最大長 度。如果沒有長度聲明,char 等於 char(1),而 varchar 則可以接受任何長度的字串。    

MyTest=>

CREATE TABLE testtable(first_col varchar(2));    

CREATE TABLE    

MyTest=> INSERT INTO testtable VALUES('333');  

-插入字符串的長度,超過其字段定義的長度,因此報錯。
ERROR:  value too long for type character varying(2)    

-插入字符串中,超出字段定義長度的部分是空格,因此可以插入,但是空白符被截斷。
MyTest=> INSERT INTO testtable VALUES('33 ');        

INSERT 0 1    

MyTest=> SELECT * FROM testtable;    

 first_col    

-----------      

33    

(1 row)    

這裏需要注意的是,如果是將數值轉換成 char(n)或者 varchar(n),那麼超長的數值將被截斷成 n 個字符,而不會拋出錯誤。     MyTest=> select 1234::varchar(2);      

varchar    

---------      

12    

(1 row)    

最後需要提示的是,這三種類型之間沒有性能差別,只不過是在使用 char 類型時增加了存儲尺寸。雖然在某些其它的數據庫系統 裏,char(n)有一定的性能優勢,但在 PostgreSQL 裏沒有。在大多數情況下,應該使用 text 或者 varchar。      
三、日期/時間類型: 
 
    下面是 PostgreSQL 所支持的日期/時間類型的列表和簡單說明: 
 
 
    1. 日期/時間輸入:     任何日期或者時間的文本輸入均需要由單引號包圍,就象一個文本字符串一樣。    

1). 日期:    

以下爲合法的日期格式列表: 

    2). 時間:     以下爲合法的時間格式列表: 

    3). 時間戳:    

時間戳類型的有效輸入由一個日期和時間的聯接組成,後面跟着一個可選的時區。因此,1999-01-08 04:05:06 和 1999-01-08 04:05:06 -8:00 都是有效的數值。        

2. 示例:    

1). 在插入數據之前先查看 datestyle 系統變量的值:    

MyTest=> show datestyle;

     DateStyle

    -----------

     ISO, YMD

    (1 row)

2). 創建包含日期、時間和時間戳類型的示例表:

    MyTest=> CREATE TABLE testtable (id integer, date_col date, time_col time, timestamp_col timestamp);

    CREATE TABLE

3). 插入數據:

    MyTest=>

INSERT INTO testtable(id,date_col) VALUES(1, DATE'01/02/03');  --datestyle 爲 YMD www.linuxidc.com
    INSERT 0 1

MyTest=> SELECT id, date_col FROM testtable;

id   |  date_col

 ----+------------

 1  | 2001-02-03

 (1 row)          

MyTest=>

set datestyle = MDY;    

SET    

MyTest=>

INSERT INTO testtable(id,date_col) VALUES(2, DATE'01/02/03');  --datestyle爲 MDY 
    INSERT 0 1    

MyTest=>

SELECT id,date_col FROM testtable;    

 id   |  date_col    

----+------------      

1  | 2001-02-03      

2  | 2003-01-02   
 
MyTest=>

INSERT INTO testtable(id,time_col) VALUES(3, TIME'10:20:00');  -插入時間。
INSERT 0 1    

MyTest=>

SELECT id,time_col FROM testtable WHERE time_col IS NOT NULL;      

id   | time_col    

----+----------      

3   | 10:20:00    

(1 row) 
 
MyTest=>

INSERT INTO testtable(id,timestamp_col) VALUES(4, DATE'01/02/03');      

INSERT 0 1    

MyTest=>

INSERT INTO testtable(id,timestamp_col) VALUES(5, TIMESTAMP'01/02/03 10:20:00');    

INSERT 0 1    

MyTest=>

SELECT id,timestamp_col FROM testtable WHERE timestamp_col IS NOT NULL;      

id   |    timestamp_col    

----+---------------------      

4  | 2003-01-02 00:00:00      

5  | 2003-01-02 10:20:00    

(2 rows) 
 
四、布爾類型: 
 
    PostgreSQL 支持標準的 SQL boolean 數據類型。boolean 只能有兩個狀態之一:真(True)或 假(False)。該類型佔用 1 個字 節。     "真"值的有效文本值是:    

TRUE    

't'    

'true'    

'y'    

'yes'    

'1'    

而對於"假"而言,你可以使用下面這些: 
FALSE    

'f'    

'false'    

'n'    

'no'    

'0'  

見如下使用方式:    

MyTest=>

CREATE TABLE testtable (a boolean, b text);    

CREATE TABLE    

MyTest=>

INSERT INTO testtable VALUES(TRUE, 'sic est');    

INSERT 0 1    

MyTest=>

INSERT INTO testtable VALUES(FALSE, 'non est');    

INSERT 0 1    

MyTest=>

SELECT * FROM testtable;    

 a  |    b    

---+---------      

t  | sic est      

f  | non est    

(2 rows)        

MyTest=>

SELECT * FROM testtable WHERE a;      

a  |    b    

---+---------      

t  | sic est    

(1 row)        

MyTest=>

SELECT * FROM testtable WHERE a = true;      

a  |    b    

---+---------      

t  | sic est    

(1 row)      
五、位串類型: 
 
    位串就是一串 1 和 0 的字串。它們可以用於存儲和視覺化位掩碼。我們有兩種類型的 SQL 位類型:bit(n)和 bit varying(n); 這 裏的 n 是一個正整數。bit 類型的數據必須準確匹配長度 n; 試圖存儲短些或者長一些的數據都是錯誤的。類型 bit varying 數據是最 長 n 的變長類型;更長的串會被拒絕。寫一個沒有長度的 bit 等效於 bit(1),沒有長度的 bit varying 相當於沒有長度限制。     針對該類型,最後需要提醒的是,如果我們明確地把一個位串值轉換成 bit(n),那麼它的右邊將被截斷或者在右邊補齊零,直到剛 好 n 位,而不會拋出任何錯誤。類似地,如果我們明確地把一個位串數值轉換成 bit varying(n),如果它超過 n 位,那麼它的右邊將 被截斷。 見如下具體使用方式:        

MyTest=>

CREATE TABLE testtable (a bit(3), b bit varying(5));    

CREATE TABLE    

MyTest=>

INSERT INTO testtable VALUES (B'101', B'00');    

INSERT 0 1    

MyTest=> INSERT INTO testtable VALUES (B'10', B'101');    

ERROR:  bit string length 2 does not match type bit(3)    

MyTest=> INSERT INTO testtable VALUES (B'10'::bit(3), B'101');    

INSERT 0 1     MyTest=> SELECT * FROM testtable;      

a  |  b 
-----+-----      

101 | 00      

100 | 101    

(2 rows)    

MyTest=>

SELECT B'11'::bit(3);      

bit    

-----      

110    

(1 row) 
 
六、數組: 
 
    1. 數組類型聲明:    

1). 創建字段含有數組類型的表。    

CREATE TABLE sal_emp (        

name            

text,        

pay_by_quarter  integer[] -還可以定義爲 integer[4] 或 integer ARRAY[4]    

);    

2). 插入數組數據:    

MyTest=# INSERT INTO sal_emp VALUES ('Bill', '{11000, 12000, 13000, 14000}');    

INSERT 0 1    

MyTest=# INSERT INTO sal_emp VALUES ('Carol', ARRAY[21000, 22000, 23000, 24000]);    

INSERT 0 1    

MyTest=# SELECT * FROM sal_emp;      

name  |      pay_by_quarter    

--------+---------------------------      

Bill     | {11000,12000,13000,14000}      

Carol  | {21000,22000,23000,24000}    

(2 rows)     
 
    2. 訪問數組:    

和其他語言一樣,

PostgreSQL 中數組也是通過下標數字(寫在方括弧內)的方式進行訪問,只是 PostgreSQL 中數組元素的下標 是從 1 開始 n 結束。    

MyTest=# SELECT pay_by_quarter[3] FROM sal_emp;      

pay_by_quarter    

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

13000              

23000    

(2 rows)    

MyTest=# SELECT name FROM sal_emp WHERE pay_by_quarter[1] <> pay_by_quarter[2];      

name    

------      

Bill      

Carol    

(2 rows)    

PostgreSQL 中還提供了訪問數組範圍的功能,即 ARRAY[腳標下界:腳標上界]。    

MyTest=# SELECT name,pay_by_quarter[1:3] FROM sal_emp;      

name  |   pay_by_quarter 
--------+---------------------      

Bill     | {11000,12000,13000}      

Carol  | {21000,22000,23000}    

(2 rows)          

3. 修改數組:    

1). 代替全部數組值:    

--UPDATE sal_emp SET pay_by_quarter = ARRAY[25000,25000,27000,27000] WHERE name = 'Carol'; 也可以。
MyTest=# UPDATE sal_emp SET pay_by_quarter = '{31000,32000,33000,34000}' WHERE name = 'Carol';    

UPDATE 1    

MyTest=# SELECT * FROM sal_emp;      

name  |      pay_by_quarter    

--------+---------------------------      

Bill     | {11000,12000,13000,14000}      

Carol  | {31000,32000,33000,34000}    

(2 rows)    

2). 更新數組中某一元素:    

MyTest=# UPDATE sal_emp SET pay_by_quarter[4] = 15000 WHERE name = 'Bill';    

UPDATE 1    

MyTest=# SELECT * FROM sal_emp;      

name  |      pay_by_quarter    

--------+---------------------------      

Carol  | {31000,32000,33000,34000}      

Bill     | {11000,12000,13000,15000}    

(2 rows)    

3). 更新數組某一範圍的元素:    

MyTest=# UPDATE sal_emp SET pay_by_quarter[1:2] = '{37000,37000}' WHERE name = 'Carol';    

UPDATE 1    

MyTest=# SELECT * FROM sal_emp;      

name  |      pay_by_quarter    

--------+---------------------------      

Bill     | {11000,12000,13000,15000}      

Carol  | {37000,37000,33000,34000}    

(2 rows)    

4). 直接賦值擴大數組:    

MyTest=# UPDATE sal_emp SET pay_by_quarter[5] = 45000 WHERE name = 'Bill';    

UPDATE 1    

MyTest=# SELECT * FROM sal_emp;      

name  |         pay_by_quarter    

--------+---------------------------------      

Carol  | {37000,37000,33000,34000}      

Bill     | {11000,12000,13000,15000,45000}    

(2 rows) 
 
4. 在數組中檢索:

    1). 最簡單直接的方法:

    SELECT * FROM sal_emp WHERE pay_by_quarter[1] = 10000 OR

                            pay_by_quarter[2] = 10000 OR

                            pay_by_quarter[3] = 10000 OR 
                            pay_by_quarter[4] = 10000;

        2). 更加有效的方法:

    SELECT * FROM sal_emp WHERE 10000 = ANY (pay_by_quarter); -數組元素中有任何一個等於 10000 , where
條件將成立。
     SELECT * FROM sal_emp WHERE 10000 = ALL (pay_by_quarter); -只有當數組中所有的元素都等於 10000時, where
條件才成立。
 
 
七、複合類型: 
 
    PostgreSQL 中複合類型有些類似於 C 語言中的結構體,也可以被視爲 Oracle 中的記錄類型,但是還是感覺複合類型這個命名比 較貼切。它實際上只是一個字段名和它們的數據類型的列表。PostgreSQL 允許像簡單數據類型那樣使用複合類型。比如,表字段可 以聲明爲一個複合類型。

    1. 聲明覆合類型:

    下面是兩個簡單的聲明示例:

    CREATE TYPE complex AS (

        r double,

        i double

    );

       CREATE TYPE inventory_item AS (

        name           text,

        supplier_id   integer,

        price            numeric

    );

    和聲明一個數據表相比,聲明類型時需要加 AS 關鍵字,同時在聲明 TYPE 時不能定義任何約束。下面我們看一下如何在表中指定 複合類型的字段,如:

    CREATE TABLE on_hand (

        item      inventory_item,

        count    integer

    );  

  最後需要指出的是,在創建表的時候,PostgreSQL 也會自動創建一個與該表對應的複合類型,名字與表字相同,即表示該表的復 合類型。

         2. 複合類型值輸入:

    我們可以使用文本常量的方式表示複合類型值,即在圓括號裏包圍字段值並且用逗號分隔它們。你也可以將任何字段值用雙引號括 起,如果值本身包含逗號或者圓括號,那麼就用雙引號括起,對於上面的 inventory_item 複合類型的輸入如下:

    '("fuzzy dice",42,1.99)'

    如果希望類型中的某個字段爲 NULL,只需在其對應的位置不予輸入即可,如下面的輸入中 price 字段的值爲 NULL,     '("fuzzy dice",42,)'  

  如果只是需要一個空字串,而非 NULL,寫一對雙引號,如:

    '("",42,)'

 在更多的場合中 PostgreSQL 推薦使用 ROW 表達式來構建複合類型值,使用該種方式相對簡單,無需考慮更多標識字符問題, 如:

    ROW('fuzzy dice', 42, 1.99)     ROW('', 42, NULL)  

  注:對於 ROW 表達式,如果裏面的字段數量超過 1 個,那麼關鍵字 ROW 就可以省略,因此以上形式可以簡化爲:

('fuzzy dice', 42, 1.99)     ('', 42, NULL) 
    3. 訪問複合類型:

    訪問複合類型中的字段和訪問數據表中的字段在形式上極爲相似,只是爲了對二者加以區分,PostgreSQL 設定在訪問複合類型中 的字段時,類型部分需要用圓括號括起,以避免混淆,如:

    SELECT (item).name FROM on_hand WHERE (item).price > 9.99;

    如果在查詢中也需要用到表名,那麼表名和類型名都需要被圓括號括起,如:

    SELECT (on_hand.item).name FROM on_hand WHERE (on_hand.item).price > 9.99;

         4. 修改複合類型:

    見如下幾個示例:     -直接插入複合類型的數據,這裏是通過 ROW 表達式來完成的。
     INSERT INTO on_hand(item) VALUES(ROW("fuzzy dice",42,1.99));     -在更新操作中,也是可以通過 ROW 表達式來完成。
     UPDATE on_hand SET item = ROW("fuzzy dice",42,1.99) WHERE count = 0;     -在更新複合類型中的一個字段時,我們不能在 SET 後面出現的字段名周圍加圓括號,
     -但是在等號右邊的表達式裏引用同一個字段時卻需要圓括號。
     UPDATE on_hand SET item.price = (item).price + 1 WHERE count = 0;     -可以在插入中,直接插入複合類型中字段。
     INSERT INTO on_hand (item.supplier_id, item.price) VALUES(100, 2.2);    


PostgreSQL 學習手冊(函數和操作符<一>) 
一、邏輯操作符: 
 
    常用的邏輯操作符有:AND、OR 和 NOT。其語義與其它編程語言中的邏輯操作符完全相同。 
 
二、比較操作符: 
 
    下面是 PostgreSQL 中提供的比較操作符列表: 

    比較操作符可以用於所有可以比較的數據類型。所有比較操作符都是雙目操作符,且返回 boolean 類型。除了比較操作符以外, 我們還可以使用 BETWEEN 語句,如:     a BETWEEN x AND y 等效於 a >= x AND a <= y         a NOT BETWEEN x AND y 等效於 a < x OR a > y 
三、 數學函數和操作符: 
 
    下面是 PostgreSQL 中提供的數學操作符列表: 

按位操作符只能用於整數類型,而其它的操作符可以用於全部數值數據類型。按位操作符還可以用於位串類型 bit 和 bit varying, 
    下面是 PostgreSQL 中提供的數學函數列表,需要說明的是,這些函數中有許多都存在多種形式,區別只是參數類型不同。除非 特別指明,任何特定形式的函數都返回和它的參數相同的數據類型。 


    三角函數列表: 

 
四、字符串函數和操作符: 
 
    下面是 PostgreSQL 中提供的字符串操作符列表: 


 
五、位串函數和操作符: 
 
    對於類型 bit 和 bit varying,除了常用的比較操作符之外,還可以使用以下列表中由 PostgreSQL 提供的位串函數和操作符,其 中&、|和#的位串操作數必須等長。在移位的時候,保留原始的位串的的長度。 

    除了以上列表中提及的操作符之外,位串還可以使用字符串函數:length, bit_length, octet_length, position, substring。 此外,我們還可以在整數和 bit 之間來回轉換,如:

    MyTest=# SELECT 44::bit(10);

        bit

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

     0000101100  

  (1 row)

    MyTest=# SELECT 44::bit(3);

     bit

    -----

     100

    (1 row)

    MyTest=# SELECT cast(-44 as bit(12));

         bit

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

     111111010100

    (1 row)

    MyTest=# SELECT '1110'::bit(4)::integer;

     int4 
    ------

       14  

  (1 row)

    注意:如果只是轉換爲"bit",意思是轉換成 bit(1),因此只會轉換成整數的最低位。 
PostgreSQL 學習手冊(函數和操作符<二>) 
六、模式匹配: 
 
    PostgreSQL 中提供了三種實現模式匹配的方法:SQL LIKE 操作符,更近一些的 SIMILAR TO 操作符,和 POSIX-風格正則表 達式。

    1. LIKE:

    string LIKE pattern [ ESCAPE escape-character ]

    string NOT LIKE pattern [ ESCAPE escape-character ]

    每個 pattern 定義一個字串的集合。如果該 string 包含在 pattern 代表的字串集合裏,那麼 LIKE 表達式返回真。和我們想象的 一樣,如果 LIKE 返回真,那麼 NOT LIKE 表達式返回假,反之亦然。在 pattern 裏的下劃線(_)代表匹配任何單個字符,而一個百 分號(%)匹配任何零或更多字符,如:

'abc' LIKE 'abc'     true    

'abc' LIKE 'a%'     true    

'abc' LIKE '_b_'    true    

'abc' LIKE 'c'        false      

要匹配文本的下劃線或者百分號,而不是匹配其它字符,在 pattern 裏相應的字符必須前導轉義字符。缺省的轉義字符是反斜槓, 但是你可以用 ESCAPE 子句指定一個。要匹配轉義字符本身,寫兩個轉義字符。我們也可以通過寫成 ESCAPE ''的方式有效地關閉 轉義機制,此時,我們就不能關閉下劃線和百分號的特殊含義了。     關鍵字 ILIKE 可以用於替換 LIKE,令該匹配就當前的區域設置是大小寫無關的。這個特性不是 SQL 標準,是 PostgreSQL 的擴 展。操作符~~等效於 LIKE, 而~~*對應 ILIKE。還有!~~和!~~*操作符分別代表 NOT LIKE 和 NOT ILIKE。所有這些操 作符都是 PostgreSQL 特有的。  
 
    2. SIMILAR TO 正則表達式:    

SIMILAR TO 根據模式是否匹配給定的字符串而返回真或者假。    

string SIMILAR TO pattern [ESCAPE escape-character]    

string NOT SIMILAR TO pattern [ESCAPE escape-character]    

它和 LIKE 非常類似,支持 LIKE 的通配符('_'和'%')且保持其原意。

除此之外,SIMILAR TO 還支持一些自己獨有的元字符, 如:        

1). | 標識選擇(兩個候選之一)。    

2). * 表示重複前面的項零次或更多次。    

3). + 表示重複前面的項一次或更多次。    

4). 可以使用圓括弧()把項組合成一個邏輯項。    

5). 一個方括弧表達式[...]聲明一個字符表,就像 POSIX 正則表達式一樣。     見如下示例:    

'abc' SIMILAR TO 'abc'           true    

'abc' SIMILAR TO 'a'              false    

'abc' SIMILAR TO '%(b|d)%'  true    

'abc' SIMILAR TO '(b|c)%'     false    

帶三個參數的 substring,substring(string from pattern for escape-character),提供了一個從字串中抽取一個匹配 SQL 正則表達式模式的子字串的函數。和 SIMILAR TO 一樣,聲明的模式必須匹配整個數據串,否則函數失效並返回 NULL。爲了標識在 
成功的時候應該返回的模式部分,模式必須出現後跟雙引號(")的兩個轉義字符。匹配這兩個標記之間的模式的字串將被返回,如:    

MyTest=# SELECT substring('foobar' from '%#"o_b#"%' FOR '#'); -這裏 # 是轉義符,雙引號內的模式是返回部分。
    substring

    -----------

     oob

    (1 row)

 MyTest=# SELECT substring('foobar' from '#"o_b#"%' FOR '#');  --foobar 不 能 完 全 匹 配 後 面 的 模 式 ,因 此 返 回 NULL 。
      substring

    ----------- 
 
    (1 row) 
 
七、數據類型格式化函數: 
 
    PostgreSQL 格式化函數提供一套有效的工具用於把各種數據類型(日期/時間、integer、floating point 和 numeric)轉換成格 式化的字符串以及反過來從格式化的字符串轉換成指定的數據類型。下面列出了這些函數,它們都遵循一個公共的調用習慣:第一個 參數是待格式化的值,而第二個是定義輸出或輸出格式的模板。 

     1. 用於日期/時間格式化的模式: 


     2. 用於數值格式化的模板模式: 


 
八、時間/日期函數和操作符: 
 
    1. 下面是 PostgreSQL 中支持的時間/日期操作符的列表: 

    2. 日期/時間函數: 

    3. EXTRACT,date_part 函數支持的 field: 


4. 當前日期/時間:    

我們可以使用下面的函數獲取當前的日期和/或時間∶

    CURRENT_DATE

    CURRENT_TIME

    CURRENT_TIMESTAMP

    CURRENT_TIME (precision)

    CURRENT_TIMESTAMP (precision)

    LOCALTIME

    LOCALTIMESTAMP

    LOCALTIME (precision)

    LOCALTIMESTAMP (precision)  
PostgreSQL 學習手冊(函數和操作符<三>) 
九、序列操作函數: 
 
    序列對象(也叫序列生成器)都是用 CREATE SEQUENCE 創建的特殊的單行表。一個序列對象通常用於爲行或者表生成唯一的標 識符。下面序列函數,爲我們從序列對象中獲取最新的序列值提供了簡單和併發讀取安全的方法。 
函數 
返回 類型 
描述 
nextval(regclass) bigint 
遞增序列對象到它的下一個數值並且返回該值。這個動作是自動完成的。即使多個 會話併發運行 nextval,每個進程也會安全地收到一個唯一的序列值。 
currval(regclass) bigint 
在當前會話中返回最近一次 nextval 抓到的該序列的數值。(如果在本會話中從未 在該序列上調用過 nextval,那麼會報告一個錯誤。 )請注意因爲此函數返回一個會 話範圍的數值,而且也能給出一個可預計的結果,因此可以用於判斷其它會話是否 執行過 nextval。 
lastval() bigint 
返回當前會話裏最近一次 nextval 返回的數值。這個函數等效於 currval,只是 它不用序列名爲參數,它抓取當前會話裏面最近一次 nextval 使用的序列。如果當 前會話還沒有調用過 nextval,那麼調用 lastval 將會報錯。 
setval(regclass, bigint) 
bigint 
重置序列對象的計數器數值。設置序列的 last_value 字段爲指定數值並且將其 is_called 字段設置爲 true,表示下一次 nextval 將在返回數值之前遞增該序 列。 
setval(regclass, bigint, boolean) 
bigint 
重置序列對象的計數器數值。功能等同於上面的 setval 函數,只是 is_called 可 以設置爲 true 或 false。如果將其設置爲 false,那麼下一次 nextval 將返回 該數值,隨後的 nextval 纔開始遞增該序列。 www.linuxidc.com
    對於 regclass 參數,僅需用單引號括住序列名即可,因此它看上去就像文本常量。爲了達到和處理普通 SQL 對象一樣的兼容性, 這個字串將被轉換成小寫,除非該序列名是用雙引號括起,如:     nextval('foo')     -操作 序列號 foo     nextval('FOO')    -操作序列號 foo     nextval('"Foo"')   -操作序列號 Foo     SELECT setval('foo', 42);    -下次 nextval 將返回 43     SELECT setval('foo', 42, true);         SELECT setval('foo', 42, false);   -下次 nextval 將返回 42 
     
十、條件表達式: 
 
    1. CASE:

    SQL CASE 表達式是一種通用的條件表達式,類似於其它語言中的 if/else 語句。

    CASE WHEN condition THEN result

        [WHEN ...]

        [ELSE result]

    END

    condition 是一個返回 boolean 的表達式。如果爲真,那麼 CASE 表達式的結果就是符合條件的 result。如果結果爲假,那麼以 相同方式搜尋隨後的 WHEN 子句。如果沒有 WHEN condition 爲真,那麼 case 表達式的結果就是在 ELSE 子句裏的值。如果省略 了 ELSE 子句而且沒有匹配的條件,結果爲 NULL,如:

    MyTest=> SELECT * FROM testtable;

     i

    ---

     1

     2  

   3  

  (3 rows)

    MyTest=> SELECT i, CASE WHEN i=1 THEN 'one'

    MyTest->                              WHEN i=2 THEN 'two'

    MyTest->                               ELSE 'other'

    MyTest->                END

    MyTest-> FROM testtable;

     i | case

    ---+-------

     1 | one

     2 | two  

   3 | other

    (3 rows)

    注:CASE 表達式並不計算任何對於判斷結果並不需要的子表達式。

         2. COALESCE:

    COALESCE 返回它的第一個非 NULL 的參數的值。它常用於在爲顯示目的檢索數據時用缺省值替換 NULL 值。     COALESCE(value[, ...])     和 CASE 表達式一樣,COALESCE 將不會計算不需要用來判斷結果的參數。也就是說,在第一個非空參數右邊的參數不會被計算。

         3. NULLIF:     當且僅當 value1 和 value2 相等時,NULLIF 才返回 NULL。否則它返回 value1。

    NULLIF(value1, value2) 
    MyTest=> SELECT NULLIF('abc','abc');

     nullif

    --------

   (1 row)

        MyTest=> SELECT NULLIF('abcd','abc');

     nullif

    --------  

   abcd

    (1 row) 
 
    4. GREATEST 和 LEAST:

    GREATEST 和 LEAST 函數從一個任意的數字表達式列表裏選取最大或者最小的數值。列表中的 NULL 數值將被忽略。只有所有 表達式的結果都是 NULL 的時候,結果纔會是 NULL。

    GREATEST(value [, ...])     LEAST(value [, ...])

    MyTest=> SELECT GREATEST(1,3,5);  

   greatest  

  ----------  

          5  

  (1 row)  

    MyTest=> SELECT LEAST(1,3,5,NULL);

     least

    -------  

       1    

(1 row)      
十一、數組函數和操作符: 
 
    1. PostgreSQL 中提供的用於數組的操作符列表: 

    2. PostgreSQL 中提供的用於數組的函數列表:

十二、系統信息函數: 
 
    1. PostgreSQL 中提供的和數據庫相關的函數列表: 

2. 允許用戶在程序裏查詢對象訪問權限的函數: 


    
注:以上函數均返回 boolean類型。要評估一個用戶是否在權限上持有賦權選項,給權限鍵字附加 WITH GRANT OPTION ;比
如 'UPDATE WITH GRANT OPTION' 。

     3. 模式可視性查詢函數:

    那些判斷一個對象是否在當前模式搜索路徑中可見的函數。 如果一個表所在的模式在搜索路徑中,並且沒有同 名的表出現在搜索路徑的更早的地方,那麼就說這個表視可見的。 它等效於表可以不帶明確模式修飾進行引用。 
 
    
注:以上 函數均返回 boolean類型,所有這些函數都需要對象 OID 
標識作爲檢查的對象。
     postgres=# SELECT pg_table_is_visible('testtable'::regclass);

     pg_table_is_visible

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

     t  

  (1 row) 
 
    4. 系統表信息函數: 


    這些函數大多數都有兩個變種,其中一個可以選擇對結果的"漂亮的打印"。 漂亮打印的格式更容易讀,但是缺省的格式更有可能 被將來的 PostgreSQL 版本用同樣的方法解釋;如果是用於轉儲,那麼儘可能避免使用漂亮打印。 給漂亮打印參數傳遞 false 生成的 結果和那個沒有這個參數的變種生成的結果完全一樣。 
 
十三、系統管理函數: 
 
    1. 查詢以及修改運行時配置參數的函數: 
 
    current_setting 用於以查詢形式獲取 setting_name 設置的當前數值。它和 SQL 命令 SHOW 是等效的。 比如:

    MyTest=# SELECT current_setting('datestyle');

     current_setting

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

     ISO, YMD

    (1 row)

    set_config 將參數 setting_name 設置爲 new_value。如果 is_local 設置爲 true,那麼新數值將只應用於當前事務。如果你希 望新的數值應用於當前會話,那麼應該使用 false。它等效於 SQL 命令 SET。比如:

     MyTest=# SELECT set_config('log_statement_stats','off', false);

     set_config  

  ------------ 
     off  

  (1 row)  

2. 數據庫對象尺寸函數: 

    3. 數據庫對象位置函數:   

    mydatabase=# select pg_relation_filenode('testtable');

     pg_relation_filenode

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

              17877

    (1 row)  

      mydatabase=# select pg_relation_filepath('testtable');  

               pg_relation_filepath

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

     pg_tblspc/17633/PG_9.1_201105231/17636/17877

    (1 row)    

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章