目录
一、日期时间函数
1. 常见的日期时间函数
2. current_date()
3. current_time()
4. current_timestamp()
5. now()
6. date(datetime)
7. date_add(date, interval d_value_type)
8. date_sub(date, d_value_type)
9. datediff(date1, date2)
10. 题目示例
10.1 创建一张生日表,记录生日
10.2 创建一个留言表
10.3 请查找前两分钟内发布的帖子
二、字符串函数
1. 常见字符串函数
2. charset(str)
3. concat(string2 [, ...])
4. instr(string, substring)
5. ucase(string)
6. lcase(string)
5. left(string, length)
6. length(string)
7. replace(str, search_str, replace_str)
8. strcmp(string1, string2)
9. substring(str, position, [, length])
10. ltrim(string)、rtrim(string)和trim(string)
11. 题目案例
11.1 获取emp表的ename列的字符集
11.2 显示exam_result表中的信息,显示格式为“学生姓名:xxx,语文成绩:xxx,数学成绩:xxx,英语成绩xxx”
11.3 查询exam_result表中的学生姓名占用的字节数
11.4 显示时将emp表中的所有名字中的S替换为“上海”
11.5 截取emp表中的ename中的第二个到第三个字符
11.6 以首字符小写的方式显示emp表中所有员工的姓名
三、数学函数
1. bin(decimal_namber)
2. conv(number, from_base, to_base)
3. format(number, decimal_places)
4. rand()
5. ceiling(number)j和floor(number)
四、其他函数
1. user()
2. database()
3. md5()与password()
4. ifnull(val1, val2)
在以前的文章中提到过,mysql中是存在函数的,这些函数在我们查找数据、创建表等情况时都可能用到。在这篇文章中就简单的介绍一下mysql中的一些常见函数。
首先是日期函数,在看日期函数之间,我们要先建立一个观念,在mysql中,日期指的是年月日,而时间指的是时分秒。常见的日期函数如下图所示:
要知道,在数据库中,日期时间是很重要的,因此,上图的这些函数大家也都需要了解一下。这里就简单的介绍一下。
注意,在mysql中的很多函数都是需要搭配select语句使用的,下面的函数示范也是如此。
current_date()函数是用于获取当前日期的。
current_time()函数是用于获取当前时间的。
current_timestamp()函数是用于获取时间戳的。大家知道,时间戳是一串数字,但是在mysql中获取时间戳时,它并不是直接显示对应的数字,而是显示时间戳转换后形成的日期时间。
简单来讲,就是当前的日期时间。
now()函数是返回当前的日期时间,其实和current_timestamp()返回的内容是一模一样的。
date(datetime)函数会将传入的datetime参数做切割,返回其中的日期部分。
datetime可以是一个日期时间:
也可以是一个函数,例如now()或者datestamp():
date_add(date, interval d_value_type)函数可以用于增加date中的日期或时间。interval是一个必须写的关键字,后面的d_value_type就是要添加的数值单位,可以是“year、minute、second、day”。
同样的,既可以自己写日期:
也可以用其他如now、current_date等函数:
date_sub(date, d_value_type)是用于减去date中的日期时间的。作用和date_sub相反,参数的含义都是一样的,就不再过多赘述。
datediff(date1, date2)函数用于获取date1和date2之间的日期差,单位是天。
传入的参数也可以是函数,这里就不再演示。
为了让大家更好的理解这几个函数的使用,在这里就用几个题目来示范一下。
先创建如下一张生日表:
一般来讲,我们的生日都是记录到年月日的。因此,在这个表里面的birthday列就是用的date数据类型。
此时就可以插入数据了:
无论是自己写,还是函数都是可以插入的。
虽然birthday列的数据类型是date,但是如果我们给它插入一些带有时间的函数,例如current_time、current_timestamp()呢?它能否插入?如果能插入结果又是什么呢?测试一下:
可以看到,它也能插入,但是插入的就是当前日期。对于这类情况,大家可以认为这些函数在获取结果时,其实是将日期和时间都拿到了,但是只根据需求显示特定的部分。而birthday的数据类型为date,因此就将得到的结果中的日期截取出来了。
因此,在这个题目中,如果你想用带有时间的函数,就可以用date将它括起来,告诉对方这里要的就只是日期:
因此,如果我们手动输入一个时间,就无法插入了:
在留言表中,我们要能够标识每条留言,这些留言也需要有一个时间来记录发表时间。一般来讲,留言的记录时间是按照年月日时分秒来记录的。
创建如下一个msg表:
由于需要记录时分秒,所以这里用的就是datetime类型。
此时就可以正常插入数据了:
当然,如果我们在查看的的时候只想看到日期,不想看时间,就可以手动给其指定要查看的内容:
为了看到两分钟发布的帖子,我们先来想想如何判断帖子是前两分钟内发布的帖子,很简单,就是用当前时间减去帖子的发布时间即可。此时就可以用上文中将的date_sub()函数。
为了方便看到实际场景,我们先插入一条信息,然后马上查找,以复现查找前两分钟内发布的帖子。
可以看到,此时就可以查找到前两分钟内发布的帖子了。
在mysql中,有很多函数都可以用来处理字符串,下图中就是一些常见的可以用于处理字符串的函数。在这里简单介绍一下:
注意,这些函数是否会修改数据库内的内容取决于你使用什么语句。例如如果你是在select语句中使用,就只是修改显示时的数据,而不会修改数据库内的数据;但如果你是用update语句,它就可能会修改数据库内的内容。
charset(str)函数用于返回字符串字符集。参数str就是对应的字符。
concat(string2 [, ...]函数可以将所有的参数拼接起来。参数部分就是要拼接的字符串。
instr(string, substring)函数是用来查看string中是否出现substring的,如果存在,就返回起始下标;如果不存在,就返回0。
注意,mysql中的字符串起始位置和C\C++的不同,它的起始位置下标是从1开始的,而不是从0开始。
ucase(string)函数是用于将小写字母转大写的。如果不是字母,就不做处理。
lcase(string)函数是用于将大写字母转小写的,如果不是字母,就不做处理。
left(string, length)函数是从string的左边的起始位置开始提取length个字符。
既然有left(), 当然就有right()函数。它们的参数作用是一样的,不同的只是right函数是从字符串的右边起始位置向左提取length个字符。
length(string)函数返回string的长度。注意,这个长度计算的是字节,而非字符。
在utf8中,中文字符占3个字节,因此这里返回的是12。
replace(str, search_str, replace_str)函数会将str中的search_str替换为replace_str。如果没有找到,就什么都不做。
strcmp(string1, string2)函数会比较两个字符串的大小。这个函数比较的是字符串的字节数,而不是字符长度。当string1 > string2时,返回1;当string1 < string2时,返回-1;如果双方相等,返回0。
substring(str, position, [, length])函数会从str的position位置截取length个字符。注意,该函数的起始位置下标是1,而非0。
ltrim(string)、rtrim(string)和trim(string)三个函数都是用于去除字符串中的空格的。其中ltrim去除左边的空格;rtim去除右边的空格,trim去除两边的空格。注意,它们不会去除字符串中间的空格。
这几个函数还是很重要的,因为它可以防止在某些情况下输入的信息多了前导空格或后导空格。例如用户在输入账号时,因为网络传输或程序员的程序有点问题,不小心给账号加了空格,如果没有这几个函数去除空格,用户的账号就会一直登陆失败。并且空格是不可见的,很多时候我们肉眼也无法看出来是空格的问题。
为了方便大家理解,在这里就举几个题目的例子,让大家更好的理解这些字符串函数的使用。
对于emp表,在上一篇文章中已经讲过了,这里就不再赘述,直接使用。
要查看它的ename列的字符集很简单。
一般来讲我们不会查看表的字符集,但有些特殊情况,如表中插入的数据出现了乱码等问题,就需要查看对应列的字符集,看是不是字符集有问题。
exam_result表也是在上一篇文章“mysql数据库的增删查改”中写过了,这里不再赘述。
在这里的显示成绩时,不能按照上面的形式显示,需要特定的格式。此时就可以使用concat函数。
要统计字节数,就需要使用length函数。
要替换字符,就需要使用replace函数。
要截取从position位置开始的字符,就要用substing函数。要截取第二个到第三个,即截取两个字符。
要以小写方式显示首字符,因此首先就要将姓名中的首字符切割出来,然后用lcase转为小写,再将转换后的字符与被姓名中的第二个字符及其后面的字符相拼接。在substring 中,如果不填截取长度,则默认截取到结尾。
在mysql中还存在很多用于数学计算的函数,在这里也简单介绍几个。
对于这些数学函数,大家应该很容易就能知道它的作用,这里就不再一一介绍了,而是介绍几个比较不好理解的函数。
bin(decimal_namber)函数用于十进制转二进制,但是它只会转为整数的二进制,如果是小数,则只转化整数部分,去除小数部分。
后面hex函数也是如此,只转化整数部分,不转化小数部分。
conv(number, from_base, to_base)函数是将一个数字从from_base进制转化为to_base进制。用于进制转换。
format(number, decimal_places)函数是用于格式化小数位的。其中number是需要格式化的数字,decimal_places是要保留的位数。
rand()函数是用于生成随机数的,但是随机数范围是[0, 1]。
如果大家想获得一个随机整数,就直接乘以对应位数,然后用format函数格式化即可。
ceiling(number)j和floor(number)函数分别是用于向上取整和向下取整的。大家可能不太理解什么是向上/向下取整。这里介绍一下,大家在日常生活中应该都用过“四舍五入”,这其实就是一种取整方法。
除了四舍五入的取整方法外,还有向上/向下取整、0向取整等方法。
0向取整其实就是当数字有小数时,向接近0的方向取整。例如3.14和3.59,采用0向取整就是变为3。而-3.14就是取整为-3。
向上取整就是向较大数方向取整。例如3.14就要变为4;-3.14就要变为-3。
向下取整就是向较小数方向取整。例如3.14就要变为3;-3.14就要变为-4。
大家可以将这三种方法看成如下图所示:
由此,我们也可以实际试验一下。
向上取整:
向下取整:
user()函数可以用于查询当前用户。
database()函数可以用于查询当前使用的数据库。
大家应该知道,数据库中是会保存用户信息的,其中就包括用户的账号密码。而用户的密码在数据库中保存的时候,是不能够以明文的方式保存的。必须进行加密。否则一旦数据库泄漏,就会导致严重的用户信息泄漏。因此,我们需要用特定的方法对密码加密。说是加密,其实就是用hash函数对用户密码做映射,形成一个字符串,将这个字符串保存在数据库内。
md5()就是一个数据加密函数。采用的就是md5加密方法。这个加密方法会将密码进行映射后形成一个长度为32字节的数字加字母字符串。
为了方便测试,创建如下一个user表:
如果我们直接向里面插入数据,就是以明文方式显示:
注意,如果大家在用sql语句时发现自己上翻下翻以前的语句时找不到sql语句,其实就是因为这条语句里面可能带有password,mysql会将带有这个字段的sql语句隐藏,不再显示。
很明显,明文保存是非常不安全的。此时,我们就可以用md5()加密:
此时就是一个32字节的字符串。当然,我们也可以用password()函数加密,效果是一样的。
只不过password()和md5()采用的加密算法不同。
当有用户登录时,账号密码就需要进行匹配。匹配方法也很简单,就是用同样的加密算法加密用户传过来的密码, 然后拿着账号和加密后的密码去数据库找即可。
ifnull(val1, val2)函数其实很像我们以前学的三目运算符。它的含义就是,如果val1是null,就显示val2;如果val1不是null,就显示val1。