PostgreSQL11 | postgresql函数

上一期总结了有关pgsql的数据类型和运算符,这篇文章总结原书第六章pgsql的相关函数。

PostgreSql函数

postgresql提供了众多功能强大、方便易用的函数。使用这些函数,可以极大地提高用户对数据库的管理。pgsql中的函数包括数学函数、字符串函数、日期和时间函数。

函数表示对输入参数值返回一个具有特定关系的值,postgresql提供了大量丰富的函数,在进行数据库管理以及数据的查询和操作时将会经常用到各种函数。通过对数据的处理,数据库的功能将会更加强大,可以更加灵活的满足不同客户的需要。

目录

PostgreSql函数

数学函数

1.绝对值函数ABS(x)和返回圆周率的函数PI()

2.平方根函数SQRT(x)和求余函数MOD(x,y)

3.获取整数的函数CEIL(x)、CEILING(x)和FLOOR(x)

4.四舍五入函数ROUND(x)和ROUND(x,y)

5.符号函数SIGN(x)

6.幂运算函数POW(x,y)、POWER(x,y)和EXP(x)

7.对数运算函数LOG(x)

8.角度与弧度相互转换的函数RADIANS(x)和DEGREES(x)

9.正弦函数SIN(x)和反正弦函数ASIN(x)

10.余弦函数COS(x)和反余弦函数ACOS(x)

11.正切函数TAN(x)、反正切函数ATAN(x)和余弦函数COT(x)

字符串函数

1.计算字符串字符数的函数CHAR_LENGTH(str)和字符串长度的函数LENGTH(str)

2.合并字符串函数CONCAT(s1,s2,...)、CONCAT_WS(x,s1,s2,...)

4.填充字符串的函数LPAD(s1,len,s2)和RPAD(s1,len,s2)

5.删除空格的函数LTRIM(s)、RTRIM(s)和TRIM(s)

6. 删除指定字符串的函数TRIM(s1 FROM s)

7.重复生成字符串的函数REPEAT(s,n)

8.替换函数REPLACE(s,s1,s2)

9.获取子串的函数SUBSTRING(s,n.len)

10.匹配子串开始位置的函数POSITION(str1 IN str)

11.字符串逆序的函数REVERSE(s)

日期和时间函数

1.获取当前日期的函数和获取当前时间的函数

2. 获取当前时间和日期的函数

3.获取日期的指定值的函数EXTRACT(type FROM d)

4.日期和时间的运算操作

条件判断函数

1.CASE expr WHEN v1 THEN r1 [WHEN v2 THEN r2] [ELSE rn] END

2. CASE WHEN v1 THEN r1 [WHEN v2 THEN v2] ELSE rn END

系统信息函数

1.获取PostgreSql版本号

2.获取用户名的函数

加密函数

1.加密函数MD5(str)

2.加密函数ENCODE(str,pswd_str)

3.解密函数DECODE(crypt_str,pswd_str)

改变数据类型的函数

综合案例——PostgreSql函数的使用

附录·

加密类型

1.Base64

2.Hex

3.Escape


数学函数

数学函数主要用来处理数值数据,主要的数学函数有绝对值函数、三角函数(包括正弦函数、余弦函数、正切函数、余切函数等)、对数函数、随机数函数等。在有错误产生时,数学函数都将会返回空值NULL。

1.绝对值函数ABS(x)和返回圆周率的函数PI()

ABS(x)

ABS(x)返回x的绝对值。

例:求2、-3.3和-33的绝对值,sql语句如下

select abs(2),abs(-3.3),abs(-33);

 正数的绝对值为其本身,负数的绝对值为其相反数

PI()

PI()返回圆周率π的值,默认显示小数后6位

例:返回圆周率,输入语句如下

select pi();

2.平方根函数SQRT(x)和求余函数MOD(x,y)

SQRT(x)

SQRT(x)返回非负数x的二次方根

例:求9、40的二次方根,输入语句如下

select sqrt(9),sqrt(40);

取二次方根的时候不可以对负数求根,否则将会出现错误信息

MOD(x,y)

MOD(x,y)返回x被y除后的余数。MOD()对于带有小数部分的数值也起作用,返回除法运算后的精确余数。

例:对(31,8)、(234,10)、(45.5,6)进行求余运算,输入语句如下

