PostgreSQL 基本數據類型及經常使用SQL 函數操做

數據類型html

名字 別名 描述
bigint int8 有符號的8字節整數
bigserial serial8 自動增加的8字節整數
bit [ (n) ]   定長位串
bit varying [ (n) ] varbit 變長位串
boolean bool 邏輯布爾值(真/假)
box   平面上的普通方框
bytea   二進制數據(字節數組」)
character [ (n) ] char [ (n) ] 定長字符串
character varying [ (n) ] varchar [ (n) ] 變長字符串
cidr   IPv4或IPv6網絡地址
circle   平面上的圓
date   日曆日期(年、月、日)
double precision float8 雙精度浮點數(8字節)
inet   IPv4或IPv6主機地址
integer intint4 有符號4字節整數
interval [ fields ] [ (p) ]   時間段
json   文本 JSON 數據
jsonb   二進制 JSON 數據,已分解
line   平面上的無限長的線
lseg   平面上的線段
macaddr   MAC(Media Access Control)地址
macaddr8   MAC (Media Access Control) 地址 (EUI-64 格式)
money   貨幣數量
numeric [ (ps) ] decimal [ (ps) ] 可選擇精度的精確數字
path   平面上的幾何路徑
pg_lsn   PostgreSQL日誌序列號
point   平面上的幾何點
polygon   平面上的封閉幾何路徑
real float4 單精度浮點數(4字節)
smallint int2 有符號2字節整數
smallserial serial2 自動增加的2字節整數
serial serial4 自動增加的4字節整數
text   變長字符串
time [ (p) ] [ without time zone ]   一天中的時間(無時區)
time [ (p) ] with time zone timetz 一天中的時間,包括時區
timestamp [ (p) ] [ without time zone ]   日期和時間(無時區)
timestamp [ (p) ] with time zone timestamptz 日期和時間,包括時區
tsquery   文本搜索查詢
tsvector   文本搜索文檔
txid_snapshot   用戶級別事務ID快照
uuid   通用惟一標識碼
xml   XML數據

 

1. 查詢服務器當前時間及日期node

select now(); 取當前日期及時間正則表達式

select current_time;數據庫

select current_date;編程

select extract(YEAR  from  now()); 取當前日期的年json

select extract(month from  now()); //取當前月數組

select extract(day from  now()); //取當前日安全

2. 字符串操做服務器

select 'aaaaa'||'bbbbbb' as f1; //字符串相加網絡

select char_length('abcdefgh'); //字符串長度

select position('fgh' in 'abcdefgh'); //查找子串

select substring ( 'abcdefgh' from 5 for 3); //取一段字符串

select lower( 'abCDefgh')||upper('abCDefgh')

3. 日期轉字符串

select to_char(now(), 'yyyy-mm-dd hh:mi:ss'); 

 

更多的函數和操做見http://www.postgres.cn/docs/11/functions.html

1、邏輯操做符:

    經常使用的邏輯操做符有:AND、OR和NOT。其語義與其它編程語言中的邏輯操做符徹底相同。

2、比較操做符:

    下面是PostgreSQL中提供的比較操做符列表:

操做符 描述
< 小於
> 大於
<= 小於或等於
>= 大於或等於
= 等於
!= 不等於

    比較操做符能夠用於全部能夠比較的數據類型。全部比較操做符都是雙目操做符,且返回boolean類型。除了比較操做符之外,咱們還可使用BETWEEN語句,如:
    a BETWEEN x AND y 等效於 a >= x AND a <= y    
    a NOT BETWEEN x AND y 等效於 a < x OR a > y

3、 數學函數和操做符:

    下面是PostgreSQL中提供的數學操做符列表:

操做符 描述 例子 結果
+ 2 + 3 5
- 2 - 3 -1
* 2 * 3 6
/ 4 / 2 2
% 5 % 4 1
^ 2.0 ^ 3.0 8
|/ 平方根 |/ 25.0 5
||/ 立方根 ||/ 27.0 3
! 階乘 5 ! 120
!! 階乘 !! 5 120
@ 絕對值 @ -5.0 5
& 按位AND 91 & 15 11
| 按位OR 32 | 3 35
# 按位XOR 17 # 5 20
~ 按位NOT ~1 -2
<< 按位左移 1 << 4 16
>> 按位右移 8 >> 2 2

    按位操做符只能用於整數類型,而其它的操做符能夠用於所有數值數據類型。按位操做符還能夠用於位串類型bit和bit varying,

    下面是PostgreSQL中提供的數學函數列表,須要說明的是,這些函數中有許多都存在多種形式,區別只是參數類型不一樣。除非特別指明,任何特定形式的函數都返回和它的參數相同的數據類型。

