MySQL数据操作与查询笔记 • 【第5章 MySQL 函数】
阅读原文时间:2022年05月02日阅读:1

全部章节   >>>>


本章目录

5.1 数学函数和控制流函数

5.1.1 数学函数

5.1.2 控制流函数

5.2 字符串函数

5.2.1 字符串函数介绍

5.2.2 字符串函数应用

5.3 MySQL 日期和时间函数

5.3.1 日期和时间函数介绍

5.3.2 日期和时间函数应用

5.4 MySQL 系统信息函数和加密函数

5.4.1 系统信息函数介绍

5.4.2 系统信息函数应用

5.4.3 加密函数介绍

5.4.4 加密函数应用

总结:


5.1 数学函数和控制流函数

数学函数是用来处理数值数据方面的运算,MySQL 中主要的数学函数有绝对值函数三角函数对数函数随机函数等。

使用数学函数的过程中,如果有错误发生,该函数将返回 null。

数学函数

功能介绍

ABS(x)

返回 x 的绝对值

PI( )

返回圆周率,默认显示 6 位小数 3.141593

SQRT(x)

返回非负数 x 的二次方根

POW(x,y) 和

POWER(x,y)

返回 x 的 y 次乘方的结果值,POW(3,4) 的结果值为 81

CEIL(x) 和

CEILING(x)

返回不小于 x 的最小整数值

FLOOR(x)

返回不大于 x 的最大整数值

ROUND(x)

返回最接近 x 的整数,对 x 进行四舍五入

ROUND(x,y)

返回最接近 x 的整数,对 x 进行四舍五入 , 保留小数点后面 y 位

TRUNCATE(x,y)

返回截去小数点后 y 位的数值 x

RAND()

返回一个随机浮点值 v,0<=v<=1

RAND(x)

返回一个随机浮点值 v,0<=v<=1;x 为整数,被用作种子值, 用来产生重复序列。

LOG(x)

返回 x 的自然对象,x 相对于基数 e 的对数

LOG10(x)

返回 x 的基数为 10 的对数

RADIANS(x)

返回 x 由角度转化为弧度的值,如 x 取值 90,则返回的弧度为PI( )/2

DEGREES(x)

返回 x 由弧度转化为角度的值,如 x 取 PI( ),则返回的角度值为180

ceil(a) 为 MySQL 中内置数学函数,其功能是对数值型 a 进行向上取整,如 ceil(12.4) 的值为 13。

floor(a) 为 MySQL 中内置数学函数,其功能是对数值型 a 进行向下取整,如 floor(12.7) 的值为 12。

round(a) 为 MySQL 中内置数学函数,其功能是对数值型 a 进行四舍五入,如 round(12.7)

示例:使用 ceil(x) 和 ceiling(x) 返回不小于 x 的最小整数。

select ceil(2), ceil(2.75), ceil(-2), ceil(-2.75)

示例:使用 floor(x) 返回不大于 x 的最大整数。

select floor(2), floor(2.75), floor(-2), floor(-2.75)

示例:使用 rand() 产生 0~1 的浮点数。

select rand(),rand(),rand()

示例:用 rand(x) 产生 0~1 的浮点数。

select rand(5),rand(5),rand(11)

示例:使用 round(x) 返回最接近于参数 x 的整数。

select round(-2.5), round(-2.25), round(-2.75), round(2.25), round(2.75)

示例:使用 round(x,y) 对参数 x 进行四舍五入的操作,返回值保留小数点后面指定的 y 位。

select round(-2.55,1),round(-2.25,3),round(375.49,-1),round(375.49,-1)

示例:使用 truncate(x,y) 对参数 x 进行截取操作。

select truncate(2.25,1),truncate(2.99,1),truncate(2.99,0),truncate(99.99,-1)

控制流函数也称作“条件判断函数”,其根据满足的条件不同,执行相应的流程。

MySQL 中常见的控制流函数有 IF、IFNULL。

