MySQL之函数
♛素心♛ 人气:1
[TOC]
# 数学函数
| 函数 | 作用 |
| :------------------: | :----------------------------------------: |
| ABS(x) | 返回X的绝对值 |
| CEIL(x), CEILNG(x) | 返回大于或者等于x的最小整数 |
| FLOOR(x) | 返回小于或者等于x的最大整数 |
| RAND() | 返回0~1的随机数 |
| RAND(x) | 返回0~1的随机数,x值相同时返回的随机数相同 |
| SING(x) | 返回x的符号,x是负数还是0还是正数 |
| PI() | 返回圆周率 |
| TRUNCATE(x,y) | 返回数值x保留到小数点y位的值 |
| ROUND(x) | 返回离x最近的整数 |
| ROUND(x,y) | 保留x小数点y位,但截断时要进行四舍五入 |
| POW(x,y),POWER(x,y) | 返回x的y次方(x^y) |
| SQRT(x) | 返回x的平方根 |
| EXP(x) | 返回e的x次方(e^x) |
| MOD(x,y) | 返回x除以y的余数 |
| LOG(x) | 返回自然对数(以e为底的对数) |
| LOG10(x) | 返回以10为底的对数 |
| RADIANS(x) | 将角度转换成弧度 |
| DEGREES(x) | 将弧度转换为角度 |
| SIN(x) | 求正弦值 |
| ASIN(x) | 求反正弦值 |
| COS(x) | 求余弦值 |
| ACOS(x) | 求反余弦值 |
| TAN(x) | 求正切值 |
| ATAN(x),ATAN2(x) | 求反正切值 |
| COT(x) | 求余切值 |
```sql
select abs(-100),pi();
/*
+-----------+----------+
| abs(-100) | pi() |
+-----------+----------+
| 100 | 3.141593 |
+-----------+----------+
*/
select sqrt(16), mod(3,2);
/*
+----------+----------+
| sqrt(16) | mod(3,2) |
+----------+----------+
| 4 | 1 |
+----------+----------+
*/
select ceil(8.9), floor(8.9);
/*
+-----------+------------+
| ceil(8.9) | floor(8.9) |
+-----------+------------+
| 9 | 8 |
+-----------+------------+
*/
```
# 字符串函数
| 函数 | 作用 |
| :--------------------------------------------: | :-------------------------------------------: |
| CHAR_LENGTH(s) | 返回字符串s的字符数 |
| LENGTH(s) | 返回字符串s的长度 |
| CONCAT(s1, s2, ...) | 将字符串s1,s2等多个字符串合并为一个字符串 |
| CONCAT_WS(x,s1,s2,...) | 同上,但是在每个字符串直接要加上x |
| INSERT(s1, x, len, s2) | 将字符串s2替换s1的x位置开始长度为len的字符串 |
| UPPER(s),UCASE(s) | 将字符串s所有字母都变成大写字母 |
| LOWER(s),LCASE(s) | 将字符串s所有字母都变成小写字母 |
| LEFT(s,n) | 返回字符串s的前n个字符 |
| RIGHT(s,n) | 返回字符串s的后n个字符 |
| LPAD(s1, len, s2) | 字符串s2来填充s1的开始处,使字符串长度达到len |
| RPAD(s1, len, s2) | 字符串s2来填充s1的末尾处,使字符串长度达到len |
| LTRIM(s) | 去掉字符串s开始处的空格 |
| RTRIM(s) | 去掉字符串s结尾处的空格 |
| TRIM(s) | 去掉字符串s开始和结尾处的空格 |
| TRIM(s1 from s) | 去掉字符串s中开始和结尾处的字符串s1 |
| REPEAT(s,n) | 将祖父穿s重复n次 |
| SPACE(n) | 返回n个空格 |
| REPLACE(s,s1,s2) | 用字符串s2替代字符串s中的字符串s1 |
| STRMP(s1,s2) | 比较字符串s1和s2 |
| SUBSTRING(s, n, len),MID(s, n, len) | 获取字符串s中的n个位置开始长度为len的字符串 |
| LOCATE(s1, s),POSTION(s1, IN s),INSTR(s, s1) | 从字符串s获取s1的开始位置 |
| REVERSE(s) | 反转字符串s |
| ELT(n, s1, s2, ...) | 返回第n个字符串 |
```sql
select concat('sha', 'ng', 'hai'), concat_ws('-','sha', 'ng', 'hai');
/*
+----------------------------+-----------------------------------+
| concat('sha', 'ng', 'hai') | concat_ws('-','sha', 'ng', 'hai') |
+----------------------------+-----------------------------------+
| shanghai | sha-ng-hai |
+----------------------------+-----------------------------------+
*/
select insert('shanghai', 6, 3, 'mian');
/*
+----------------------------------+
| insert('shanghai', 6, 3, 'mian') |
+----------------------------------+
| shangmian |
+----------------------------------+
*/
select upper('mysql'), lower('MYSQL');
/*
+----------------+----------------+
| upper('mysql') | lower('MYSQL') |
+----------------+----------------+
| MYSQL | mysql |
+----------------+----------------+
*/
select reverse('abcdefg');
/*
+--------------------+
| reverse('abcdefg') |
+--------------------+
| gfedcba |
+--------------------+
*/
```
# 日期和时间函数
| 函数 | 作用 |
| :----------------------------------------------------------: | :---------------------------------------------: |
| CURDATE(), CURRENT_DATE() | 返回当前日期 |
| CURTIME(), CURRENT_TIME() | 返回当前时间 |
| NOW(), CURRENT_TIMESTAMP(), LOCALTIME(), SYSDATE(), LOCALTIMESTAMP() | 返回当前时间和日期 |
| UNIX_TIMESTAMP() | 以unix时间戳的形式返回当前时间 |
| UNIX_TIMESTAMP(D) | 将时间D以unix时间戳的形式返回 |
| FROM-UNIXTIME(D) | 把unix时间戳转换为普通格式的时间 |
| UTC_DATE() | 返回UTC日期 |
| UTC_TIME() | 返回UTC时间 |
| MONTH(d) | 返回日期d中的月份值 |
| MONTHNAME(d) | 返回日期d中的月份名称 |
| DAYNAME(d) | 返回日期d是星期几 |
| DAYOFWEEK(d) | 返回日期d是星期几,1表示星期日 |
| WEEKDAY(d) | 返回日期d是星期几,0表示星期一 |
| WEEK(d) | 计算日期d是本年的第几个星期,范围是0~53 |
| WEEKOFYEAR(d) | 计算日期d是本年的第几个星期,范围是1~53 |
| DAYOFYEAR(d) | 计算日期d是本年的第几天 |
| DAYOFMONTH(d) | 计算日期d是本月的第几天 |
| YEAR(d) | 返回日期d中的年份值 |
| QUARTER(d) | 返回日期d是第几季度,范围是1~4 |
| HOUR(t) | 返回时间t中的小时值 |
| MINUTE(t) | 返回时间t中的分钟值 |
| SECOND(t) | 返回时间t中的秒钟值 |
| EXTRACT(type FROM d) | 从日期d中获取指定的值,type指定返回的值,如year |
| TIME_TO_SEC(t) | 将时间转换成秒 |
| SEC_TO_TIME(t) | 将秒为时间单位的s转换成时分秒的格式 |
| TO_DAYS(d) | 计算日期d~0000年1月1日的天数 |
| FROM_DAYS(n) | 计算日期从0000年1月1日开始n天后的日期 |
| DATEDIFF(d1, d2) | 计算日期d1~d2之间相隔的天数 |
| ADDDATE(d, n), | 计算起始日期d加n天后的日期 |
| ADDDATE(d, INTERVAL, expr type),DATE_ADD(d, INTERVAL, expr type) | 计算起始日期d加上一个时间段后的日期 |
| SUBDATE(d, n) | 计算起始日期d减去n天的日期 |
| SUBDATE(d, INTERVAL, expr type) | 计算起始日期d减去一个时间段后的日期 |
| ADDTIME(t, n) | 计算起始时间t加上n秒的时间 |
| SUBTIME(t, n) | 计算起始时间t减去上n秒的时间 |
| DATE_FROMAT(d, f) | 按照表达式f的要求显示日期d |
| TIME_FROMAT(t, f) | 按照表达式f的要求显示时间t |
| GET_FROMAT(type, s) | 根据字符串s获取type类型数据的显示格式 |
```sql
select curdate(), current_time(), now();
/*
+------------+----------------+---------------------+
| curdate() | current_time() | now() |
+------------+----------------+---------------------+
| 2020-03-28 | 11:04:01 | 2020-03-28 11:04:01 |
+------------+----------------+---------------------+
*/
select month('2015-09-28 00:43:12');
/*
+------------------------------+
| month('2015-09-28 00:43:12') |
+------------------------------+
| 9 |
+------------------------------+
*/
```
# 条件判断函数
用于比较或者流程控制
## if
语法:`if(exp, v1, v2)`
```sql
select id,name,age,if(age > 18, '成年了', '未成年') from employee;
/*
+----+--------+------+----------------------------------------+
| id | name | age | if(age > 18, '成年了', '未成年') |
+----+--------+------+----------------------------------------+
| 1 | 刘备 | 26 | 成年了 |
| 2 | 孙权 | 15 | 未成年 |
| 3 | 曹操 | 25 | 成年了 |
| 4 | 大乔 | 12 | 未成年 |
| 5 | 孔明 | 15 | 未成年 |
+----+--------+------+----------------------------------------+
*/
```
## ifnull
语法:`ifnull (v1, v2)`
```sql
select id,name,address,ifnull(address, '地址不详') from employee;
/*
+----+--------+---------+---------------------------------+
| id | name | address | ifnull(address, '地址不详') |
+----+--------+---------+---------------------------------+
| 1 | 刘备 | 西蜀 | 西蜀 |
| 2 | 孙权 | 东吴 | 东吴 |
| 3 | 曹操 | 许昌 | 许昌 |
| 4 | 大乔 | 东吴 | 东吴 |
| 5 | 孔明 | NULL | 地址不详 |
+----+--------+---------+---------------------------------+
*/
```
## case
### 第一种
语法:`case when exp1 then v1 [when expr2 then v2] ... else vn end`
```sql
select id,name,case when age > 12 then '小学生' when age > 18 then '成年' else '未成年' end from employee;
/*
+----+--------+--------------------------------------------------------------------------------------+
| id | name | case when age > 12 then '小学生' when age > 18 then '成年' else '未成年' end |
+----+--------+--------------------------------------------------------------------------------------+
| 1 | 刘备 | 小学生 |
| 2 | 孙权 | 小学生 |
| 3 | 曹操 | 小学生 |
| 4 | 大乔 | 未成年 |
| 5 | 孔明 | 小学生 |
+----+--------+--------------------------------------------------------------------------------------+
*/
select id,name,case when age > 12 then '小学生' else '未成年' end as '年龄阶段' from employee;
/*
+----+--------+--------------+
| id | name | 年龄阶段 |
+----+--------+--------------+
| 1 | 刘备 | 小学生 |
| 2 | 孙权 | 小学生 |
| 3 | 曹操 | 小学生 |
| 4 | 大乔 | 未成年 |
| 5 | 孔明 | 小学生 |
+----+--------+--------------+
*/
```
### 第二种
语法:`case expr1 when e1 then v1 [when e2 then v2] ... else vn end`
# 系统信息
| 函数 | 作用 |
| :---------------------------------: | :----------------------------: |
| VERSION() | 返回数据库的版本号 |
| CONNECTION_ID() | 返回服务器的连接数 |
| DATABASE(), SCHEMA() | 返回当前数据库名 |
| USER(), STSTEM_USER, SESSION_USER() | 返回当前用户 |
| CURRENT_USER(), CURRENT_USER | 返回当前用户 |
| CHARSET(str) | 返回字符串的str的字符集 |
| COLLATION(str) | 返回字符串str的字符排列方式 |
| LAST_INSERT_ID() | 返回最近生产的auto_increment值 |
![](https://s1.ax1x.com/2020/03/28/GkPPat.png)
![](https://s1.ax1x.com/2020/03/28/GkPKZn.png)
# 加密函数
## PASSWORD()
![](https://s1.ax1x.com/2020/03/28/GkiVFx.png)
## MD5()
![](https://s1.ax1x.com/2020/03/28/GkF94P.png)
## ENCODE()
语法:`encode(str, pwd_str)`
![](https://s1.ax1x.com/2020/03/28/GkFkjg.png)
如果要存储,则需要存储的字段类型为`blog`
## DECODE()
语法:`decode(str, pwd_str)`
![](https://s1.ax1x.com/2020/03/28/GkF8u4.png)
只能对encode编码之后的字符进行解码
# 其他函数
## format
语法:`format(x, n)`
对x进行格式化保留n位小数
```sql
select format(3.1415926), format(3.1415926, 1);
/*
+----------------------+----------------------+
| format(3.1415926, 3) | format(3.1415926, 1) |
+----------------------+----------------------+
| 3.142 | 3.1 |
+----------------------+----------------------+
*/
```
## IP地址和数字转换
`inet_aton(ip)`
`inet_ntoa(n)`
```sql
select inet_aton('192.168.1.1'), inet_ntoa(3232235777);
/*
+--------------------------+-----------------------+
| inet_aton('192.168.1.1') | inet_ntoa(3232235777) |
+--------------------------+-----------------------+
| 3232235777 | 192.168.1.1 |
+--------------------------+-----------------------+
*/
```
## 重复执行指定操作函数
语法:`benchmark(n, expr)`
```sql
select benchmark(1000, now());
/*
+------------------------+
| benchmark(1000, now()) |
+------------------------+
| 0 |
+------------------------+
*/
```
加载全部内容