PostgreSQL学习手册 1-5
PostgreSQL学习手册(一) 数据表
|
名字 | 存储空间 | 描述 | 范围 |
smallint | 2 字节 | 小范围整数 | -32768 到 +32767 |
integer | 4 字节 | 常用的整数 | -2147483648 到 +2147483647 |
bigint | 8 字节 | 大范围的整数 | -9223372036854775808 到 9223372036854775807 |
decimal | 变长 | 用户声明精度,精确 | 无限制 |
numeric | real | 变精度,不精确 | 6 位十进制数字精度 |
double | 15 位十进制数字精度 | ||
serial | 自增整数 | 1 到 +2147483647 | |
bigserial | 大范围的自增整数 | 1 到 9223372036854775807 |
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 (
colnameSERIAL
);
等价于
CREATE SEQUENCEtablename_colname_seq;
CREATE TABLE tablename(
colname integer DEFAULTnextval('tablename_colname_seq') NOT NULL
); 这样,我们就创建了一个整数字段并且把它的缺省数值安排为从一个序列发生器取值。应用了一个NOT NULL约束以确保空值不会被插入。在大多数情况下你可能还希望附加一个UNIQUE或者PRIMARY KEY约束避免意外地插入重复的数值,但这个不是自动发生的。因此,如果你希望一个序列字段有一个唯一约束或者一个主键,那么你现在必须声明,就像其它数据类型一样。
还需要另外说明的是,一个serial类型创建的序列在其所属字段被删除时,该序列也将被自动删除,但是其它情况下是不会被删除的。因此,如果你想用同一个序列发生器同时给几个字段提供数据,那么就应该以独立对象的方式创建该序列发生器。
二、字符类型:
下面是PostgreSQL所支持的字符类型的列表和简单说明:
描述 | |
varchar(n) | 变长,有长度限制 |
char(n) | 定长,不足补空白 |
text | 变长,无长度限制 |
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所支持的日期/时间类型的列表和简单说明:
最低值 | 最高值 | 分辨率 | |||||||||
timestamp[无时区] | 8字节 | 包括日期和时间 | 4713 BC | 5874897AD | 1毫秒/14位 | ||||||
timestamp[含时区] | 日期和时间,带时区 | interval | 12字节 | 时间间隔 | -178000000年 | 178000000年 | date | 4字节 | 只用于日期 | 32767AD | 1天 |
time[无时区] | 只用于一日内时间 | 00:00:00 | 24:00:00 | 1毫秒/14位 |
1. 日期/时间输入:
任何日期或者时间的文本输入均需要由单引号包围,就象一个文本字符串一样。
1). 日期:
以下为合法的日期格式列表:
例子 | January 8,1999 | 在任何datestyle输入模式下都无歧义 | |
1999-01-08 | ISO-8601格式,任何方式下都是1999年1月8号,(建议格式) | ||
1/8/1999 | 歧义,在MDY下是1月8号;在 DMY模式下读做8月1日 | ||
1/18/1999 | 在MDY模式下读做1月18日,其它模式下被拒绝 | ||
01/02/03 | MDY模式下的2003年1月2日;DMY模式下的2003年2月1日;YMD 模式下的2001年2月3日 | ||
1999-Jan-08 | 任何模式下都是1月8日 | ||
Jan-08-1999 | 08-Jan-1999 | 99-Jan-08 | 在YMD模式下是1月8日,否则错误 |
08-Jan-99 | 1月8日,除了在YMD模式下是错误的之外 | ||
Jan-08-99 | 19990108 | ISO-8601; 任何模式下都是1999年1月8日 | |
990108 | ISO-8601; 任何模式下都是1999年1月8日 |
2). 时间:
以下为合法的时间格式列表:
04:05:06.789 | ISO 8601 | |||
04:05:06 | 04:05 | 040506 | 04:05 AM | 与04:05一样;AM不影响数值 |
04:05 PM | 与16:05一样;输入小时数必须 <= 12 | |||
04:05:06.789-8 | 04:05:06-08:00 | 04:05-08:00 | 040506-08 | ISO 8601 |
3). 时间戳:
时间戳类型的有效输入由一个日期和时间的联接组成,后面跟着一个可选的时区。因此,1999-01-08 04:05:06和1999-01-08 04:05:06 -8:00都是有效的数值。
2. 示例:
1). 在插入数据之前先查看datestyle系统变量的值:
MyTest=> showdatestyle;
DateStyle
-----------
ISO,YMD
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
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,0)">--datestyle为MDY
INSERT 0 1
MyTest=> SELECT id,0)"> 2 | 2003-01-02
MyTest=> INSERT INTO testtable(id,time_col) VALUES(3,TIME'10:20:00');--插入时间。
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');
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;
(1 row)
MyTest=> SELECT * FROM testtable WHERE a = true;
(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),0)"> -----+-----
101 | 00
100 | 101
(2 rows)
MyTest=> SELECTB'11'::bit(3);
bit
-----
110
(1 row)
六、数组:
1. 数组类型声明:
1). 创建字段含有数组类型的表。
CREATE TABLE sal_emp (
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,14000}
Carol | {21000,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,13000}
Carol | {21000,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
Carol | {31000,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,34000}
Bill | {11000,15000}
(2 rows)
3). 更新数组某一范围的元素:
MyTest=# UPDATE sal_emp SET pay_by_quarter[1:2] = '{37000,37000}' WHERE name = 'Carol';
UPDATE 1
Carol | {37000,37000,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,34000}
Bill | {11000,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 TYPEcomplexAS(
r double,
i double
);
CREATE TYPEinventory_itemAS(
name text,
supplier_id integer,
price numeric
);
和声明一个数据表相比,声明类型时需要加AS关键字,同时在声明TYPE时不能定义任何约束。下面我们看一下如何在表中指定复合类型的字段,如:
CREATE TABLE on_hand (
iteminventory_item,
count integer
);
最后需要指出的是,在创建表的时候,PostgreSQL也会自动创建一个与该表对应的复合类型,名字与表字相同,即表示该表的复合类型。
2. 复合类型值输入:
我们可以使用文本常量的方式表示复合类型值,即在圆括号里包围字段值并且用逗号分隔它们。你也可以将任何字段值用双引号括起,如果值本身包含逗号或者圆括号,那么就用双引号括起,对于上面的inventory_item复合类型的输入如下:
'("fuzzy dice",42,1.99)'
如果希望类型中的某个字段为NULL,只需在其对应的位置不予输入即可,如下面的输入中price字段的值为NULL,
'("fuzzy dice",)'
如果只是需要一个空字串,而非NULL,写一对双引号,如:
'("",0)"> 在更多的场合中PostgreSQL推荐使用ROW表达式来构建复合类型值,使用该种方式相对简单,无需考虑更多标识字符问题,如:
ROW('fuzzy dice',1.99)
ROW('',NULL)
注:对于ROW表达式,如果里面的字段数量超过1个,那么关键字ROW就可以省略,因此以上形式可以简化为:
('fuzzy dice',1.99)
('',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",1.99));
--在更新操作中,也是可以通过ROW表达式来完成。
UPDATE on_hand SET item = ROW("fuzzy dice",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语句,如:
aBETWEENxANDy等效于a >= xANDa <= y
aNOT BETWEENxANDy等效于a < xORa > y
三、 数学函数和操作符:
下面是PostgreSQL中提供的数学操作符列表:
描述 | 例子 | 结果 | ||||||
+ | 加 | 2 + 3 | 5 | |||||
- | 减 | 2 - 3 | -1 | |||||
* | 乘 | 2 * 3 | 6 | |||||
/ | 除 | 4 / 2 | 2 | |||||
% | 模 | 5 % 4 | 1 | |||||
^ | 幂 | 2.0 ^ 3.0 | 8 | |||||
|/ | 平方根 | |/ 25.0 | ||/ | 立方根 | ||/ 27.0 | 3 | ||
! | 阶乘 | 5 ! | 120 | |||||
!! | !! 5 | @ | 绝对值 | @ -5.0 | & | 按位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) | 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) | log(b numeric,x numeric) | numeric指定底数的对数 | log(2.0,64.0) | 6.0000000000 | ||
mod(y,x) | 取余数 | mod(9,4) | pi() |
"π"常量 | 3.14159265358979 | |||
power(a double,b double) | 求a的b次幂 | power(9.0,3.0) | 729 | |||||
power(a numeric,b numeric) | radians(double) | 把角度转为弧度 | radians(45.0) | 0.785398163397448 | ||||
random() | 0.0到1.0之间的随机数值 | random() | ||||||
round(double/numeric) | 圆整为最接近的整数 | round(42.4) | 42 | |||||
round(v numeric,s int) | 圆整为s位小数数字 | round(42.438,2) | 42.44 | |||||
sign(double/numeric) | 参数的符号(-1,+1) |
sign(-8.4) | sqrt(double/numeric) | sqrt(2.0) | 1.4142135623731 | |||
trunc(double/numeric) | 截断(向零靠近) | trunc(42.8) | trunc(v numeric,255); font-size:13px">截断为s小数位置的数字 | trunc(42.438,255); font-size:13px">42.43 |
三角函数列表:
函数 | acos(x) | 反余弦 |
asin(x) | 反正弦 | |
atan(x) | 反正切 | |
atan2(x,y) | 正切 y/x 的反函数 | |
cos(x) | 余弦 | |
cot(x) | 余切 | |
sin(x) | 正弦 | |
tan(x) | 正切 |
四、字符串函数和操作符:
下面是PostgreSQL中提供的字符串操作符列表:
函数 | 返回类型 | 描述 | 例子 | 结果 | ||
string || string | text | 字串连接 | 'Post' || 'greSQL' | PostgreSQL | ||
bit_length(string) | int | 字串里二进制位的个数 | bit_length('jose') | 32 | ||
char_length(string) | 字串中的字符个数 | char_length('jose') | 4 | |||
convert(string using conversion_name) | 使用指定的转换名字改变编码。 | convert('PostgreSQL' using iso_8859_1_to_utf8) | 'PostgreSQL' | |||
lower(string) | 把字串转化为小写 | lower('TOM') | tom | |||
octet_length(string) | 字串中的字节数 | octet_length('jose') | overlay(string placing string from int [for int]) | 替换子字串 | overlay('Txxxxas' placing 'hom' from 2 for 4) | Thomas |
position(substring in string) | 指定的子字串的位置 | position('om' in 'Thomas') | 3 | |||
substring(string [from int] [for int]) | 抽取子字串 | substring('Thomas' from 2 for 3) | hom | |||
substring(string from pattern) | 抽取匹配 POSIX 正则表达式的子字串 | substring('Thomas' from '...$') | mas | |||
substring(string from pattern for escape) | 抽取匹配SQL正则表达式的子字串 | substring('Thomas' from '%#"o_a#"_' for '#') | oma | |||
trim([leading | trailing | both] [characters] from string) | 从字串string的开头/结尾/两边/ 删除只包含characters(缺省是一个空白)的最长的字串 | trim(both 'x' from 'xTomxx') | Tom | |||
upper(string) | 把字串转化为大写。 | upper('tom') | TOM | |||
ascii(text) | 参数第一个字符的ASCII码 | ascii('x') | 120 | |||
btrim(string text [,characters text]) | 从string开头和结尾删除只包含在characters里(缺省是空白)的字符的最长字串 | btrim('xyxtrimyyx','xy') | trim | |||
chr(int) | 给出ASCII码的字符 | chr(65) | A | |||
convert(string text,[src_encoding name,] dest_encoding name) | 把字串转换为dest_encoding | convert( 'text_in_utf8','UTF8','LATIN1') | 以ISO 8859-1编码表示的text_in_utf8 | |||
initcap(text) | 把每个单词的第一个子母转为大写,其它的保留小写。单词是一系列字母数字组成的字符,用非字母数字分隔。 | initcap('hi thomas') | Hi Thomas | |||
length(string text) | string中字符的数目 | length('jose') | lpad(string text,length int [,fill text]) | 通过填充字符fill(缺省时为空白),把string填充为长度length。 如果string已经比length长则将其截断(在右边)。 | lpad('hi',5,255)">xyxhi | |
ltrim(string text [,255)">从字串string的开头删除只包含characters(缺省是一个空白)的最长的字串。 | ltrim('zzzytrim','xyz') | md5(string text) | 计算给出string的MD5散列,以十六进制返回结果。 | md5('abc') | ||
repeat(string text,number int) | 重复string number次。 | repeat('Pg',255)">PgPgPgPg | ||||
replace(string text,from text,to text) | 把字串string里出现地所有子字串from替换成子字串to。 | replace('abcdefabcdef','cd','XX') | abXXefabXXef | |||
rpad(string text,255)">通过填充字符fill(缺省时为空白),把string填充为长度length。如果string已经比length长则将其截断。 | rpad('hi',255)">hixyx | |||||
rtrim(string text [,character text]) | 从字串string的结尾删除只包含character(缺省是个空白)的最长的字 | rtrim('trimxxxx','x') | split_part(string text,delimiter text,field int) | 根据delimiter分隔string返回生成的第field个子字串(1 Base)。 | split_part('abc~@~def~@~ghi','~@~',255)">def | |
strpos(string,substring) | 声明的子字串的位置。 | strpos('high','ig') | 2 | |||
substr(string,from [,count]) | 抽取子字串。 | substr('alphabet',3,255)">ph | ||||
to_ascii(text [,encoding]) | 把text从其它编码转换为ASCII。 | to_ascii('Karel') | Karel | |||
to_hex(number int/bigint) | 把number转换成其对应地十六进制表现形式。 | to_hex(9223372036854775807) | 7fffffffffffffff | |||
translate(string text,255)">把在string中包含的任何匹配from中的字符的字符转化为对应的在to中的字符。 | translate('12345','14','ax') | a23x5 |
五、位串函数和操作符:
对于类型bit和bit varying,除了常用的比较操作符之外,还可以使用以下列表中由PostgreSQL提供的位串函数和操作符,其中&、|和#的位串操作数必须等长。在移位的时候,保留原始的位串的的长度。
操作符 | 描述 | 例子 | 结果 |
|| | 连接 | B'10001' || B'011' | 10001011 |
B'10001' & B'01101' | 00001 | ||
B'10001' | B'01101' | 11101 | ||
B'10001' # B'01101' | 11100 | ||
~ 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
--------------
222221010100
(1 row)
MyTest=# SELECT '1110'::bit(4)::integer;
int4
------
14
(1 row)
注意:如果只是转换为"bit",意思是转换成bit(1),因此只会转换成整数的最低位。
六、模式匹配:
PostgreSQL中提供了三种实现模式匹配的方法:SQL LIKE操作符,更近一些的SIMILAR TO操作符,和POSIX-风格正则表达式。
1. LIKE:
stringLIKEpattern [ESCAPEescape-character ]
stringNOT LIKEpattern [ESCAPEescape-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根据模式是否匹配给定的字符串而返回真或者假。
stringSIMILAR TOpattern [ESCAPEescape-character]
stringNOT SIMILAR TOpattern [ESCAPEescape-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)转换成格式化的字符串以及反过来从格式化的字符串转换成指定的数据类型。下面列出了这些函数,它们都遵循一个公共的调用习 惯:第一个参数是待格式化的值,而第二个是定义输出或输出格式的模板。
函数 | 返回类型 | 描述 | 例子 | |
to_char(timestamp,text) | text | 把时间戳转换成字串 | to_char(current_timestamp,'HH12:MI:SS') | |
to_char(interval,255); font-size:14px">把时间间隔转为字串 | to_char(interval '15h 2m 12s','HH24:MI:SS') | |||
to_char(int,255); font-size:14px">把整数转换成字串 | to_char(125,'999') | |||
to_char(double precision,255); font-size:14px">把实数/双精度数转换成字串 | to_char(125.8::real,'999D9') | |||
to_char(numeric,255); font-size:14px">把numeric转换成字串 | to_char(-125.8,'999D99S') | |||
to_date(text,255); font-size:14px">date | 把字串转换成日期 | to_date('05 Dec 2000','DD Mon YYYY') | ||
to_timestamp(text,255); font-size:14px">timestamp | 把字串转换成时间戳 | to_timestamp('05 Dec 2000',255); font-size:14px">to_timestamp(double) | 把UNIX纪元转换成时间戳 | to_timestamp(200120400) |
to_number(text,255); font-size:14px">numeric | 把字串转换成numeric | to_number('12,454.8-','99G999D9S') |
1. 用于日期/时间格式化的模式:
模式 | 描述 | |
HH | 一天的小时数(01-12) | |
HH12 | 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 | 货币符号 |
G | 分组分隔符 |
在指明的位置的负号(如果数字 < 0) | |
PL | 在指明的位置的正号(如果数字 > 0) |
SG | 在指明的位置的正/负号 |
八、时间/日期函数和操作符:
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) | 减去参数,生成一个使用年、月的"符号化"的结果 | age('2001-04-10',timestamp '1957-06-13') | 43 years 9 mons 27 days | |||
age(timestamp) | 从current_date减去得到的数值 | age(timestamp '1957-06-13') | 43 years 8 mons 3 days | |||||
current_date | 今天的日期 | |||||||
current_time | time | 现在的时间 | ||||||
current_timestamp | timestamp | 日期和时间 | ||||||
date_part(text,255); font-size:13px">获取子域(等效于extract) | date_part('hour',timestamp '2001-02-16 20:38:40') | date_part('month',interval '2 years 3 months') | date_trunc(text,255); font-size:13px">截断成指定的精度 | date_trunc('hour',255); font-size:13px">2001-02-16 20:00:00+00 | ||||
extract(field from timestamp) | 获取子域 | extract(hour from timestamp '2001-02-16 20:38:40') | extract(field from interval) | extract(month from interval '2 years 3 months') | localtime | 今日的时间 | ||
localtimestamp | now() | 当前的日期和时间(等效于 current_timestamp) | ||||||
timeofday() | 当前日期和时间 |
3. EXTRACT,date_part函数支持的field:
域 | CENTURY | 世纪 | EXTRACT(CENTURY FROM TIMESTAMP '2000-12-16 12:21:13'); | DAY | (月分)里的日期域(1-31) | EXTRACT(DAY from TIMESTAMP '2001-02-16 20:38:40'); | 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'); | 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'); | MICROSECONDS | 秒域,包括小数部分,乘以 1,000,000。 | EXTRACT(MICROSECONDS from TIME '17:12:28.5'); | 28500000 | ||||
MILLENNIUM | 千年 | EXTRACT(MILLENNIUM from TIMESTAMP '2001-02-16 20:38:40'); | 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'); | QUARTER | 该天所在的该年的季度(1-4)(仅用于 timestamp) | EXTRACT(QUARTER from TIMESTAMP '2001-02-16 20:38:40'); | 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)
九、序列操作函数:
序列对象(也叫序列生成器)都是用CREATE SEQUENCE创建的特殊的单行表。一个序列对象通常用于为行或者表生成唯一的标识符。下面序列函数,为我们从序列对象中获取最新的序列值提供了简单和并发读取安全的方法。
函数 | 返回类型 | 描述 |
nextval(regclass) | bigint | 递增序列对象到它的下一个数值并且返回该值。这个动作是自动完成的。即使多个会话并发运行nextval,每个进程也会安全地收到一个唯一的序列值。 |
currval(regclass) | 在当前会话中返回最近一次nextval抓到的该序列的数值。(如果在本会话中从未在该序列上调用过nextval,那么会报告一个错误。)请注意因为此函数返回一个会话范围的数值,而且也能给出一个可预计的结果,因此可以用于判断其它会话是否执行过nextval。 | |
lastval() | 返回当前会话里最近一次nextval返回的数值。这个函数等效于currval,只是它不用序列名为参数,它抓取当前会话里面最近一次nextval使用的序列。如果当前会话还没有调用过nextval,那么调用lastval将会报错。 | |
setval(regclass,bigint) | 重置序列对象的计数器数值。设置序列的last_value字段为指定数值并且将其is_called字段设置为true,表示下一次nextval将在返回数值之前递增该序列。 | |
重置序列对象的计数器数值。功能等同于上面的setval函数,只是is_called可以设置为true或false。如果将其设置为false,那么下一次nextval将返回该数值,随后的nextval才开始递增该序列。 |
对于regclass参数,仅需用单引号括住序列名即可,因此它看上去就像文本常量。为了达到和处理普通SQL对象一样的兼容性,这个字串将被转换成小写,除非该序列名是用双引号括起,如:
nextval('foo')--操作序列号foo
nextval('FOO') nextval('"Foo"')--操作序列号Foo
SELECT setval('foo',42);--下次nextval将返回43
--下次nextval将返回42
十、条件表达式:
1. CASE:
SQL CASE表达式是一种通用的条件表达式,类似于其它语言中的if/else语句。
CASE WHENconditionTHENresult
[WHEN ...]
[ELSEresult]
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,5);
greatest
----------
5
(1 row)
MyTest=> SELECT LEAST(1,NULL);
least
-------
1
(1 row)
十一、数组函数和操作符:
1. PostgreSQL中提供的用于数组的操作符列表:
等于 | ARRAY[1.1,2.1,3.1]::int[] = ARRAY[1,2,3] | t | ||||||
<> | 不等于 | ARRAY[1,3] <> ARRAY[1,4] | 小于 | 大于 | 小于或等于 | 大于或等于 | 数组与数组连接 | {1,6} |
{{1,3},{4,6},{7,9}} | ||||||||
元素与数组连接 | 3 || ARRAY[4,255); font-size:13px">{3,255); font-size:13px">ARRAY[4,6] || 7 | {4,6,7} |
2. PostgreSQL中提供的用于数组的函数列表:
array_cat(anyarray,anyarray) | anyarray | 连接两个数组 | array_cat(ARRAY[1,3],ARRAY[4,5]) | {1,5} | |||||
array_append(anyarray,anyelement) | 向一个数组末尾附加一个元素 | array_append(ARRAY[1,2],3) | array_prepend(anyelement,255)">向一个数组开头附加一个元素 | array_prepend(1,ARRAY[2,3]) | array_dims(anyarray) | 返回一个数组维数的文本表示 | array_dims(ARRAY[[1,[4,6]]) | [1:2][1:3] | |
array_lower(anyarray,int) | 返回指定的数组维数的下界 | array_lower(array_prepend(0,ARRAY[1,3]),1) | 0 | ||||||
array_upper(anyarray,255)">返回指定数组维数的上界 | array_upper(ARRAY[1,4],255)">array_to_string(anyarray,255)">使用提供的分隔符连接数组元素 | array_to_string(ARRAY[1,'~^~') | 1~^~2~^~3 | ||||||
string_to_array(text,255)">text[] | 使用指定的分隔符把字串拆分成数组元素 | string_to_array('xx~^~yy~^~zz',255)">{xx,yy,zz} |
十二、系统信息函数:
1. PostgreSQL中提供的和数据库相关的函数列表:
名字 | 描述 | |
current_database() | name | 当前数据库的名字 |
current_schema() | 当前模式的名字 | |
current_schemas(boolean) | name[] | 在搜索路径中的模式名字 |
current_user | 目前执行环境下的用户名 | |
inet_client_addr() | inet | 连接的远端地址 |
inet_client_port() | int | 连接的远端端口 |
inet_server_addr() | 连接的本地地址 | |
inet_server_port() | 连接的本地端口 | |
session_user | 会话用户名 | |
pg_postmaster_start_time() | postmaster启动的时间 | |
user | current_user | |
version() | PostgreSQL版本信息 |
2. 允许用户在程序里查询对象访问权限的函数:
名字 | 描述 | 可用权限 |
has_table_privilege(user,table,privilege) | 用户是否有访问表的权限 | SELECT/INSERT/UPDATE/DELETE/RULE/REFERENCES/TRIGGER |
has_table_privilege(table,255)">当前用户是否有访问表的权限 | has_database_privilege(user,database,255)">用户是否有访问数据库的权限 | CREATE/TEMPORARY |
has_database_privilege(database,255)">当前用户是否有访问数据库的权限 | has_function_privilege(user,function,255)">用户是否有访问函数的权限 | EXECUTE |
has_function_privilege(function,255)">当前用户是否有访问函数的权限 | has_language_privilege(user,language,255)">用户是否有访问语言的权限 | USAGE |
has_language_privilege(language,255)">当前用户是否有访问语言的权限 | has_schema_privilege(user,schema,255)">用户是否有访问模式的权限 | CREAT/USAGE |
has_schema_privilege(schema,255)">当前用户是否有访问模式的权限 | has_tablespace_privilege(user,tablespace,255)">用户是否有访问表空间的权限 | CREATE |
has_tablespace_privilege(tablespace,255)">当前用户是否有访问表空间的权限 | 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) | 该操作符表是否在搜索路径中可见 | pg_conversion_is_visible(conversion_oid) | 转换是否在搜索路径中可见 | regoperator |
注:以上函数均返回boolean类型,所有这些函数都需要对象 OID 标识作为检查的对象。
postgres=# SELECTpg_table_is_visible('testtable'::regclass);
pg_table_is_visible
---------------------
t
(1 row)
4. 系统表信息函数:
format_type(type_oid,typemod) | 获取一个数据类型的SQL名称 | |
pg_get_viewdef(view_oid) | 为视图获取CREATE VIEW命令 | |
pg_get_viewdef(view_oid,pretty_bool) | pg_get_ruledef(rule_oid) | 为规则获取CREATE RULE命令 |
pg_get_ruledef(rule_oid,255); font-size:13px">pg_get_indexdef(index_oid) | 为索引获取CREATE INDEX命令 | |
pg_get_indexdef(index_oid,column_no,255); font-size:13px">为索引获取CREATE INDEX命令, 如果column_no不为零,则是只获取一个索引字段的定义 | ||
pg_get_triggerdef(trigger_oid) | 为触发器获取CREATE [CONSTRAINT] TRIGGER | |
pg_get_constraintdef(constraint_oid) | 获取一个约束的定义 | |
pg_get_constraintdef(constraint_oid,255); font-size:13px">pg_get_expr(expr_text,relation_oid) | 反编译一个表达式的内部形式,假设其中的任何Vars都引用第二个参数指出的关系 | |
pg_get_userbyid(roleid) | 获取给出的ID的角色名 | |
pg_get_serial_sequence(table_name,column_name) | 获取一个serial或者bigserial字段使用的序列名字 | |
pg_tablespace_databases(tablespace_oid) | setof oid | 获取在指定表空间(OID表示)中拥有对象的一套数据库的OID的集合 |
这些函数大多数都有两个变种,其中一个可以选择对结果的"漂亮的打印"。 漂亮打印的格式更容易读,但是缺省的格式更有可能被将来的PostgreSQL版本用同样的方法解释;如果是用于转储,那么尽可能避免使用漂亮打印。 给漂亮打印参数传递false生成的结果和那个没有这个参数的变种生成的结果完全一样。
十三、系统管理函数:
1. 查询以及修改运行时配置参数的函数:
current_setting(setting_name) | 当前设置的值 |
set_config(setting_name,new_value,is_local) | 设置参数并返回新值 |
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) | 指定OID代表的表空间使用的磁盘空间 |
pg_tablespace_size(name) | 指定名字的表空间使用的磁盘空间 |
pg_database_size(oid) | 指定OID代表的数据库使用的磁盘空间 |
pg_database_size(name) | 指定名称的数据库使用的磁盘空间 |
pg_relation_size(oid) | 指定OID代表的表或者索引所使用的磁盘空间 |
pg_relation_size(text) | 指定名称的表或者索引使用的磁盘空间。这个名字可以用模式名修饰 |
pg_total_relation_size(oid) | 指定OID代表的表使用的磁盘空间,包括索引和压缩数据 |
pg_total_relation_size(text) | 指定名字的表所使用的全部磁盘空间,包括索引和压缩数据。表名字可以用模式名修饰。 |
pg_size_pretty(bigint) | 把字节计算的尺寸转换成一个人类易读的尺寸单位 |
3. 数据库对象位置函数:
pg_relation_filenode(relationregclass) | oid | 获取指定对象的文件节点编号(通常为对象的oid值)。 |
pg_relation_filepath(relationregclass) | 获取指定对象的完整路径名。 |
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)
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!