select MOD(31,8),MOD(234,10),MOD(45.5,6);

3.获取整数的函数CEIL(x)、CEILING(x)和FLOOR(x)

CEIL(x)和CEILING(x)

CEIL(x)和CEILING(x)的意义相同,返回不小于x的最小整数值,返回值转化为一个BIGINT

例:使用CEIL和CEILING函数返回最小整数,输入语法如下

select ceil(-16.2),ceil(16.2),ceil(-16),ceil(16);
select ceiling(-16.2),ceiling(16.2),ceiling(-16),ceiling(16);

FLOOR(x)

FLOOR(x)返回不大于x的最大整数值,返回值转化为一个

例:使用FLOOR函数返回最大整数,输入语句如下

select floor(-3.35),floor(3.35);

4.四舍五入函数ROUND(x)和ROUND(x,y)

ROUND(x)

ROUND(x)返回值更接近于参数x的整数,对x值进行四舍五入

例:使用ROUND(x)函数对操作数进行四舍五入操作,输入语句如下

select round(-1.14),round(-1.67),round(1.14),round(1.66);

而对于四舍五入的临界值如下

select round(2.49),round(2.50),round(2.51),round(-2.49),round(-2.50),round(-2.51);

ROUND(x,y)

ROUND(x,y)返回最接近于参数x的数,其结果保留到小数点后y位,若y为负值,则将保留x值到小数点左边y位

例:使用ROUND(x,y)函数对操作数进行四舍五入操作,结果保留小数点后面指定y位,输入语句如下

select round(1.38,1),round(1.38,0),round(232.38,-1),round(232.38,-2);

对于其四舍五入的临界值如下

select round(2.449,1),round(2.500,1),round(2.501,1),round(-2.449,1),round(-2.500,1),round(-2.501,1);

5.符号函数SIGN(x)

SIGN(x)返回参数的符号,x的值为 负、零或正 时返回结果依次为-1、0或1

例:使用SIGN函数返回参数的符号,输入语句如下

select sign(-21),sign(0),sign(21);

6.幂运算函数POW(x,y)、POWER(x,y)和EXP(x)

POW(x,y)和POWER(x,y)

POW(x,y)和POWER(x,y)意义一样,返回x的y次乘方运算,输入语句如下

select pow(2,2),power(2,2),pow(2,-2),power(2,-2);

EXP(x)

EXP(x)返回e的x乘方后的值

例:使用EXP函数计算e的乘方,输入语句如下

select exp(3),exp(-3),exp(0);

7.对数运算函数LOG(x)

LOG(x)

LOG(x)返回x的自然对数,x相对于基数e的对数。对数定义域不能为负数和零,因此数组为负数和零时将会弹出错误信息

例:使用LOG(x)函数计算自然对数,输入语句如下

select log(3);

8.角度与弧度相互转换的函数RADIANS(x)和DEGREES(x)

RADIANS(x)

RADIANS(x)将参数x由角度转化为弧度

例:使用RADIANS将角度转化为弧度,输入语句如下

select radians(90),radians(180);

DEGREES(x)

DEGREES(x)将参数x由弧度转化为角度

例:使用DEGREES将弧度转化为角度,输入语句如下

select degrees(pi()),degrees(pi()/2);

9.正弦函数SIN(x)和反正弦函数ASIN(x)

SIN(x)

SIN(x)返回x正弦,其中x为弧度值

例:使用SIN函数计算正弦值,输入语句如下

select sin(1),round(sin(pi()));
round:四舍五入函数

ASIN(x)

ASIN(x)返回x的反正弦,即正弦为x的值。若x不在-1到1的范围内,则会弹出错误信息“输入超出范围”

例:使用ASIN函数计算反正弦值,输入语句如下

select asin(0.841470984807897);

10.余弦函数COS(x)和反余弦函数ACOS(x)

COS(x)

COS(x)返回x的余弦,其中x为弧度值

例:使用COS函数计算余弦值,输入语句如下

select cos(0),cos(pi()),cos(1);

ACOS(x)

ACOS(x)返回x的反余弦值,即余弦是x的值。若x不在-1到1的范围之内,则会弹出错误信息

例:使用ACOS计算反余弦值,输入语句如下

select acos(1),acos(0),round(acos(0.54030230586814));