控制流函数

功能介绍

IF(expr,v1,v2)

返回表达式 expr 得到不同运算结果时对应的值。若 expr 为TRUE(expr<>0 and expr<>null), 则 IF( ) 的返回值为 v1,否则为 v2

IFNULL(v1,v2)

返回参数 v1 或 v2 的值。如果 v1 不为 null,则返回值为 v1,否则返回值为 v2

示例:公交集团将线路长度大于或等于 22 千米的线路定义为长途线路,小于 22 千米的线路定义为短途,并且将那些没有配备到具体公司的线路的所属公司定义为“待分配”。使用 IF() 和 IFNULL() 控制流函数显示所有线路的线路号、所属公司和线路类型(“长途”和“短途”)。

select lineNo 线路 , ifnull(company,' 待分配 ') 所属公司 , if(miles>=22,' 长途 ',' 短途 ') 线路类型  from line

5.2 字符串函数

字符串函数主要用来处理字符串数据,MySQL 字符串函数主要有计算字符长度函数字符串合并函数字符串转换函数字符串比较函数以及查找指定字符串位置函数等。

字符串函数

功能介绍

CHAR_LENGTH(str)

返回字符串 str1 包含字符的个数。像中文这种多字节的一个字符也只能算单字符

LENGTH(str)

返回字符串 str1 包含字节的个数

CONCAT(s1,s2,…)

字符串合并函数,返回结果为连接参数产生的字符串。参数可以是一个或多个。如有任意一个字符串参数为 null,则返回值为 null

INSERT(str,pos,len,newstr)

替换字符串函数。字符串 str 在位置 pos 起始且长度为 len 的子串由字符串 newstr 替换,最终返回替换之后的 str

LOWER(str) 和 LCASE(str)

这两个函数功能相同,都是将字符串 str 中的字母转换为小写

UPPER(str) 和 UCASE(str)

这两个函数功能相同,都是将字符串 str 中的字母转换为大写

SUBSTR(str,pos,len)  和

SUBSTRING(str,pos,len)

截取原始字符串 str 中从 pos 开始的 len 长度字符串。len 是可选项,如果该项缺省则获取从 pos 开始的剩余字符串内容

LFFT(str,len)

截取左侧字符串函数,返回 str 最左的 len 个字符

RIGHT(str,len)

截取右侧字符串函数,返回 str 最左的 len 个字符

LTRIM(str)

删除字符串 str 左侧所有空格

RTRIM(str)

删除字符串 str 右侧所有空格

TRIM(str)

删除字符串 str 左右两端所有空格

TRIM(s1 from str)

删除字符串 str 中两端包含的子字符串 s1

REPEAT(str,n)

重复生成字符串函数。返回一个由重复的字符串 str 组成的字符串,该字符串中 str 的重复次数是 n。若 n<=0,则返回一个空字符串;若 str 或 n 为 null,则返回 null

STRCMP(s1,s2)

比较字符串大小函数。若 s1 和 s2 相等,则返回 0;若 s1 小于 s2,则返回 -1;若 s1 大于 s2,则返回 1

LOCATE(s1,str)

匹配字符串开始位置的函数。返回子字符串 s1 在字符串 str 中第一次出现的位置。若 str 中没有包括 s1,则返回 0

ELT(n,s1,s2…sn)

返回指定位置的字符串函数。根据 n 的取值,返回指定的字符串 sn。若 n=1,则返回 s1;若 n=2,则返回 s2,以此类推。若 n<1 或 n>sn 的数目,则返回值为 null

FIELD(s,s1,s2…sn)

返回指定字符串位置的函数。返回字符串 s 在 s1,s2,…sn 中出现的位置。如果找不到,则返回值为 0;若 s 为 null,则返回值为 0

INSERT(str,s1)

匹配字符串开始位置的函数。功能同 LOCATE 函数

REPLACE(str,s1,s2)