函數 返回類型 描述 例子 結果
abs(x)   絕對值 abs(-17.4) 17.4
cbrt(double)   立方根 cbrt(27.0) 3
ceil(double/numeric)   不小於參數的最小的整數 ceil(-42.8) -42
degrees(double)   把弧度轉爲角度 degrees(0.5) 28.6478897565412
exp(double/numeric)   天然指數 exp(1.0) 2.71828182845905
floor(double/numeric)   不大於參數的最大整數 floor(-42.8) -43
ln(double/numeric)   天然對數 ln(2.0) 0.693147180559945
log(double/numeric)   10爲底的對數 log(100.0) 2
log(b numeric,x numeric)   numeric指定底數的對數 log(2.0, 64.0) 6.0000000000
mod(y, x)   取餘數 mod(9,4) 1
pi() double "π"常量 pi() 3.14159265358979
power(a double, b double) double 求a的b次冪 power(9.0, 3.0) 729
power(a numeric, b numeric) numeric 求a的b次冪 power(9.0, 3.0) 729
radians(double) double 把角度轉爲弧度 radians(45.0) 0.785398163397448
random() double 0.0到1.0之間的隨機數值 random()  
round(double/numeric)   圓整爲最接近的整數 round(42.4) 42
round(v numeric, s int) numeric 圓整爲s位小數數字 round(42.438,2) 42.44
sign(double/numeric)   參數的符號(-1,0,+1) sign(-8.4) -1
sqrt(double/numeric)   平方根 sqrt(2.0) 1.4142135623731
trunc(double/numeric)   截斷(向零靠近) trunc(42.8) 42
trunc(v numeric, s int) numeric 截斷爲s小數位置的數字 trunc(42.438,2) 42.43

    三角函數列表:

函數 描述
acos(x) 反餘弦
asin(x) 反正弦
atan(x) 反正切
atan2(x, y) 正切 y/x 的反函數
cos(x) 餘弦
cot(x) 餘切
sin(x) 正弦
tan(x) 正切


4、字符串函數和操做符:

    下面是PostgreSQL中提供的字符串操做符列表:

函數 返回類型 描述 例子 結果
string || string text 字串鏈接 'Post' || 'greSQL' PostgreSQL
bit_length(string) int 字串裏二進制位的個數 bit_length('jose') 32
char_length(string) int 字串中的字符個數 char_length('jose') 4
convert(string using conversion_name) text 使用指定的轉換名字改變編碼。 convert('PostgreSQL' using iso_8859_1_to_utf8) 'PostgreSQL'
lower(string) text 把字串轉化爲小寫 lower('TOM') tom
octet_length(string) int 字串中的字節數 octet_length('jose') 4
overlay(string placing string from int [for int]) text 替換子字串 overlay('Txxxxas' placing 'hom' from 2 for 4) Thomas
position(substring in string) int 指定的子字串的位置 position('om' in 'Thomas') 3
substring(string [from int] [for int]) text 抽取子字串 substring('Thomas' from 2 for 3) hom
substring(string from pattern) text 抽取匹配 POSIX 正則表達式的子字串 substring('Thomas' from '...$') mas
substring(string from pattern for escape) text 抽取匹配SQL正則表達式的子字串 substring('Thomas' from '%#"o_a#"_' for '#') oma
trim([leading | trailing | both] [characters] from string) text 從字串string的開頭/結尾/兩邊/ 刪除只包含characters(缺省是一個空白)的最長的字串 trim(both 'x' from 'xTomxx') Tom
upper(string) text 把字串轉化爲大寫。 upper('tom') TOM
ascii(text) int 參數第一個字符的ASCII碼 ascii('x') 120
btrim(string text [, characters text]) text 從string開頭和結尾刪除只包含在characters裏(缺省是空白)的字符的最長字串 btrim('xyxtrimyyx','xy') trim
chr(int) text 給出ASCII碼的字符 chr(65) A
convert(string text, [src_encoding name,] dest_encoding name) text 把字串轉換爲dest_encoding convert( 'text_in_utf8', 'UTF8', 'LATIN1') 以ISO 8859-1編碼表示的text_in_utf8
initcap(text) text 把每一個單詞的第一個子母轉爲大寫,其它的保留小寫。單詞是一系列字母數字組成的字符,用非字母數字分隔。 initcap('hi thomas') Hi Thomas
length(string text) int string中字符的數目 length('jose') 4
lpad(string text, length int [, fill text]) text 經過填充字符fill(缺省時爲空白),把string填充爲長度length。 若是string已經比length長則將其截斷(在右邊)。 lpad('hi', 5, 'xy') xyxhi
ltrim(string text [, characters text]) text 從字串string的開頭刪除只包含characters(缺省是一個空白)的最長的字串。 ltrim('zzzytrim','xyz') trim
md5(string text) text 計算給出string的MD5散列,以十六進制返回結果。 md5('abc')  
repeat(string text, number int) text 重複string number次。 repeat('Pg', 4) PgPgPgPg
replace(string text, from text, to text) text 把字串string裏出現地全部子字串from替換成子字串to。 replace('abcdefabcdef', 'cd', 'XX') abXXefabXXef
rpad(string text, length int [, fill text]) text 經過填充字符fill(缺省時爲空白),把string填充爲長度length。若是string已經比length長則將其截斷。 rpad('hi', 5, 'xy') hixyx
rtrim(string text [, character text]) text 從字串string的結尾刪除只包含character(缺省是個空白)的最長的字 rtrim('trimxxxx','x') trim
split_part(string text, delimiter text, field int) text 根據delimiter分隔string返回生成的第field個子字串(1 Base)。 split_part('abc~@~def~@~ghi', '~@~', 2) def
strpos(string, substring) text 聲明的子字串的位置。 strpos('high','ig') 2
substr(string, from [, count]) text 抽取子字串。 substr('alphabet', 3, 2) ph
to_ascii(text [, encoding]) text 把text從其它編碼轉換爲ASCII。 to_ascii('Karel') Karel
to_hex(number int/bigint) text 把number轉換成其對應地十六進制表現形式。 to_hex(9223372036854775807) 7fffffffffffffff
translate(string text, from text, to text) text 把在string中包含的任何匹配from中的字符的字符轉化爲對應的在to中的字符。 translate('12345', '14', 'ax') a23x5


5、位串函數和操做符:

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

操做符 描述 例子 結果
|| 鏈接 B'10001' || B'011' 10001011
& 按位AND B'10001' & B'01101' 00001
| 按位OR B'10001' | B'01101' 11101
# 按位XOR B'10001' # B'01101' 11100
~ 按位NOT ~ B'10001' 01110
<< 按位左移 B'10001' << 3 01000
>> 按位右移 B'10001' >> 2 00100

    除了以上列表中說起的操做符以外,位串還可使用字符串函數: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

 

6、模式匹配:

    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)

7、數據類型格式化函數:

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

函數 返回類型 描述 例子
to_char(timestamp, text) text 把時間戳轉換成字串 to_char(current_timestamp, 'HH12:MI:SS')
to_char(interval, text) text 把時間間隔轉爲字串 to_char(interval '15h 2m 12s', 'HH24:MI:SS')
to_char(int, text) text 把整數轉換成字串 to_char(125, '999')
to_char(double precision, text) text 把實數/雙精度數轉換成字串 to_char(125.8::real, '999D9')
to_char(numeric, text) text 把numeric轉換成字串 to_char(-125.8, '999D99S')
to_date(text, text) date 把字串轉換成日期 to_date('05 Dec 2000', 'DD Mon YYYY')
to_timestamp(text, text) timestamp 把字串轉換成時間戳 to_timestamp('05 Dec 2000', 'DD Mon YYYY')
to_timestamp(double) timestamp 把UNIX紀元轉換成時間戳 to_timestamp(200120400)
to_number(text, text) numeric 把字串轉換成numeric to_number('12,454.8-', '99G999D9S')

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