11.正切函数TAN(x)、反正切函数ATAN(x)和余弦函数COT(x)

TAN(x)

TAN(x)返回x的正切值,其中x为给定的弧度值

例:使用TAN函数计算正切值,输入语句如下

select tan(0.3),round(tan(pi()/4));

ATAN(x)

ATAN(x)返回x的反正切值,即正切为x的值

例:使用ATAN函数计算反正切值,输入语句如下

select atan(0.309336249609623),atan(1);

COT(x)

COT(x)返回x的余切值

例:使用COT函数计算余切值,输入语句如下

select cot(0.3),1/tan(0.3),cot(pi()/4);

字符串函数

字符串函数主要用来处理数据库中的字符串数据。Postgresql中的字符串函数有计算字符串长度函数、字符串合并函数、字符串替换函数、字符串比较函数、查找指定字符串位置函数等。

1.计算字符串字符数的函数CHAR_LENGTH(str)和字符串长度的函数LENGTH(str)

CHAR_LENGTH(str)

CHAR_LENGTH(str)返回值为字符串str所包含的字符个数。一个多字节字符算作一个单字符。

例:使用CHAR_LENGTH函数计算字符串字符个数,输入语句如下

select char_length('red_star'),char_length('红星');

LENGTH(str)

LENGTH(str)返回值为字符串的字符长度,使用【utf8】编码字符集时,一个汉字算一个字符,一个数字或字母算一个字符【字符≠字节,本文对该部分于2024-03-16进行修正,感谢CSDN用户“杰豪”】

例:使用LENGTH函数计算字符串长度,输入语句如下

select length('red_star'),length('红星');

2.合并字符串函数CONCAT(s1,s2,...)、CONCAT_WS(x,s1,s2,...)

CONCAT(s1,s2,...)

CONCAT(s1,s2,...)的返回结果为连接参数产生的字符串。若有任何一个参数为NULL,则返回值为NULL。如果所有参数均为非二进制字符串,则结果为非二进制字符串。如果自变量中含有任一二进制字符串,则结果为一个二进制字符串。

例:使用CONCAT函数连接字符串,输入语句如下

select concat('postgresql','10.7'),concat('hongxing',null,'code_laboratory');

CONCAT_WS(x,s1,s2,...)

CONCAT_WS(x,s1,s2,...)中,CONCAT_WS代表CONCAT With Separator,是CONCAT()的特殊形式。第一个参数x是其他参数的分隔符。分隔符的位置放在要连接的两个字符串之间

例:使用CONCAT_WS函数连接带分隔符的字符串,输入语句如下

select concat_ws('-','postgresql','10.7'),concat_ws('*','hongxing',null,'code','laboratory');

3.获取指定长度的字符串的函数LEFT(s,n)和RIGTHT(s,n)

LEFT(s,n)

LEFT(s,n)返回字符串s最左边的n个字符。

例:使用LEFT函数返回字符串中左边的字符,输入语句如下

select left('redstar_code_laboratory','5');

RIGTHT(s,n)

RIGTHT(s,n)返回字符串s最右边的n个字符

例:使用RIGTHT函数返回字符串中右边的字符,输入语句如下

select right('redstar_code_laboratory','5');

4.填充字符串的函数LPAD(s1,len,s2)和RPAD(s1,len,s2)

LPAD(s1,len,s2)

LPAD(s1,len,s2)返回字符串s1,其左边由字符串s2填充,填充长度为len。假如s1的长度大于len,则返回值被缩短至len字符。

例:使用LPAD函数对字符串进行填充操作,输入语句如下

select lpad('hello',4,'??'),lpad('hello',10,'??');

RPAD(s1,len,s2)

RPAD(s1,len,s2)返回字符串s1,其右边由字符串s2填充,填充长度为len。假如s1的长度大于len,则返回值被缩短至len字符。

例:使用RPAD函数对字符串进行填充操作,输入语句如下

select rpad('hello',4,'??'),rpad('hello',10,'??');

5.删除空格的函数LTRIM(s)、RTRIM(s)和TRIM(s)

LTRIM(s)

LTRIM(s)返回字符串s,字符串左侧空格字符被删除。

例:使用LTRIM函数删除字符串左边的空格,输入语句如下

select '(  book  )',concat('(',ltrim('  book  '),')');

RTRIM(s)