替换函数。使用字符串 s2 替换字符串 str 中所有的子字符串s1

REVERSE(str)

返回和原始字符串 str 顺序相反的字符串

示例:使用 char_length(str) 和 length(str) 计算字符个数和字节个数。

select char_length('test'),char_length(' 测试 '),length('test'),length(' 测试 ')

示例:使用 concat(s1,s2,…) 函数连接多个字符串。

select concat('My','SQL'), concat('My',null,'SQL'), concat(' 我 ',' 爱 ','MySQL')

示例:使用 insert(str,pos,len,newstr) 函数进行字符串替换操作。

select insert('first',2,3,'second') column1, insert('first',-1,2,'second') column2, insert('first',6,3,'second') column3 ,insert('first',3,20,'second') column4,
insert('first',3,null,'second') column5

示例:使用 substr(str,pos,len) 截取原始字符串 str 中从 pos 开始的 len 长度字符串。

select substr('MySQL',3,2) column1, substr('MySQL',3) column2, substr('MySQL',-4,3) column3, substr('MySQL',-5)  column4

示例:使用 locate(s1,str) 匹配子字符串 s1 在字符串 str 中第一次出现的位置。

select locate('my','MySQL'),locate('SQL','MySQLMySQL'),locate('sy','MySQL')

示例:使用 elt(n,s1,s2,…,sn) 返回指定位置的字符串。

select  elt(3,'ie','ef','chrome','360'),elt(3,'ie','ef')

示例:使用 field(s,s1,s2,…sn) 返回指定字符串位置。

select field( ' M y' , ' my1' , ' mY 2' , ' my' , ' M yS Q L' ) column1, field( ' M y' , ' myS Q L' , ' php' ) column2,field(null,'s1','s2') colmn3

5.3 MySQL 日期和时间函数

日期和时间函数主要用来处理日期和时间的值,一般的日期函数除了使用 DATE 类型的参数外,也可以使用DATETIME 或 TIMESTAMP 类型的参数,只是忽略了这些类型值的时间部分。类似的情况还有以 TIME 类型为参数的函数,可以接受 TIMESTAMP 类型的参数,只是忽略其中的日期部分,许多日期函数可以同时接受数值和字符串类型的参数。

日期和时间函数

功能介绍

CURDATE( ) 和

CURRENT_DATE( )

这两个函数作用相同,都是返回当前系统的日期值

CURTIME( ) 和

CURRENT_TIME( )

这两个函数作用相同,都是返回当前系统的时间值

CURRENT_TIMESTAMP( )、

LOCALTIME( )、NOW( )、

SYSDATE( )

这 4 个函数作用相同,都是返回当前系统的日期和时间值

DAYNAME(date)

返回日期参数 date 对应的星期几的英文名称。例如 ,dayname("2017-07-24") 的值为 Monday

DAYOFWEEK(date)

返回日期参数 date 对应的一周的索引位置。返回值的范围是 1 ~ 7。其中,1 表示周日,2 表示周一,…,7 表示周六。例如,dayofweek("2017-07-24") 的值为 2,表示周一

WEEKDAY(date)

返回日期参数 date 对应的一周的索引位置。返回值的范围是 0 ~ 6。其中,0 表示周一,1 表示周二,…,6 表示周日。例如,weekday("2017-07-24") 的值为 0,表示周一

WEEK(date,mode)

该函数返回日期参数 date 对应的星期数。WEEK( )的双参数形式允许指定该星期是否起始于周日或周一, 以及返回值的范围是否为从 0 到 53 或从 1 到53。若 mode 参数被省略,则使用 default_week_format 系统自变量的值

DAYOFYEAR(date)

返回日期参数 date 对应的当前年份的第几天,范围为 1 ~ 365

year(date)

返回日期参数 date 对应的年份

month(date)

返回日期参数 date 对应的月份

day(date)

返回日期参数 date 对应的当前月份的天数值

DATE_ADD(date,INTERVAL

expr type) 和