模式 描述
HH 一天的小時數(01-12)
HH12 一天的小時數(01-12)
HH24 一天的小時數(00-23)
MI 分鐘(00-59)
SS 秒(00-59)
MS 毫秒(000-999)
US 微秒(000000-999999)
AM 正午標識(大寫)
Y,YYY 帶逗號的年(4和更多位)
YYYY 年(4和更多位)
YYY 年的後三位
YY 年的後兩位
Y 年的最後一位
MONTH 全長大寫月份名(空白填充爲9字符)
Month 全長混合大小寫月份名(空白填充爲9字符)
month 全長小寫月份名(空白填充爲9字符)
MON 大寫縮寫月份名(3字符)
Mon 縮寫混合大小寫月份名(3字符)
mon 小寫縮寫月份名(3字符)
MM 月份號(01-12)
DAY 全長大寫日期名(空白填充爲9字符)
Day 全長混合大小寫日期名(空白填充爲9字符)
day 全長小寫日期名(空白填充爲9字符)
DY 縮寫大寫日期名(3字符)
Dy 縮寫混合大小寫日期名(3字符)
dy 縮寫小寫日期名(3字符)
DDD 一年裏的日子(001-366)
DD 一個月裏的日子(01-31)
D 一週裏的日子(1-7;週日是1)
W 一個月裏的週數(1-5)(第一週從該月第一天開始)
WW 一年裏的週數(1-53)(第一週從該年的第一天開始)

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

模式 描述
9 帶有指定數值位數的值
0 帶前導零的值
.(句點) 小數點
,(逗號) 分組(千)分隔符
PR 尖括號內負值
S 帶符號的數值
L 貨幣符號
D 小數點
G 分組分隔符
MI 在指明的位置的負號(若是數字 < 0)
PL 在指明的位置的正號(若是數字 > 0)
SG 在指明的位置的正/負號


8、時間/日期函數和操做符:

    1. 下面是PostgreSQL中支持的時間/日期操做符的列表:

操做符 例子 結果
+ date '2001-09-28' + integer '7' date '2001-10-05'
+ date '2001-09-28' + interval '1 hour' timestamp '2001-09-28 01:00'
+ date '2001-09-28' + time '03:00' timestamp '2001-09-28 03:00'
+ interval '1 day' + interval '1 hour' interval '1 day 01:00'
+ timestamp '2001-09-28 01:00' + interval '23 hours' timestamp '2001-09-29 00:00'
+ time '01:00' + interval '3 hours' time '04:00'
- - interval '23 hours' interval '-23:00'
- date '2001-10-01' - date '2001-09-28' integer '3'
- date '2001-10-01' - integer '7' date '2001-09-24'
- date '2001-09-28' - interval '1 hour' timestamp '2001-09-27 23:00'
- time '05:00' - time '03:00' interval '02:00'
- time '05:00' - interval '2 hours' time '03:00'
- timestamp '2001-09-28 23:00' - interval '23 hours' timestamp '2001-09-28 00:00'
- interval '1 day' - interval '1 hour' interval '23:00'
- timestamp '2001-09-29 03:00' - timestamp '2001-09-27 12:00' interval '1 day 15:00'
* interval '1 hour' * double precision '3.5' interval '03:30'
/ interval '1 hour' / double precision '1.5' interval '00:40'

    2. 日期/時間函數:

函數 返回類型 描述 例子 結果
age(timestamp, timestamp) interval 減去參數,生成一個使用年、月的"符號化"的結果 age('2001-04-10', timestamp '1957-06-13') 43 years 9 mons 27 days
age(timestamp) interval 從current_date減去獲得的數值 age(timestamp '1957-06-13') 43 years 8 mons 3 days
current_date date 今天的日期    
current_time time 如今的時間    
current_timestamp timestamp 日期和時間    
date_part(text, timestamp) double 獲取子域(等效於extract) date_part('hour', timestamp '2001-02-16 20:38:40') 20
date_part(text, interval) double 獲取子域(等效於extract) date_part('month', interval '2 years 3 months') 3
date_trunc(text, timestamp) timestamp 截斷成指定的精度 date_trunc('hour', timestamp '2001-02-16 20:38:40') 2001-02-16 20:00:00+00
extract(field from timestamp) double 獲取子域 extract(hour from timestamp '2001-02-16 20:38:40') 20
extract(field from interval) double 獲取子域 extract(month from interval '2 years 3 months') 3
localtime time 今日的時間    
localtimestamp timestamp 日期和時間    
now() timestamp 當前的日期和時間(等效於 current_timestamp)    
timeofday() text 當前日期和時間    

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