RTRIM(s)返回字符串s,字符串右侧空格字符被删除。

例:使用RTRIM函数删除字符串右边的空格,输入语句如下

select '(  book  )',concat('(',rtrim('  book  '),')');

TRIM(s)

TRIM(s)删除字符串s两侧的空格。

例:使用TRIM函数删除指定字符串两端的空格,输入语句如下

select '(  book  )',concat('(',trim('  book  '),')');

6. 删除指定字符串的函数TRIM(s1 FROM s)

TRIM(s1 FROM s)删除字符串s中的两端所有的子字符串s1。s1为可选项,在未指定情况下,删除空格。

例:使用TRIM(s1 FROM s)函数删除指定字符串两端的空格,输入语句如下

select trim('xy' from 'xydocxytyxy');

7.重复生成字符串的函数REPEAT(s,n)

REPEAT(s,n)返回一个由重复的字符串s组成的字符串,n表示重复生成的次数。若n<=0,则返回一个空字符串;若s或n为NULL,则返回NULL。

例:使用REPEAT函数重复生成相同的字符串,输入语句如下

select repeat('Redstar',3);

8.替换函数REPLACE(s,s1,s2)

REPLACE(s,s1,s2)使用字符串s2替代字符串s中所有的字符串s1.

例:使用REPLACE函数进行字符串替代操作,输入语句如下

select replace('xxx.postgresql.com','x','w');

9.获取子串的函数SUBSTRING(s,n.len)

SUBSTRING(s,n.len)表示从字符串s返回一个长度为len的子字符串,起始于位置n。也可能对n使用一个负值,假若这样,则子字符串的位置起始于字符串结尾的n字符,即倒数第n个字符。

例:使用SUBSTRING函数获取指定位置处的子字符串,输入语句如下

select substring('breakfast',5) as col1,
substring('breakfast',5,3) as col2,
substring('lunch',-3) as col3;

10.匹配子串开始位置的函数POSITION(str1 IN str)

POSITION(str1 IN str)函数的作用是返回子字符串str1在字符串str中的开始位置

例:使用POSITION函数查找字符串中指定子字符串的开始位置,输入语句如下

select position('star' in 'Redstar');

11.字符串逆序的函数REVERSE(s)

REVERSE(s)将字符串s反转,返回的字符串顺序和s字符串顺序相反

例:使用REVERSE函数反转字符串,输入语句如下

select reverse('Redstar');

日期和时间函数

日期和时间函数主要用来处理日期和时间值,一般的日期函数除了使用DATE类型的参数外,也可以使用DATETIME或者TIMESTAMP类型的参数,但会忽略这些值的时间部分。相同的,以TIME类型值为参数的函数,可以接受TIMESTAMP类型的参数,但会忽略日期部分。

1.获取当前日期的函数和获取当前时间的函数

CURRENT_DATE 获取当前日期

CURRENT_DATE函数的作用是将当前日期按照‘YYYY-MM-DD’格式的值返回,具体格式根据函数用在字符串或是数字语境中而定。

例:使用CURRENT_DATE函数获取系统当前日期,输入语句如下

select current_date;

CURRENT_TIME 获取当前时间(带时区)

CURRENT_TIME函数的作用是将当前时间以‘HH:MM:SS’的格式返回,具体格式根据函数用在字符串或是语境中而定。

例:使用CURRENT_TIME函数获取当前系统时间,输入语句如下

select current_time;

LOCALTIME 获取当前时间(不带时区)

LOCALTIME函数的作用是将当前的时间以‘HH:MM:SS’的格式返回,唯一和CURRENT_TIME不同的是返回时不带时区值。

例:使用LOCALTIME函数获取当前系统时间,输入语句如下

select localtime;

2. 获取当前时间和日期的函数

CURRENT_TIMESTAMP、LOCALTIMESTAMP和NOW()三个函数的作用相同,返回当前日期和时间值,格式为‘YYYY-MM-DD HH:MM:SS’或YYYYMMDDHHMMSS,具体格式根据函数是否用在字符串或数字语境中而定。

例:使用日期时间函数获取当前系统的日期和时间,输入语句如下

select current_timestamp,localtimestamp,now();

3.获取日期的指定值的函数EXTRACT(type FROM d)

EXTRACT(type FROM d)函数从日期中提取其部分,而不是执行日期运算。

