格式化函数
FORMAT(x, n)
例:将数字x进行格式化,以四舍五入的方式保留n位小数,结果以字符串的形式返回
1. mysql> select format(12.3456,3),format(2.2,4),format(9.333,0); 2. +-------------------+---------------+-----------------+ 3. | format(12.3456,3) | format(2.2,4) | format(9.333,0) | 4. +-------------------+---------------+-----------------+ 5. | 12.346 | 2.2000 | 9 | 6. +-------------------+---------------+-----------------+ 7. 1 row in set (0.00 sec)
不同进制的数字进行转换的函数
CONV()
例:用于不同进制数之间的转换
1. mysql> select conv('a',16,2), # 将16进制的a转换为2进制 2. -> conv(15,10,2), # 将10进制的15转换为2进制 3. -> conv(15,10,8), # 将10进制的15转换为8进制 4. -> conv(15,10,16); # 将10进制的15转换为16进制 5. +----------------+---------------+---------------+----------------+ 6. | CONV('a',16,2) | CONV(15,10,2) | CONV(15,10,8) | CONV(15,10,16) | 7. +----------------+---------------+---------------+----------------+ 8. | 1010 | 1111 | 17 | F | 9. +----------------+---------------+---------------+----------------+
IP 地址与数字互相转换的函数
INET_ATON(expr) 、INET_NTOA(expr)
例1:INET_ATON(expr) 用于将网络地址转换为一个代表该地址数值的整数
1. mysql> select inet_aton('192.168.1.1'); 2. +--------------------------+ 3. | inet_aton('192.168.1.1') | 4. +--------------------------+ 5. | 3232235777 | 6. +--------------------------+ 7. 1 row in set (0.00 sec)
例2:INET_NTOA(expr)将一个整数转换为网络地址,如果超过10位数值则返回null
1. mysql> select inet_ntoa('3232235777'); 2. +-------------------------+ 3. | inet_ntoa('3232235777') | 4. +-------------------------+ 5. | 192.168.1.1 | 6. +-------------------------+ 7. 1 row in set (0.00 sec)
加锁函数和解锁函数
GET_LOCK(str, timeout) 、RELEASE_LOCAK(str) 、 IS_FREE_LOCK(str) 、IS_USED_LOCK(str)
例1:GET_LOCK(str, timeout) 使用字符串 str 来得到一个锁,持续时间 timeout 秒
- 若成功得到锁,则返回 1
- 若操作超时,则返回 0
- 若发生错误,则返回 NULL
1. mysql> select get_lock('lock1',10); 2. +----------------------+ 3. | get_lock('lock1',10) | 4. +----------------------+ 5. | 1 | # 返回结果为1,说明成功得到了一个名称为'lock1'的锁,持续时间为10秒 6. +----------------------+ 7. 1 row in set (0.03 sec)
例2:RELEASE_LOCAK(str) 用于解开被 GET_LOCK() 获取的,用字符串 str 所命名的锁
- 若锁被解开,则返回 1
- 若该线程尚未创建锁,则返回 0
- 若命名的锁不存在,则返回 NULL
- 若该锁从未被 GET_LOCK() 的调用获取,或锁已经被提前解开,则该锁不存在返回null
1. mysql> select release_lock('lock1'); 2. +-----------------------+ 3. | release_lock('lock1') | 4. +-----------------------+ 5. | 1 | # 返回值为1说明解锁成功 6. +-----------------------+ 7. 1 row in set (0.00 sec)
例3:IS_FREE_LOCK(str) 检查名为 str 的锁是否可以使用
- 若锁可以使用,则返回 1
- 若锁正在被使用,则返回 0
- 若出现错误,则返回 NULL
1. mysql> select is_free_lock('lock1'); 2. +-----------------------+ 3. | is_free_lock('lock1') | 4. +-----------------------+ 5. | 1 |# 返回值为1说明锁可以使用 6. +-----------------------+ 7. 1 row in set (0.02 sec)
例4:IS_USED_LOCK(str) 用于检查名为 str 的锁是否正在被使用,若被封锁,则返回使用该锁的客户端的连接标识符,否则返回 NULL
1. mysql> select is_used_lock('lock1'); 2. +-----------------------+ 3. | is_used_lock('lock1') | 4. +-----------------------+ 5. | 4 | # 返回结果为当前连接ID(每台主机返回的不同,可以用CONNECTION_ID()函数查看本机id),表示名称为'lock1'的锁正在被使用 6. +-----------------------+ 7. 1 row in set (0.00 sec) 8. 9. mysql> select is_used_lock('a'); 10. +-------------------+ 11. | is_used_lock('a') | 12. +-------------------+ 13. | NULL | 14. +-------------------+ 15. 1 row in set (0.00 sec)
重复执行指定操作的函数
BENCHMARK(count, expr)
例:BENCHMARK(count, expr) 用于重复 count 次执行表达式 expr
- 可以用于计算 MySQL 处理表达式的速度
- 可以在 MySQL 客户端内部报告语句执行的时间
1. mysql> select password('new_pass'); 2. +-------------------------------------------+ 3. | password('new_pass') | 4. +-------------------------------------------+ 5. | *B6408F4D32E8BEC631EF224B6F743F3340E6E744 | 6. +-------------------------------------------+ 7. 1 row in set, 1 warning (0.00 sec) # 执行一次加密用时0.00秒 8. 9. mysql> select benchmark(5000000,password('new_pass')); 10. +-----------------------------------------+ 11. | benchmark(5000000,password('new_pass')) | 12. +-----------------------------------------+ 13. | 0 | 14. +-----------------------------------------+ 15. 1 row in set, 1 warning (1.12 sec) # 执行五百万次加密用时1.12秒
改变字符集的函数
CONVERT(... USING ...)
例:用于改变字符串的默认字符集
1. mysql> select charset('abc'); 2. +----------------+ 3. | charset('abc') | 4. +----------------+ 5. | utf8 | # 默认utf8字符集 6. +----------------+ 7. 1 row in set (0.01 sec) 8. 9. mysql> select charset(convert('abc' using latin1)); 10. +--------------------------------------+ 11. | charset(convert('abc' using latin1)) | 12. +--------------------------------------+ 13. | latin1 | #修改后字符集为latin1 14. +--------------------------------------+ 15. 1 row in set (0.01 sec)
改变数据类型的函数
CAST(x, AS type) 、CONVERT(x, type)
例1:CAST(x, AS type) 用于将一个数据类型的值转换为另一个数据类型的值 CONVERT(x, type) 用于将一个数据类型的值转换为另一个数据类型的值
mysql> select cast(100 as char(2)); # 将整数类型100转换为带有两个显示宽度的字符串类型,结果为'10'
1. +----------------------+ 2. | cast(100 as char(2)) | 3. +----------------------+ 4. | 10 | 5. +----------------------+ 6. 1 row in set, 1 warning (0.01 sec)
例2:CONVERT(x, type) 用于将一个数据类型的值转换为另一个数据类型的值
1. mysql> select convert(100,char(2));# 将整数类型的100转换为带有两个显示宽度的字符串类型,结果为'10' 2. +----------------------+ 3. | convert(100,char(2)) | 4. +----------------------+ 5. | 10 | 6. +----------------------+ 7. 1 row in set, 1 warning (0.00 sec)
流程控制函数
流程处理函数可以根据不同的条件,执行不同的处理流程,可以在SQL语句中实现不同的条件选择。主要包括if、ifnull、case。
函数名称(流程控制函数) |
作用 |
IF |
判断,流程控制 |
IFNULL |
判断是否为空 |
CASE |
搜索语句 |
IF()
IF(expr, a1, a2)
例:如果expr值成立则返回a1,不成立则返回a2
1. mysql> select if(1>2,'大于','错误'); 2. +---------------------------+ 3. | if(1>2,'大于','错误') | 4. +---------------------------+ 5. | 错误 | 6. +---------------------------+ 7. 1 row in set (0.01 sec)
IFNULL()
IFNULL(a1, a2)
例:如果a1不为空则返回a1;如果a1为空,则返回a2
1. mysql> select ifnull(1,2),ifnull(null,2); 2. +-------------+----------------+ 3. | ifnull(1,2) | ifnull(null,2) | 4. +-------------+----------------+ 5. | 1 | 2 | 6. +-------------+----------------+ 7. 1 row in set (0.01 sec)
CASE
SELECT CASE a1 WHEN a2 THEN 'one' WHEN a3 THEN 'two' ELSE 'more' END;
例:如果a1等于a2,则返回'one',不等于则进行下一个匹配;如果a1等于a3,则返回'two',不等于则执行ELSE(否则)返回'more',END结束
1. mysql> select case 2 when 1 then 'one' when 2 then 'two' else 'more' end; 2. +------------------------------------------------------------+ 3. | case 2 when 1 then 'one' when 2 then 'two' else 'more' end | 4. +------------------------------------------------------------+ 5. | two | 6. +------------------------------------------------------------+ 7. 1 row in set (0.00 sec) 8. 9. mysql> select case 10 when 1 then 'one' when 2 then 'two' else 'more' end; 10. ; 11. +-------------------------------------------------------------+ 12. | case 10 when 1 then 'one' when 2 then 'two' else 'more' end | 13. +-------------------------------------------------------------+ 14. | more | 15. +-------------------------------------------------------------+ 16. 1 row in set (0.00 sec)