描述 例子 結果
CENTURY 世紀 EXTRACT(CENTURY FROM TIMESTAMP '2000-12-16 12:21:13'); 20
DAY (月分)裏的日期域(1-31) EXTRACT(DAY from TIMESTAMP '2001-02-16 20:38:40'); 16
DECADE 年份域除以10 EXTRACT(DECADE from TIMESTAMP '2001-02-16 20:38:40'); 200
DOW 每週的星期號(0-6;星期天是0) (僅用於timestamp) EXTRACT(DOW FROM TIMESTAMP '2001-02-16 20:38:40'); 5
DOY 一年的第幾天(1 -365/366) (僅用於 timestamp) EXTRACT(DOY from TIMESTAMP '2001-02-16 20:38:40'); 47
HOUR 小時域(0-23) EXTRACT(HOUR from TIMESTAMP '2001-02-16 20:38:40'); 20
MICROSECONDS 秒域,包括小數部分,乘以 1,000,000。 EXTRACT(MICROSECONDS from TIME '17:12:28.5'); 28500000
MILLENNIUM 千年 EXTRACT(MILLENNIUM from TIMESTAMP '2001-02-16 20:38:40'); 3
MILLISECONDS 秒域,包括小數部分,乘以 1000。 EXTRACT(MILLISECONDS from TIME '17:12:28.5'); 28500
MINUTE 分鐘域(0-59) EXTRACT(MINUTE from TIMESTAMP '2001-02-16 20:38:40'); 38
MONTH 對於timestamp數值,它是一年裏的月份數(1-12);對於interval數值,它是月的數目,而後對12取模(0-11) EXTRACT(MONTH from TIMESTAMP '2001-02-16 20:38:40'); 2
QUARTER 該天所在的該年的季度(1-4)(僅用於 timestamp) EXTRACT(QUARTER from TIMESTAMP '2001-02-16 20:38:40'); 1
SECOND 秒域,包括小數部分(0-59[1]) EXTRACT(SECOND from TIMESTAMP '2001-02-16 20:38:40'); 40
WEEK 該天在所在的年份裏是第幾周。 EXTRACT(WEEK from TIMESTAMP '2001-02-16 20:38:40'); 7
YEAR 年份域 EXTRACT(YEAR from TIMESTAMP '2001-02-16 20:38:40'); 2001

    4. 當前日期/時間:
    咱們可使用下面的函數獲取當前的日期和/或時間∶
    CURRENT_DATE
    CURRENT_TIME
    CURRENT_TIMESTAMP
    CURRENT_TIME (precision)
    CURRENT_TIMESTAMP (precision)
    LOCALTIME
    LOCALTIMESTAMP
    LOCALTIME (precision)
    LOCALTIMESTAMP (precision)

9、序列操做函數:

    序列對象(也叫序列生成器)都是用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纔開始遞增該序列。

    對於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

   
10、條件表達式:

    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)
    
11、數組函數和操做符:

    1. PostgreSQL中提供的用於數組的操做符列表:

操做符 描述 例子 結果
= 等於 ARRAY[1.1,2.1,3.1]::int[] = ARRAY[1,2,3] t
<> 不等於 ARRAY[1,2,3] <> ARRAY[1,2,4] t
< 小於 ARRAY[1,2,3] < ARRAY[1,2,4] t
> 大於 ARRAY[1,4,3] > ARRAY[1,2,4] t
<= 小於或等於 ARRAY[1,2,3] <= ARRAY[1,2,3] t
>= 大於或等於 ARRAY[1,4,3] >= ARRAY[1,4,3] t
|| 數組與數組鏈接 ARRAY[1,2,3] || ARRAY[4,5,6] {1,2,3,4,5,6}
|| 數組與數組鏈接 ARRAY[1,2,3] || ARRAY[[4,5,6],[7,8,9]] {{1,2,3},{4,5,6},{7,8,9}}
|| 元素與數組鏈接 3 || ARRAY[4,5,6] {3,4,5,6}
|| 元素與數組鏈接 ARRAY[4,5,6] || 7 {4,5,6,7}

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