提取一个月中第几天

例:使用EXTRACT函数从日期中提取一个月中第几天,输入语句如下

select extract(day from  timestamp'2023-4-16 11:06');

从日期中提取月份

例:使用EXTRACT函数从日期中提取月份,输入语句如下

select extract(month from  timestamp'2023-4-16 11:06');

从日期中提取年份

例:使用EXTRACT函数从日期中提取年份,输入语句如下

select extract(year from  timestamp'2023-4-16 11:06');

查询指定日期是一年中的第几天

例:使用EXTRACT函数查询指定日期是一年中的第几天,输入语句如下

select extract(doy from  timestamp'2023-4-16 11:06');

查询指定日期是一周中的星期几

例:使用EXTRACT函数查询指定日期是一周中的星期几,输入语句如下

select extract(dow from  timestamp'2023-4-16 11:06'),extract(dow from  timestamp'2023-4-15 11:06');

周日作为开始,所以是0,西方人用的日历都是以周日(礼拜天)作为一周的开始,有传统信仰的人也会在这一天去“求佛”

查询指定日期是该年的第几季度(1~4)

例:使用EXTRACT函数查询指定日期是该年的第几季度(1~4),输入语句如下

select extract(quarter from  timestamp'2023-4-16 11:06');
EXTRACT函数月份-季度对应表
月份季度
1月~3月第一季度
4月~6月第二季度
7月~9月第三季度
10月~12月第四季度

4.日期和时间的运算操作

日期和时间之间可以有加、减、乘、除运算操作。

例1:计算指定日期加上间隔天数后的结果,输入语句如下

select date'2023-4-16'+integer'10';

例2:计算指定日期加上间隔小时后的结果,输入语句如下

select date'2023-4-16'+interval'3 hour';

例3:计算指定日期加上指定时间后的结果,输入语句如下

select date'2023-4-16'+time'4:23';

例4:计算指定的两个日期之间的间隔天数,输入语句如下

select date'2023-4-16'-date'2023-4-10';

例5:计算指定日期减去指定间隔天数的结果,输入语句如下

select date'2023-4-16' - integer'10';

例6:计算整数与天数相乘的结果,输入语句如下

select 2 * interval'8 day';

例7:计算整数与秒数相乘的结果,输入语句如下

select 15 * interval'2 second';

将second缩写为sec效果相同,允许使用秒的关键词的缩写 

也可以这么写

select time'00:25:00' * 2;

例8:计算小时数与整数相除的结果,输入语句如下

select interval'1 hour' / integer'2';

也可以这样写

select interval'1 hour' / 2;

 还可以这样写

select time'1:00:00' / 2;

 

条件判断函数

条件判断函数也称为控制流程函数,根据满足的条件而执行相应的流程。在pgsql中,进行条件判断语句的函数为CASE。

1.CASE expr WHEN v1 THEN r1 [WHEN v2 THEN r2] [ELSE rn] END

该函数表示,如果expr值等于某个vn值,则返回对应位置的THEN后面的结果;如果与所有值都不相等,则返回ELSE后面的rn

例:使用CASE value WHEN语句执行分支操作,输入语句如下

select case 996 when 007 then '卖身契?' when 996 then 'icu' else '8小时工作,8小时休息,8小时属于我们自己' end;

该函数用法与C语言中的switch-case语法的用法相似

2. CASE WHEN v1 THEN r1 [WHEN v2 THEN v2] ELSE rn END

该函数表示,某个vn值为TRUE时,返回对应的位置THEN后面的结果;如果所有值都不为TRUE,则返回ELSE后面的rn。

例:使用CASE WHEN语句执行分支操作,输入语句如下

select case when 1=2 then '1=2?' when 1=1 then 'yes' else 'all false' end;

该函数用法与python语言中的if-elif-else语法的用法相似

系统信息函数

pgsql中的系统信息有数据库的版本号、当前用户名和链接数、系统字符集、最后一个自动生成的ID值等。

1.获取PostgreSql版本号

VERSION()返回指示PostgreSql服务器版本的字符串。这个字符串使用utf8字符集。

例:查看当前pgsql版本号,输入语法如下

select version();

(我因为工作原因使用的10.7,读者在学习时推荐使用原著中使用的11.2 64-bit版本 )

