數據類型html
名字 | 別名 | 描述 |
---|---|---|
bigint |
int8 |
有符號的8字節整數 |
bigserial |
serial8 |
自動增加的8字節整數 |
bit [ ( |
定長位串 | |
bit varying [ ( |
varbit |
變長位串 |
boolean |
bool |
邏輯布爾值(真/假) |
box |
平面上的普通方框 | |
bytea |
二進制數據(「字節數組」) | |
character [ ( |
char [ ( |
定長字符串 |
character varying [ ( |
varchar [ ( |
變長字符串 |
cidr |
IPv4或IPv6網絡地址 | |
circle |
平面上的圓 | |
date |
日曆日期(年、月、日) | |
double precision |
float8 |
雙精度浮點數(8字節) |
inet |
IPv4或IPv6主機地址 | |
integer |
int , int4 |
有符號4字節整數 |
interval [ |
時間段 | |
json |
文本 JSON 數據 | |
jsonb |
二進制 JSON 數據,已分解 | |
line |
平面上的無限長的線 | |
lseg |
平面上的線段 | |
macaddr |
MAC(Media Access Control)地址 | |
macaddr8 |
MAC (Media Access Control) 地址 (EUI-64 格式) | |
money |
貨幣數量 | |
numeric [ ( |
decimal [ ( |
可選擇精度的精確數字 |
path |
平面上的幾何路徑 | |
pg_lsn |
PostgreSQL日誌序列號 | |
point |
平面上的幾何點 | |
polygon |
平面上的封閉幾何路徑 | |
real |
float4 |
單精度浮點數(4字節) |
smallint |
int2 |
有符號2字節整數 |
smallserial |
serial2 |
自動增加的2字節整數 |
serial |
serial4 |
自動增加的4字節整數 |
text |
變長字符串 | |
time [ ( |
一天中的時間(無時區) | |
time [ ( |
timetz |
一天中的時間,包括時區 |
timestamp [ ( |
日期和時間(無時區) | |
timestamp [ ( |
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)