一、数学函数
abs(x)
返回绝对值bin(x)
返回x二进制(oct 八进制,hex 十六进制)floor()
返回小于x的最大整数ceiling(x)
返回大于x的最小整数exp(x)
返回e的x次方(e,自然对数函数的底数 lnx, 约2.718281828459045…)
mysql> select exp(1);
+-------------------+
| exp(1) |
+-------------------+
| 2.718281828459045 |
+-------------------+
RAND()
,RAND(N)
返回一个随机浮点值 v ,范围在 0 到1 之间 (即, 其范围为 0 ≤ v ≤ 1.0)。
若已指定一个整数参数 N ,则它被用作种子值,用来产生重复序列。
mysql> select rand();
+--------------------+
| rand() |
+--------------------+
| 0.7019567384402796 |
+--------------------+
LOCATE(substr,str) , LOCATE(substr,str,pos)
第一个语法返回字符串 str中子字符串substr的第一个出现位置。
第二个语法返回字符串 str中子字符串substr的第一个出现位置, 起始位置在pos。
如若substr 不在str中,则返回值为0。
mysql> select locate('世','你好 世界');
+--------------------------+
| locate('世','你好 世界') |
+--------------------------+
| 4 |
+--------------------------+
mysql> select locate('a','hello world');
+---------------------------+
| locate('a','hello world') |
+---------------------------+
| 0 |
+---------------------------+
POSITION(substr IN str)
返回字符串第一次出现的位置
mysql> select position('@' in '[email protected]');
+---------------------------------+
| position('@' in '[email protected]') |
+---------------------------------+
| 4 |
+---------------------------------+
right(str,len)
从字符串 str 右边开始,返回 len 个字符。
mysql> select right('hello world',3);
+------------------------+
| right('hello world',3) |
+------------------------+
| rld |
+------------------------+
//取出@后缀
mysql> select id,email,right(email,length(email)-position('@' in `email`)) as hz
from email;
+------+-----------------+-----------+
| id | email | hz |
+------+-----------------+-----------+
| 1 | [email protected] | qq.com |
| 2 | [email protected] | sina.cn |
| 3 | [email protected] | gmail.com |
+------+-----------------+-----------+
所以存储的时候可以把email以@为界,分别存储在两个列中,在想查询后缀的时候可省去以上,优化了数据库查询
二、聚合函数
group_concat(col)
返回属于一组的列值连接组合而成的结果
mysql> select goods_id,cat_id from goods where cat_id=24;
+----------+--------+
| goods_id | cat_id |
+----------+--------+
| 69 | 24 |
| 70 | 24 |
| 72 | 24 |
| 64 | 24 |
| 63 | 24 |
| 61 | 24 |
| 62 | 24 |
| 68 | 24 |
+----------+--------+
mysql> select group_concat(goods_id,'') from goods where cat_id=24;
+---------------------------+
| group_concat(goods_id,'') |
+---------------------------+
| 69,70,72,64,63,61,62,68 |
+---------------------------+
三、字符串函数
ascii(char)
返回字符串的ASCII码值
mysql> select ascii('a');
+------------+
| ascii('a') |
+------------+
| 97 |
+------------+
length(str)
返回字符串str的字节数
mysql> select length('hello world');
+-----------------------+
| length('hello world') |
+-----------------------+
| 11 |
+-----------------------+
mysql> select length('你好 世界'); //gbk编码的字符,空格占两个字节
+---------------------+
| length('你好 世界') |
+---------------------+
| 9 |
+---------------------+
mysql> select tid,tname,length(tname) from t; //utf8编码的字符占三个字节
+------+----------+---------------+
| tid | tname | length(tname) |
+------+----------+---------------+
| 1 | 国安 | 6 |
| 2 | 甲花 | 6 |
| 3 | 公益联队 | 12 |
+------+----------+---------------+
char_length(str)
返回字符串str的字符数
mysql> select tid,tname,length(tname),char_length(tname) from t;
+------+----------+---------------+--------------------+
| tid | tname | length(tname) | char_length(tname) |
+------+----------+---------------+--------------------+
| 1 | 国安 | 6 | 2 |
| 2 | 甲花 | 6 | 2 |
| 3 | 公益联队 | 12 | 4 |
+------+----------+---------------+--------------------+
reverse(str)
反转字符串str
mysql> select tid,tname,reverse(tname) from t;
+------+----------+----------------+
| tid | tname | reverse(tname) |
+------+----------+----------------+
| 1 | 国安 | 安国 |
| 2 | 甲花 | 花甲 |
| 3 | 公益联队 | 队联益公 |
+------+----------+----------------+
四、日期函数
now()
获取当前日期和时间
mysql> select now();
+---------------------+
| now() |
+---------------------+
| 2018-05-16 13:47:51 |
+---------------------+
curdate(),current_date()
返回当前日期
mysql> select curdate();
+------------+
| curdate() |
+------------+
| 2018-05-16 |
+------------+
curdate(),current_date()
返回当前时间
mysql> select curtime();
+-----------+
| curtime() |
+-----------+
| 13:50:14 |
+-----------+
dayofweek(date)
返回 date 在那周的第几天
mysql> select dayofweek('2018-05-16');
+----------------------+
| dayofweek(curdate()) |
+----------------------+
| 4 |
+----------------------+
//注意:周日是第一天
week(date)
返回日期 date 在当年的第几周
mysql> select week(curdate());
+-----------------+
| week(curdate()) |
+-----------------+
| 19 |
+-----------------+
问:按周统计加班时间
如下表,1~5 的 num 相加,6~12 的 num 相加
mysql> select * from overtime;
+------+------------+
|num | date |
+------+------------+
| 5 | 2018-05-01 |
| 6 | 2018-05-02 |
| 7 | 2018-05-03 |
| 8 | 2018-05-04 |
| 9 | 2018-05-05 |
| 10 | 2018-05-06 |
| 11 | 2018-05-07 |
| 12 | 2018-05-08 |
| 13 | 2018-05-09 |
| 14 | 2018-05-10 |
| 15 | 2018-05-11 |
| 16 | 2018-05-12 |
+------+------------+
答:
mysql> select sum(num) as overtime,week(dt) as wk from overtime group by wk;
+----------+------+
| overtime | wk |
+----------+------+
| 35 | 17 |
| 91 | 18 |
+----------+------+
五、加密函数
md5(str)
计算字符串str的md5效验和
mysql> select md5('123');
+----------------------------------+
| md5('123') |
+----------------------------------+
| 202cb962ac59075b964b07152d234b70 |
+----------------------------------+
//该加密算法不可逆
良好的加密:
1.不可逆。 即不可以根据加密后的值逆推原值
2.碰撞性底。 即两个加密后的值重复的可能性底
六、流程控制函数
CASE value
WHEN [compare-value] THEN result
[WHEN [compare-value] THEN result ...]
[ELSE result] ENDCASE WHEN [condition] THEN result
[WHEN [condition] THEN result ...]
[ELSE result] END在第一个方案的返回结果中, value=compare-value。
第二个方案的返回结果是第一种情况的真实结果。
如果没有匹配的结果值,则返回结果为ELSE后的结果,如果没有ELSE 部分,则返回值为 NULL。
mysql> select * from b;
+------+------+
| id | num |
+------+------+
| b | 5 |
| c | 10 |
| d | 15 |
| e | NULL |
+------+------+
4 rows in set (0.00 sec)
mysql> SELECT
-> id,
-> CASE `num`
-> WHEN 5 THEN
-> '值5'
-> WHEN 10 THEN
-> 10
-> WHEN 15 THEN
-> '值15'
-> ELSE
-> '其他值'
-> END AS nums
-> FROM
-> b;
+------+--------+
| id | nums |
+------+--------+
| b | 值5 |
| c | 10 |
| d | 值15 |
| e | 其他值 |
+------+--------+
4 rows in set, 1 warning (0.01 sec)
mysql> SELECT
-> id,
-> CASE
-> WHEN num THEN
-> 1
-> ELSE
-> 0
-> END AS nums
-> FROM
-> b;
+------+------+
| id | nums |
+------+------+
| b | 1 |
| c | 1 |
| d | 1 |
| e | 0 |
+------+------+
4 rows in set (0.00 sec)
IF(expr1,expr2,expr3)
如果 expr1 是TRUE (expr1 <> 0 and expr1 <> NULL),则 IF()的返回值为expr2; 否则返回值则为 expr3。
mysql> SELECT
-> id,
-> IF (num = 5, '值5', '其他') AS num
-> FROM
-> b;
+------+------+
| id | num |
+------+------+
| b | 值5 |
| c | 其他 |
| d | 其他 |
| e | 其他 |
+------+------+
4 rows in set, 1 warning (0.00 sec)
IFNULL(expr1,expr2)
假如expr1 不为 NULL,则 IFNULL() 的返回值为 expr1; 否则其返回值为 expr2。
mysql> SELECT
-> id,
-> IFNULL (num,'expr1为NULL') AS num
-> FROM
-> b;
+------+-------------+
| id | num |
+------+-------------+
| b | 5 |
| c | 10 |
| d | 15 |
| e | expr1为NULL |
+------+-------------+
4 rows in set (0.00 sec)
NULLIF(expr1,expr2)
如果expr1 = expr2 成立,那么返回值为NULL,否则返回值为 expr1。
mysql> SELECT
-> id,
-> NULLIF (num,5) as num
-> FROM
-> b;
+------+------+
| id | num |
+------+------+
| b | NULL |
| c | 10 |
| d | 15 |
| e | NULL |
+------+------+
4 rows in set (0.00 sec)
七、系统函数
user()
返回用户及所在主机,判断自己身份
mysql> select user();
+----------------+
| user() |
+----------------+
| root@localhost |
+----------------+
1 row in set (0.00 sec)
database()
返回当前正在操作的数据库
mysql> select database();
+------------+
| database() |
+------------+
| test |
+------------+
1 row in set (0.00 sec)
version()
返回当前数据库版本
mysql> select version();
+-----------+
| version() |
+-----------+
| 5.5.53 |
+-----------+
1 row in set (0.03 sec)
使用mysql函数会影响查询速度,应通过表结构等减少函数的使用