函數 返回類型 描述 例子 結果
array_cat(anyarray, anyarray) anyarray 鏈接兩個數組 array_cat(ARRAY[1,2,3], ARRAY[4,5]) {1,2,3,4,5}
array_append(anyarray, anyelement) anyarray 向一個數組末尾附加一個元素 array_append(ARRAY[1,2], 3) {1,2,3}
array_prepend(anyelement, anyarray) anyarray 向一個數組開頭附加一個元素 array_prepend(1, ARRAY[2,3]) {1,2,3}
array_dims(anyarray) text 返回一個數組維數的文本表示 array_dims(ARRAY[[1,2,3], [4,5,6]]) [1:2][1:3]
array_lower(anyarray, int) int 返回指定的數組維數的下界 array_lower(array_prepend(0, ARRAY[1,2,3]), 1) 0
array_upper(anyarray, int) int 返回指定數組維數的上界 array_upper(ARRAY[1,2,3,4], 1) 4
array_to_string(anyarray, text) text 使用提供的分隔符鏈接數組元素 array_to_string(ARRAY[1, 2, 3], '~^~') 1~^~2~^~3
string_to_array(text, text) text[] 使用指定的分隔符把字串拆分紅數組元素 string_to_array('xx~^~yy~^~zz', '~^~') {xx,yy,zz}

12、系統信息函數:

    1. PostgreSQL中提供的和數據庫相關的函數列表:

名字 返回類型 描述
current_database() name 當前數據庫的名字
current_schema() name 當前模式的名字
current_schemas(boolean) name[] 在搜索路徑中的模式名字
current_user name 目前執行環境下的用戶名
inet_client_addr() inet 鏈接的遠端地址
inet_client_port() int 鏈接的遠端端口
inet_server_addr() inet 鏈接的本地地址
inet_server_port() int 鏈接的本地端口
session_user name 會話用戶名
pg_postmaster_start_time() timestamp postmaster啓動的時間
user name current_user
version() text PostgreSQL版本信息

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

名字 描述 可用權限
has_table_privilege(user,table,privilege) 用戶是否有訪問表的權限 SELECT/INSERT/UPDATE/DELETE/RULE/REFERENCES/TRIGGER
has_table_privilege(table,privilege) 當前用戶是否有訪問表的權限 SELECT/INSERT/UPDATE/DELETE/RULE/REFERENCES/TRIGGER
has_database_privilege(user,database,privilege) 用戶是否有訪問數據庫的權限 CREATE/TEMPORARY
has_database_privilege(database,privilege) 當前用戶是否有訪問數據庫的權限 CREATE/TEMPORARY
has_function_privilege(user,function,privilege) 用戶是否有訪問函數的權限 EXECUTE
has_function_privilege(function,privilege) 當前用戶是否有訪問函數的權限 EXECUTE
has_language_privilege(user,language,privilege) 用戶是否有訪問語言的權限 USAGE
has_language_privilege(language,privilege) 當前用戶是否有訪問語言的權限 USAGE
has_schema_privilege(user,schema,privilege) 用戶是否有訪問模式的權限 CREAT/USAGE
has_schema_privilege(schema,privilege) 當前用戶是否有訪問模式的權限 CREAT/USAGE
has_tablespace_privilege(user,tablespace,privilege) 用戶是否有訪問表空間的權限 CREATE
has_tablespace_privilege(tablespace,privilege) 當前用戶是否有訪問表空間的權限 CREATE

    注:以上函數均返回boolean類型。要評估一個用戶是否在權限上持有賦權選項,給權限鍵字附加 WITH GRANT OPTION;好比 'UPDATE WITH GRANT OPTION'。
    3. 模式可視性查詢函數:
    那些判斷一個對象是否在當前模式搜索路徑中可見的函數。 若是一個表所在的模式在搜索路徑中,而且沒有同名的表出如今搜索路徑的更早的地方,那麼就說這個表視可見的。 它等效於表能夠不帶明確模式修飾進行引用。