ADDDATE(date,

INTERVAL expr type)

加法计算日期函数,这两个函数作用相同,都是返回一个以参数 date 为起始日期加上时间间隔之后的日期值。expr 参数是希望添加的时间间隔,type 表示时间间隔的类型,type 和 expr 取值见表 5.6

DATE_SUB(date,INTERVAL

expr type) 和

SUBDATE(date,INTERVAL

expr type)

减法计算日期函数,这两个函数作用相同,都是返回一个以参数 date 为起始日期减去时间间隔之后的日期值。expr 参数是希望添加的时间间隔,type 表示时间间隔的类型,type 和 expr 取值见表 5.6

ADDTIME(time,expr)

加法计算时间值函数,返回将 expr 值加上原始时间time 之后的值

SUBTIME(time,expr)

减法计算时间值函数,返回将原始时间 time 减去expr 之后的值

DATEDIFF(date1,date2)

计算两个日期之间天数间隔的函数,返回参数 date1 减去 date2 之后的值。如果 date1 在 date2 之前,返回的值为负值

DATE_FORMAT(date,

format)

日期和时间格式化函数。返回根据参数 format 指定的格式显示的 date 值。format 包含的格式见表 5.7,即 DATE_FORMAT 和 TIME_FORMAT 函数中format 格式表

TIME_FORMAT(time,

format)

时间格式化函数。返回根据参数 format 指定的格式显示的 time 值

type 和 expr 取值

type 值

预期的 expr 格式

MICROSECOND

微秒数

SECOND

秒数

MINUTE

分钟数

HOUR

小时数

DAY

天数

WEEK

周数

MONTH

月数

QUARTER

季度数

YEAR

年数

SECOND_MICROSECOND

‘秒数 . 微秒数’

MINUTE_MICROSECOND

‘分钟数 . 微秒数’

MINUTE_SECOND

‘分钟数 . 秒数’

HOUR_MICROSECOND

‘小时数 . 微秒数’

HOUR_SECOND

‘小时数 : 分钟数 : 秒数’

HOUR_MINUTE

‘小时数 : 分钟数’

DAY_MICROSECOND

‘天数 . 微秒数’

DAY_SECOND

‘天数 小时数 : 分钟数 : 秒数’

DAY_MINUTE

‘天数 小时数 : 分钟数’

DAY_HOUR

‘天数 小时数’

YEAR_MONTH

‘年数 - 月数’

DATE_FORMAT 和 TIME_FORMAT 函数中 format 格式表

格式说明符

描述说明

%a

一星期中每天名称的缩写(Sun…Sat)

%b

月份的缩写(Jan…Dec)

%c

月份的数字表现形式(0…12)

%D

带有英语后缀的一个月中的每一天的名称(0th、1st、2nd、3rd)

%d

用数字形式表现的每月中的每一天(00…31)

%e

用数字形式表现的每月中的每一天(0…31)

%f

毫秒(000000…999999)

%H

24 时制显示的小时(00…23)

%h

12 时制显示的小时(01…12)

%I

12 时制显示的小时(01…12)

%i

以数字形式表现的分钟数(00…59)

%j

一年中的每一天(001…366)

%k

24 时制小时的另一种表现格式(0…23)

%l

12 时制小时的另一种表现格式(1…12)

%M

用完整英文名称表示的月份(January…December)

%m

用数字表现的月份(00…12)

%p

上午(AM)或下午(PM)

%r

12 时制的时间值(hh:mm:ss,后跟 AM 或 PM)

%S

秒(00…59)

%s

秒(00…59)

%T

24 时制的小时(hh:mm:ss)

%U

星期(00…53),其中星期天是每星期的开始日

%u

星期(00…53),其中星期一是每星期的开始日

%V

星期(01…53),其中星期天是每星期的开始日,和 %X 一起使用

%v

星期(01…53),其中星期一是每星期的开始日,和 %x 一起使用

