无论任何语言都应该有自己的控制流程的函数,而Mysql 也是。其用到的关键字和其它的编程语言差不多也是IF,CASE等,所以本篇最重要的函数就是控制流程。
控制流程函数
流程控制说白了就是根据不同的条件,执行不同的处理流程。可以在SQL语句中实现不同的条件选择。所以下面还是先将常用的处理函数列出。
函数 | 作用 |
---|---|
IF(v,v1,v2) | 如果v的值为true,返回v1,否则返回v2 |
IFNULL(v1,v2) | 如果值为NULL,返回v1,否则返回v2 |
CASE WHEN 条件1 THEN 结果1 WHEN 条件2 THEN 结果2…[ELSE result] END | 这个说白了就是 if else if else的多个判断语句 |
CASE expr WHEN 常量1 THEN 值1 WHEN 常量2 THEN 值2…[ELSE 值n] END | 这个说白了就是 swich… case 的多个判断语句 |
现在开始演示。
SELECT empno, ename, job, mgr, hiredate, sal, comm,IF(comm<=>NULL,0,comm), deptno FROM test.emp
SELECT empno, ename, job, mgr, hiredate, sal, comm, IFNULL(comm,0), deptno FROM test.emp
SELECT empno, ename, job, mgr, hiredate, sal, comm, deptno,CASE WHEN sal>4000 THEN "可劲浪活着" WHEN sal>2000 THEN "潇洒活着" WHEN sal>500 THEN "凑活活着" ELSE "活着干嘛" END "瞎说而已" FROM test.emp
SELECT empno, ename, job, mgr, hiredate, sal, comm, deptno,CASE sal WHEN 5000 THEN "可劲浪活着" WHEN 3000 THEN "潇洒活着" WHEN 800 THEN "凑活活着" ELSE "活着干嘛" END "瞎说" FROM test.emp
加解密函数
比如在数据库中放的数据,比如用户名和密码,如果用明文的 话,很多的时候就会导致数据安全问题,比如别人拷贝了某网站的数据库,就可以登录很多人的账户了。 不过说实话啊,一般加密直接会在插入数据库之前就进行了,而不是通过mysq的函数进行加密。
现在看有什么常用的函数:
函数 | 作用 |
---|---|
PASSWORD(str) | 返回字符串的str的加密后数据,一般为长度41的字符串,加密不可逆,常用于用户的密码加密。版本8.0后被弃用了。所以不要在8.0版本中使用会报错。 |
MD5(str) | 返回字符串str的md5加密后的数据,若参数为NULL 返回的也是NULL |
SHA(str) | 从原明文密码str计算并返回加密后的密码字符串,当参数为NULL时,返回NULL,这个加密算法比MD5更安全 |
ENCODE(val,password) | 返回一个用password作为密码加密val后的值 |
DECODE(val,password) | 返回一个用password作为密码解密val后的值 |
还是下面进行演示:
SELECT PASSWORD(1) FROM DUAL;
如果在8.0中使用上面的sql语言会报错:
SELECT MD5(1),SHA(1) FROM DUAL;
无论时MD5加密还是SHA加密都是不可逆加密,其无法还原为原来的具体值。对于这个两个如果进行查询的话,只能通过加密后的值进行匹配。
SELECT ENCODE('1122','123'),DECODE(',�?P','123') FROM DUAL;
可以看出ENCODE和DECODE是一对加解密的方法。
msyql信息函数
这个就是查看一些mysql的信息函数,
函数 | 作用 |
---|---|
VERSION() | 返回当前的MYSQL的版本号 |
CONNECTION_ID() | 返回当前的MYSQL服务器的连接数 |
DATABASE(),SCHEMA() | 返回MYSQL命令的当前所在的数据库 |
USER(),CURRENT_USER(),SYSTEM_USER(),SESSION_USER() | 返回连接MYSQL的用户明,返回其格式为:主机@用户名 |
CHARSET(val) | 返回val自变量的字符集 |
COLLATION(val) | 返回vla的比较规则 |
这些还是直接演示:
SELECT VERSION(),CONNECTION_ID(),DATABASE(),SCHEMA() FROM DUAL;
SELECT USER(),CURRENT_USER(),SYSTEM_USER(),SESSION_USER() FROM DUAL;
SELECT CHARSET('dfdd'),COLLATION("dddd") FROM DUAL;
其它的一些函数
MYSQL中有些函数,无法对其进行具体的分类,但这些函数有在开发和运维中也是比较常用的。
函数 | 作用 |
---|---|
FORMAT(val,n) | 返回数字val进行格式化后的结果数据,n表示四舍五入后保留的小数点位数 |
CONV(val,from,to) | 将val的值进行不同禁止之间的转换 |
INET_ATOA(ipvalue) | 将以点分隔 的IP地址转换为一个数字 |
INET_NTOA(value) | 将数字形式的ip转化为以点分隔的IP地址 |
BENCHMARK(n,expr) | 将表示expr重复执行的n次,用于测试MYSQL处理expr表达式所耗费的时间 |
CONVERT(val USING char_code) | 将val所使用的字符编码修改为char_code |
现在开始演示:
SELECT FORMAT(1.12345,3),FORMAT(1234.567,0),FORMAT(1234.567,-1) FROM DUAL;
-- FORMAT(val,n) 中n如果小于0 其值保留就是正数
SELECT CONV(13,10,8),CONV(11111,2,10),CONV(NULL,10,2) FROM DUAL;
SELECT INET_ATON('192.168.1.1'),INET_NTOA(3232235777) FROM DUAL;
SELECT BENCHMARK(10000000,FORMAT(123.456,1)) FROM DUAL;
-- 因为某些函数执行的时候速度很快,无法查看时间,可以将其次数增加,然后反算执行一次的时间
SELECT CHARSET('abcd'),CHARSET(CONVERT("abcd" USING 'utf8mb4')) FROM DUAL;