字符处理函数
length() // 返回字节数
char_length() // 返回字符数
convert(字段 using utf8) // 字符集转换
locate(str, 字段) // 类似 index(), 返回0/位置
// 比较a、b的大小。若 a 大于、等于或小于 b 时,返回`1/0/-1`
strcmp(a, b)
// 拼接
concat(a, b)
concat_ws(<分隔符>, a, b, ...)
// 计数
sum(1)
count(*)
// 用于类型转换
// 可在 information_schema.columns 表的 data_type 字段查询可选类型
cast(字段 as 类型)
注:
- MySQL字符处理函数很多与# Oracle是相同的,只是参数列表可能略有不同。
- 如
instr(),返回位置也是从1开始,而不是0。
非空判断函数
// 若 a 为 null,返回`1`,否则返回`0`
isnull(a)
// 若 a 为 null,返回 b,否则返回 a
ifnull(a, b)
// 同 Oracle 中的 `nullif()`
nullif()
// 同 Oracle 中的`case...`
case...when...then
// 返回第一个非 null 的值
coalesce(a, b, ...)
// 若 a 为 true,返回 b,否则返回 c
if(a, b, c)`
时间函数
// 自定义时间格式
// 格式如:'%Y-%c-%d' → '2024-08-05'
date_format(字段, <格式>)
sysdate() // 返回当前时间
now() // 返回当前时间
curdate() // 返回当前日期
curtime() // 返回当前时间
sleep(seconds) // 类型Java中的Thread.sleep()
1:sysdate()与now()有什么区别?
前者返回的是函数执行的时间,而后者返回的是函数所在语句执行的时间。如:
select sysdate(), sleep(2), sysdate() from dual;
获取的两个时间不同,且相差2秒。若都改为now(),则相同。
Note:
1:为何在使用索引查询时不用sysdate()?
有些场景下,可能会在时间字段(如create_time)上建立索引,进而在查询时使用时间函数设置时间区间。
选用now(),而非sysdate(),因为后者的不确定性导致它不能作为验证条件(不走索引)。
分组统计相关函数
// 汇总字段1,默认由','分隔,可与 group by 连用
group_concat(字段1 [order by 字段2][separator '<分隔符>'])
// 置于 group by 后,用于统计所有分组,
// 注:未使用“统计类”函数的列将显示 null 或最后一个分组的数据
with rollup
// 查找,返回0/1
// list 的格式类似Java中的“可变参数”,如使用 group_concat() 生成的(前提:分隔符是',')
find_in_set(str, list)
其他函数
uuid() // 返回UUID
// 返回 0~1 的随机小数,
// 与 order by 连用时可实现随机排序(后续补充)
rand()
本文持续更新中。。。