4.2.2 常用函数(单行函数和聚合函数)

4.2.2 常用函数(单行函数和聚合函数)

MySQL提供了众多功能强大、方便易用的函数。使用这些函数,可以极大地提高用户对数据库的管理效率。MySQL中的函数包括:数学函数、字符串函数、日期和时间函数、聚合函数和转换函数等其他函数。下面简要介绍一下MySQL中常用的函数的功能及示例。

1.数学函数

数学函数主要用来处理数值数据,主要的数学函数有:绝对值函数、三角函数(包括正弦函数、余弦函数、正切函数、余切函数等)、对数函数、随机数函数等。在有错误产生时,数学函数将会返回空值null。下面简要介绍一些常用的数学函数,见表4-6。

表4-6 MySQL中常用的数学函数

续表

2.字符串函数

字符串函数主要用来处理数据库中的字符串数据,MySQL中字符串函数有:计算字符串长度函数、字符串合并函数、字符串替换函数、字符串比较函数、查找指定字符串位置函数等。下面简要介绍一些常用的字符串函数,见表4-7。

表4-7 MySQL中常用的字符串函数

续表

3.日期和时间函数

日期和时间函数主要用来处理日期和时间值,一般的日期函数除了使用date类型的参数外,也可以使用datetime或者timestamp类型的参数,但会忽略这些值的时间部分。相同的,以time类型值为参数的函数,可以接受timestamp类型的参数,但会忽略日期部分,许多日期函数可以同时接受数字和字符串类型的两种参数。下面简要介绍一些常用的日期函数,见表4-8。

表4-8 MySQL中常用的日期函数

续表

提示:在date_format(date,fmt)函数中的fmt字符串中可用的格式符有:

4.转换函数

使用类型转换函数可以在各种类型数据之间转换数据类型。MySQL中常用的转换函数有cast()和convert()函数,可用来获取一个类型的值,并产生另一个类型的值。两者具体的语法如下:

①cast(value as type),即cast(xxx as类型)。

②convert(value,type),即convert(xxx,类型)。

但是要特别注意,可以转换的数据类型是有限制的。这个类型可以是以下类型中的一个:

示例如下:

可以看到,cast(100 as char(2))将整数数据100转换为带有2个显示宽度的字符串类型,结果为‘10’;convert(2017-08-08 17:17:17,time)将datetime类型的值,转换为time类型值,结果为‘17:17:17’。

③不同进制的数字进行转换的函数。

conv(n,from_base,to_base)函数进行不同进制数间的转换。返回值为数值n的字符串表示,由from_base进制转化为to_base进制。如有任意一个参数为null,则返回值为null。自变量n被理解为一个整数,但是可以被指定为一个整数或字符串。最小基数为2,而最大基数则为36。

【例4.16】使用conv函数在不同进制数值之间转换。

输入语句后,执行效果如下:

conv(A,16,2)将十六进制的A转换为二进制表示的数值,十六进制的A表示十进制的数值10,二进制的数值1010正好也等于十进制的数值10;conv(15,10,2)将十进制的数值15转换为二进制值,结果为1111;conv(15,10,8)将十进制的数值15转换为八进制值,结果为17;conv(15,10,16)将十进制的数值15转换为十六进制值,结果为f。

进制说明:

5.聚合函数(常用于select查询语句中的group by子句)

select子句的表达式中可以包含聚合函数。聚合函数常常用于对一组值进行计算,然后返回单个值。除count()函数外,聚合函数都会忽略空值。聚合函数通常与group by子句一起使用。若select语句中有一个group by子句,则该聚合函数对所有字段列起作用;若没有,则select语句只产生一行作为结果。表4-9列出了一些常用的聚合函数及示例。

表4-9 MySQL中常用的聚合函数

续表

聚合函数group_concat(col)的示例及执行效果如下:

6.条件判断函数

条件判断函数也称为控制流程函数,根据满足的条件的不同,执行相应的流程。MySQL中进行条件判断的函数有if、ifnull和case。下面重点讲解if和ifnull的用法。

(1)if(expr,v1,v2)函数

如果表达式expr是true(expr<>0 and expr<>null),则if()的返回值为v1;否则返回值为v2。if()的返回值为数值或字符串值,具体情况视其所在语境而定。

如下代码所示:

1>2的结果为false,if(1>2,2,3)返回第2个表达式的值;1<2的结果为true,if返回第一个表达式的值;“test”小于“test1”,结果为true,if(strc-返回第一个表达式的值。

提示:如果v1或v2中只有一个明确是nu l l,则i f()函数的结果类型为非nu l l表达式的结果类型。

(2)ifnull(v1,v2)函数

假如v1不为null,则ifnull()的返回值为v1;否则其返回值为v2。ifnull()的返回值是数字或是字符串,具体情况取决于其所在的语境。

如下代码所示:

ifnull(1,2)虽然第二个值也不为空,但返回结果依然是第一个值;ifnull(null,10)第一个值为空,因此返回10;“1/0”的结果为空,因此ifnull(返回字符串“wrong”。

7.实训

①返回数字3.8378四舍五入后保留3位有效数字的结果,返回数字3.8378截断后保留3位有效数字的结果。

②返回‘A’字符的ASCII码值,字符串“hello”的字符个数。

③返回“你好”“中国!”这两个字符串连接后用“#”分隔的字符串。

④返回将字符串“I love China!”全部转变为大写字母和小写字母的结果并反转显示。

⑤返回字符串“constraint fk_id”中最左边和最右边的5个字符。

⑥从字符串“I love China!”中截取5个字符,其结果为“China”。

⑦返回当前的系统日期中的日、月、年、星期,效果如“21st-08-2017 Monday”。

⑧查询bookDB数据库中,所有图书总数量、总价格、平均价格、最高价、最低价。

⑨查询部门编号为3的员工编号eno,工资等级(高于6 000显示“高工资”;3 000~6 000显示“中工资”;低于3 000显示“低工资”)。

⑩查询empMIS数据库中按年薪排序的所有员工的年薪(包括工资和奖金ifnull)。