2.获取用户名的函数

USER和CURRENT_USER函数返回当前被pgsql服务器验证的用户名。这个值符合确定当前登录用户存取权限的pgsql账户。一般情况下,这两个函数的返回值是相同的。

例:获取当前登录用户名称,输入语法如下

select USER,CURRENT_USER;

加密函数

加密函数主要用来对数据进行加密和界面处理,以保准某些重要数据不被别人获取。这些函数在保证数据库安全时非常有用。

1.加密函数MD5(str)

 MD5(str)为字符串算出一个MD5 128比特检查和。该值以32位的16进制数字的二进制字符串的形式返回,若参数为NULL则会返回NULL

例:使用MD5函数加密字符串,输入语法如下

select MD5('redstar');
1074fc255f5db16d164637525ce96445

 MD5解密网站

2.加密函数ENCODE(str,pswd_str)

ENCODE(str,pswd_str)使用pswd_str作为加密编码,加密str,常见的加密编码包括base64、hex和escape(编码相关介绍见尾部附录)

例:使用ENCODE函数加密字符串,输入语法如下

select encode('redstar','hex'),length(encode('redstar','hex'));

加密后的长度为14 

3.解密函数DECODE(crypt_str,pswd_str)

DECODE(crypt_str,pswd_str)将pswd_str作为密码,解密加密字符串crypt_str。crypt_str是由ENCODE()以某种编码加密后返回的字符串。

例:使用DECODE函数加密字符串,输入语法如下

select encode('redstar','base64'),text(decode(encode('redstar','base64'),'base64'));

(原书只展示了bytea格式的结果,不直观,我们可以使用前面讲过的知识将结果转换为text格式)

可以看到,ENCODE和DECODE互为反函数,但解密时使用的编码必须与加密时用的编码一致,否则会报错

改变数据类型的函数

CAST(x,AS type)函数将一个类型的值转换为另一个类型的值

例:使用CAST函数进行数据类型的转换,输入语法如下

select cast(100 as char(2));

经过转换,原先的数字100已经变成了字符串的‘10’了

综合案例——PostgreSql函数的使用

有关综合案例——PostgreSql函数的使用的相关内容请通过原教材《postgresql11从入门到精通》(清华大学出版社)第133页开始了解,常见问题及解答在原书137页,经典习题在原书137页,该部分作为自由了解范围请购买原著自行学习,感谢理解。

附录·

加密类型

1.Base64

Base64是基于64个可打印字符来表示二进制数据的编解码方式。

这64个可打印字符包括大写字母A-Z、小写字母a-z、数字0-9共62个字符,再加上另外2个 + 和 /。

Base64是一种索引编码,每个字符都对应一个索引,具体的关系图,如下:

Base64在线编码/解码

2.Hex

十六进制英文名称:Hex number system,是计算机中数据的一种表示方法。同我们日常中的十进制表示法不一样。它由0-9,A-F,组成。与10进制的对应关系是:0-9对应0-9;A-F对应10-15;N进制的数可以用0---(N-1)的数表示超过9的用字母A-F。

Hex在线编码/解码

3.Escape

escape采用ISO Latin字符集对指定的字符串进行编码。所有的空格符、标点符号、特殊字符以及其他非ASCII字符都将被转化成%xx格式的字符编码(xx等于该字符在字符集表里面的编码的16进制数字)。

Escape在线编码/解码

作者的话(Alvin):

这次第六章的内容比之前的几章都要多,从图片到代码和相关资料收集,再到真正实打实的使用csdn的文章编辑器一个字一个字的手敲,期间还因为保存问题导致部分新写段落的丢失重写,给本就可怜的空余时间雪上加霜,导致这次的更新比之前的几章都要慢,也导致本章节的知识比前面的都要印象深刻(悲),本专栏的文章不会因为安全的学习停更,目前计划更新完原著第14章(数据备份)就结束,以保证基础知识的全面与系统,但间隔时间会长,用爱发电,理解一下吧。

本文根据原书《PostgreSql11 从入门到精通》(清华大学出版社)第6章总结整理,为提问与解答可以帮助更多人,本博客模拟GitHub的issue方案,所以私信已关,有问题请在评论区直接指正与提问,允许转发、复制或引用本文章,必须遵守开源法则注释来源与作者,感谢您的阅读。