%W

一星期中各日名称(Sunday…Saturday)

%w

一星期中各日名称(0 代表星期日,6 代表星期六,以此类推)

%X

某星期所处年份。其中,星期天是每星期的开始日,采用 4 位数字形式表现,和 %V 一起使用

%x

某星期所处年份。其中,星期一是每星期的开始日,采用 4 位数字形式表现,和 %V 一起使用

%Y

4 位数字表示的年份

%y

2 位数字表示的年份

示例:使用 curdate() 和 current_date() 显示当前系统日期。

select curdate(),current_date()

示例:使用 curtime() 和 current_time() 显示当前系统时间。

select curtime(),current_time()

示例:使用 current_timestamp()、localtime()、now() 和 sysdate() 函数显示当前系统的日期和时间。

select current_timestamp(),localtime(),now(),sysdate()

示例:使用 dayname()、dayofweek() 和 weekday() 函数返回指定日期所对应的星期信息。

select  dayname(now()),dayofweek(now()),weekday(now())

示例:使用 date_format(date,format) 函数显示当前系统时间,格式为“4 位年 - 月 - 日 小时 : 分钟 : 秒”,其中小时为 24 小时制。

select date_format(now(),'%Y-%c-%d %H:%i:%s')

示例:使用 date_add(date,INTERNAL expr type) 和 adddate(date,INTERNAL expr type) 函数对当前系统时间执行加法操作。

select date_format(now(),'%Y-%c-%d %H:%i:%s') 当前时间 , DATE_ADD(now(),INTERVAL 20 SECOND) 增加 20秒 ,ADDDATE(now(),INTERVAL 20 MINUTE) 增加 20 分钟 ,
ADDDATE(now(),INTERVAL '1 1:1:1' DAY_SECOND) 增加 1 天 1 小时 1 分钟 1 秒

示例:使用 datediff(date1,date2) 返回当前日期与 2017-5-25 日之间的间隔天数。

select datediff(now(),'2017-5-25')

5.4 MySQL 系统信息函数和加密函数

MySQL 系统信息函数用于获取 MySQL 数据库的系统信息,这些信息主要包括:数据库的版本号、当前用户名和连接数、系统字符集以及最后一个系统生成的值等。

系统信息函数

功能介绍

VERSION()

返回当前 MySQL 版本号的字符串。执行“select version( )”,返回作者使用的 MySQL 版本 5.6.24

CONNECTION_ID()

返回当前 MySQL 服务器当前用户的连接次数。每个连接都有各自唯一的 ID,登录次数不同,返回的数值也就不同

PROCESSLIST()

"show processlist" 输出结果显示哪些线程在运行,不仅可以查看当前所有连接数,还可以查看当前的连接状态,帮助识别出有问题的查询语句等。如果是 root 账号,能看到所有用户的当前连接;如果是其他普通帐号,则只能看到自己占用的连接。show processlist 只列出前100 条,如果想全部列出可使用 "show full processlist" 命令

DATABASE(), SCHEMA()

返回使用 utf8 字符集的默认(当前)数据库名

USER(),CURRENT_

USER(),SYSTEM_ USER(),

SESSION_USER()

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

CHARSET(str)

返回字符串 str 自变量的字符集

LAST_INSERT_ID()

获取最后一个自动生成的 ID 值的函数。自动返回最后一个 INSERT或 UPDATE 为 AUTO_INCREMENT 列设置的第一个发生的值

示例:使用 show processlist() 输出当前用户的连接信息。

show processlist();

示例:使用 charset(str) 返回 str 字符串默认的字符集。

select CHARSET("test"),CHARSET(CONVERT("test" USING latin1))

示例:使用 LAST_INSERT_ID() 返回最后一个自动生成的 ID 值,分一次插入一条记录和一次插入多条记录进行考察。

在 test 数据库中创建表 student,其中 id 为主键,为 int 且自动增长:

create table student(id int auto_increment not null primary key, name varchar(20));

分别向表 student 插入3 条记录:

insert into student values(null,'zhangsan');

insert into student values(null,'lisi');

insert into student values(null,'wangwu');

最后插入的一条记录的 ID 值为 3

LAST_INSERT_ID()  获得最后一次自动生成的 I D 值为3

分别向表 student 插入两条记录:

insert into student values(null,'zhaoliu'),(null,'sunqi');

最后插入的一条  记录的 ID 值为 5

LAST_INSERT_ID() 获得 最后一次自动生成的 ID 值为 4

分析:产生上述现象的原因在于:当使用 insert 语句插入多行记录时,LAST_INSERT_ID( ) 函数只返回插入的第一行数据时产生的值。

提醒:LAST_INSERT_ID( ) 函数返回结果与 table 无关, 如果向表 1 插入数据后, 再向表 2 中插入数据, 则 LAST_ INSERT_ID( ) 函数返回结果是表 2 中的 ID 值。

MySQL 中加密函数用来对数据进行加密和解密的处理,以保证数据表中某些重要数据不被别人窃取,这些函数能保证数据库的安全。

加密函数

功能介绍

PASSWORD(str)

加密函数。该函数对原明文 str 进行加密,并返回加密之后的字符串。该加密函数不可逆

MD5(str)

加密函数。该函数对原明文 str 计算出一个 MD5 128 比特校验和,该值以 32 位十六进制数字的二进制字符串形式返回。该加密函数可逆

ENCODE(str,pswd_str)

加密函数。该函数使用 pswd_str 作为密钥对 str 进行加密,该加密函数可以使用 DECODE() 函数进行解密

DECODE(crypt_str,

pswd_str)

解密函数。使用 pswd_str 作为密钥,对经过 ENCODE 加密之后的密文 crypt_str 进行解密

示例:分别使用 PASSWORD(str) 和 MD5(str) 对密文“test”进行加密操作,并显示密文。

select PASSWORD('test'), MD5('test');

示例:使用 ENCODE(str,pswd_str) 对密文“test”进行加密操作,其中“hello”为加密密钥。

select ENCODE('test','hello'), LENGTH(ENCODE('test','hello'));

示例:使用 DECODE(crypt_str,pswd_str) 解密被 ENCODE 加密之后的信息。

select DECODE(ENCODE('test','hello'),'hello');

总结:

  • ceil(x) 和 floor(x) 函数的功能是:

ceil(x) 返回不小于 x 的最小整数值,floor(x) 返回不大于 x 的最大整数值。

  • locate(s1,str)、substr(str,pos,len) 和 strcmp(s1,s2) 函数的功能:

locate(s1,str):匹配字符串开始位置的函数。返回子字符串 s1 在字符串 str 中第一次出现的位置。若 str中没有包括 s1,则返回 0。

substr(str,pos,len):截取原始字符串 str 中从 pos 开始的 len 长度字符串。len 是可选项,如果该项缺省则获取从 pos 开始的剩余字符串内容。

strcmp(s1,s2):比较字符串大小的函数。若 s1 和 s2 相等,则返回 0;若 s1 小于 s2,则返回 -1;若 s1 大于 s2,则返回 1。

  • dayofweek(date)、date_add(date,INTERVAL expr type) 和 datediff(date1, date2) 函数的功能:

dayofweek(date):返回日期参数 date 对应的一周的索引位置。返回值的范围是 1 ~ 7。其中,1 表示周日,2 表示周一,…,7 表示周六。

date_add(date,INTERVAL expr type):加法计算日期函数,这两个函数作用相同,都是返回一个以参数 date 为起始日期加上时间间隔之后的日期值。expr 参数是希望添加的时间间隔,type 表示时间间隔的类型。

datediff(date1,date2):计算两个日期之间天数间隔的函数,返回参数 date1 减去 date2 之后的值。如果date1 在 date2 之前,返回的值为负值。