名字 描述 應用類型
pg_table_is_visible(table_oid) 該表/視圖是否在搜索路徑中可見 regclass
pg_type_is_visible(type_oid) 該類/視圖型是否在搜索路徑中可見 regtype
pg_function_is_visible(function_oid) 該函數是否在搜索路徑中可見 regprocedure
pg_operator_is_visible(operator_oid) 該操做符是否在搜索路徑中可見 regoperator
pg_opclass_is_visible(opclass_oid) 該操做符表是否在搜索路徑中可見 regclass
pg_conversion_is_visible(conversion_oid) 轉換是否在搜索路徑中可見 regoperator

    注:以上函數均返回boolean類型,全部這些函數都須要對象 OID 標識做爲檢查的對象。
    postgres=# SELECT pg_table_is_visible('testtable'::regclass);

     pg_table_is_visible
    ---------------------
     t
    (1 row)

    4. 系統表信息函數:

名字 返回類型 描述
format_type(type_oid,typemod) text 獲取一個數據類型的SQL名稱
pg_get_viewdef(view_oid) text 爲視圖獲取CREATE VIEW命令
pg_get_viewdef(view_oid,pretty_bool) text 爲視圖獲取CREATE VIEW命令
pg_get_ruledef(rule_oid) text 爲規則獲取CREATE RULE命令
pg_get_ruledef(rule_oid,pretty_bool) text 爲規則獲取CREATE RULE命令
pg_get_indexdef(index_oid) text 爲索引獲取CREATE INDEX命令
pg_get_indexdef(index_oid,column_no,pretty_bool) text 爲索引獲取CREATE INDEX命令, 若是column_no不爲零,則是隻獲取一個索引字段的定義
pg_get_triggerdef(trigger_oid) text 爲觸發器獲取CREATE [CONSTRAINT] TRIGGER
pg_get_constraintdef(constraint_oid) text 獲取一個約束的定義
pg_get_constraintdef(constraint_oid,pretty_bool) text 獲取一個約束的定義
pg_get_expr(expr_text,relation_oid) text 反編譯一個表達式的內部形式,假設其中的任何Vars都引用第二個參數指出的關係
pg_get_expr(expr_text,relation_oid, pretty_bool) text 反編譯一個表達式的內部形式,假設其中的任何Vars都引用第二個參數指出的關係
pg_get_userbyid(roleid) name 獲取給出的ID的角色名
pg_get_serial_sequence(table_name,column_name) text 獲取一個serial或者bigserial字段使用的序列名字
pg_tablespace_databases(tablespace_oid) setof oid 獲取在指定表空間(OID表示)中擁有對象的一套數據庫的OID的集合

    這些函數大多數都有兩個變種,其中一個能夠選擇對結果的"漂亮的打印"。 漂亮打印的格式更容易讀,可是缺省的格式更有可能被未來的PostgreSQL版本用一樣的方法解釋;若是是用於轉儲,那麼儘量避免使用漂亮打印。 給漂亮打印參數傳遞false生成的結果和那個沒有這個參數的變種生成的結果徹底同樣。

十3、系統管理函數:

    1. 查詢以及修改運行時配置參數的函數:

名字 返回類型 描述
current_setting(setting_name) text 當前設置的值
set_config(setting_name,new_value,is_local) text 設置參數並返回新值

    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. 數據庫對象尺寸函數:

名字 返回類型 描述
pg_tablespace_size(oid) bigint 指定OID表明的表空間使用的磁盤空間
pg_tablespace_size(name) bigint 指定名字的表空間使用的磁盤空間
pg_database_size(oid) bigint 指定OID表明的數據庫使用的磁盤空間
pg_database_size(name) bigint 指定名稱的數據庫使用的磁盤空間
pg_relation_size(oid) bigint 指定OID表明的表或者索引所使用的磁盤空間
pg_relation_size(text) bigint 指定名稱的表或者索引使用的磁盤空間。這個名字能夠用模式名修飾
pg_total_relation_size(oid) bigint 指定OID表明的表使用的磁盤空間,包括索引和壓縮數據
pg_total_relation_size(text) bigint 指定名字的表所使用的所有磁盤空間,包括索引和壓縮數據。表名字能夠用模式名修飾。
pg_size_pretty(bigint) text 把字節計算的尺寸轉換成一我的類易讀的尺寸單位

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

名字 返回類型 描述
pg_relation_filenode(relation regclass) oid 獲取指定對象的文件節點編號(一般爲對象的oid值)。
pg_relation_filepath(relation regclass) text 獲取指定對象的完整路徑名。

    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)

相關文章
相關標籤/搜索