目录
[1. 日期函数](#1. 日期函数)
[2. 字符串函数](#2. 字符串函数)
[3. 数学函数](#3. 数学函数)
[4. 其他函数](#4. 其他函数)
在mysql中其实内置了很多的函数操作,这些函数可以让我们在数据统计的时候以及查表的时候进行各自各样的操作。
1. 日期函数
|-----------------------------------------|-----------------------------------------------------------------------|
| 函数名称                                    | 描述                                                                    |
| current_date()                        | 获取当前日期                                                                |
| current_time()                        | 获取当前时间                                                                |
| current_timestamp()                   | 获取当前时间戳                                                               |
| date(datetime)                        | 返回 datetime 参数的日期部分                                                 |
| date_add(date, interval d_value_type) | 在 date 中添加日期或时间,interval 后的数值单位可以是 year、minute、second、day |
| date_sub(date, interval d_value_type) | 在 date 中减去日期或时间,interval 后的数值单位可以是 year、minute、second、day |
| datediff(date1, date2)                | 计算两个日期之间的差值,单位是天                                                      |
| now()                                 | 获取当前日期时间                                                              |
示例
- 
获取当前日期
SELECT current_date();
 - 
获取当前时间
SELECT current_time();
 - 
获取当前时间戳
SELECT current_timestamp();
 - 
获取当前日期时间
SELECT now();
 - 
截断当前时间,只获得日期部分
SELECT date(now());
 - 
在日期的基础上加日期
SELECT date_add(now(), interval 10 year);
 - 
在日期的基础上减去时间
SELECT date_sub(now(), interval 10 minute);
 - 
计算两个日期之间相差多少天
SELECT datediff(now(), '1949-10-01');
 
前面减后面
这些函数有什么用呢,下面有两个案例
案例
- 
创建一张记录生日的表
CREATE TABLE tmp(
id INT PRIMARY KEY AUTO_INCREMENT,
birthday DATE NOT NULL
); 
虽然current_time()这里显示的是时分秒,实际上插入的时候也能插入,所有的时间在获取的时候都是年月日 时分秒,只不过显示时是不一样的。
但是不建议这样使用。

- 创建一个留言表
 
平常我们评论的时候不仅有内容显示出来,还有对应的时间。
CREATE TABLE msg(
    id INT PRIMARY KEY AUTO_INCREMENT,
    content VARCHAR(100) NOT NULL,
    sendtime DATETIME
);
        - 
显示所有留言信息,发布日期只显示日期
SELECT content, date(sendtime) FROM msg;
 

⭕ 查询在 2分钟内****发布的帖子
SELECT * FROM msg WHERE date_add(sendtime, interval 2 minute) > now();
        
2. 字符串函数
|--------------------------------------------------|--------------------------------------|
| 函数名称                                             | 描述                                   |
| charset(str)                                   | 返回字符串字符集(编码集)                        |
| concat(string [,...])                          | 连接字符串                                |
| instr(string, substring)                       | 返回子字符串在字符串中的位置,无则返回0 (mysql 起始从 1 开始 |
| ucase(string)                                  | 转换成大写                                |
| lcase(string)                                  | 转换成小写                                |
| left(string, length)                           | 从字符串左边起取 length 个字符                |
| right(string, length)                          | 从字符串右边起取 length 个字符                |
| length(string)                                 | 字符串长度                                |
| replace(str, search_str, replace_str)          | 在字符串中用 replace_str 替换 search_str |
| strcmp(string1, string2)                       | 逐字符比较两个字符串大小                         |
| substring(str, position [,length])             | 从字符串的 position 开始,取 length 个字符   |
| ltrim(string), rtrim(string), trim(string) | 去除前后空格                               |
示例
- 
获取
emp表的ename列的字符集SELECT charset(ename) FROM emp;
 - 
连接字符串
SELECT concat(name, '的语文是', chinese, '分,', '数学', math, '分,', '英语', english, '分') FROM exam_result;
 
要求显示exam_result表中的信息,显示格式:"XXX的语文是XXX分,数学XXX分,英语XXX分"

求学生表中学生姓名占用的字节数
select length(name) from exam_result;
        以前说过mysql的字符真的就是一个字符,utf8中一个汉字占3个字节。
length函数返回字符串长度,以字节为单位。如果是多字节字符则计算多个字节数;如果是单字节字符则算作一个字节。比如:字母,数字算作一个字节,中文表示多个字节数(与字符集编码有关)

- 
截取
emp表中ename字段的第二个到第三个字符SELECT ename, substring(ename, 2, 2) FROM emp;
 - 
以首字母小写的方式显示所有员工的姓名
SELECT ename, concat(lcase(substring(ename, 1, 1)), substring(ename, 2)) FROM emp;
 
substring(ename, 1, 1) 从第一个开始,截一个字符

3. 数学函数
|------------------------------------|------------------------|
| 函数名称                               | 描述                     |
| abs(number)                      | 绝对值函数                  |
| bin(decimal_number)              | 十进制转二进制                |
| hex(decimalNumber)               | 转换成十六进制                |
| conv(number, from_base, to_base) | 进制转换                   |
| ceiling(number)                  | 向上去整(数据变大              |
| floor(number)                    | 向下去整                   |
| format(number, decimal_places)   | 格式化,保留小数位数             |
| rand()                           | 返回随机浮点数,范围 [0.0, 1.0) |
| mod(number, denominator)         | 取模,求余                  |
- ceiling(number) 向上去整
 - floor(number) 向下去整
 
一般我进行取整的时候是进行四舍五入取整,但是除了四舍五入还有其他的取整方式。
我们把丢弃小数部分的取整方式称为0向取整,以前我们在 C学的9/2=4 就是0向取整
还有向大的方向取的向上取整、向小的方向取的向下取整

4. 其他函数
- 
查询当前用户
SELECT user();
 - 
显示当前正在使用的数据库
SELECT database();
 - 
对一个字符串进行 MD5 摘要
 
md5(str)对一个字符串进行md5摘要,摘要后得到一个32位字符串
比如密码在数据库绝对不能是明文保存的。万一表结构泄漏了,用户信息就全部被泄漏了。
这里有一个细节mysql对于sql里面涉及核心密码password关键字之类的这个sql语句就不会被保存,不能上翻下翻了
密码被变成固定32位字符串,就不用担心密码被泄漏了。但是登录的时候也必须是数据库的摘要密码。
SELECT MD5(str);
        
- MySQL 密码函数
 
除了md5进行保存密码之外,数据库还提供更复杂的密码设定的函数。
password()函数,MySQL数据库使用该函数对用户加密
在数据库设密码通常用的更多的是password()
SELECT PASSWORD(str);
        
- 条件判断函数
 
ifnull(val1, val2) 如果val1为null,返回val2,否则返回val1的值
类似于三目操作符 ? : 为真返回第一个,为假返回第二个
IFNULL(val1, val2) -- 如果 `val1` 为 `NULL`,返回 `val2`,否则返回 `val1` 的值
        
以上函数提供了丰富的操作能力,使得在处理数据时更加灵活和方便~