【MySQL】内置函数

51 阅读2分钟

字符处理函数

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 类型)

注:

  1. MySQL字符处理函数很多与# Oracle是相同的,只是参数列表可能略有不同。
  2. 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()

本文持续更新中。。。