函数概念:如果学过编程语言,那这个就很好理解,mysql的函数就和编程语言的内置关键字一样,都是官方提前编译好了给我们使用的,如python的print函数,如java的println函数。没学过编程也不难,就把它理解成mysql的关键字就行,它本来也就是关键字,各有各的功能,我们拿来用就行。
1. 字符串函数
2. 数值函数
3. 日期函数
4. 流程函数
函数名 | 功能 |
CONCAT(str1, str2) | 将多个字符连接在一起 |
UPPER(str) | 将小写转成大写 |
LOWER(str) | 将大写转成小写 |
LENGTH(str) | 获取字符串长度 |
LEFT(str, len) | 从字符串的左边开始提取指定长度的字符,并返回结果。 |
RIGHT(str, len) | 从字符串的右边开始提取指定长度的字符,并返回结果。 |
SUBSTRING(str, pos) | 提取字符串中从指定位置开始的子字符串,并返回结果。 |
TRIM(str) | 去除字符串两端的空格,并返回处理后的结果。 |
REPLACE(str, old, new) | 在字符串中替换指定的子串为新的子串,并返回结果。 |
INSTR(str, substr) | 返回子串在字符串中第一次出现的位置,如果不存在则返回 0。 |
LPAD(str, len, pad) | 将字符串左对齐,并在左侧填充指定字符,直到达到指定长度。 |
RPAD(str, len, pad) | 将字符串右对齐,并在右侧填充指定字符,直到达到指定长度。 |
REVERSE(str) | 反转字符串中的字符顺序,并返回结果。 |
SUBSTRING_INDEX(str, delimiter, count) | 在字符串中根据指定的分隔符提取指定次数的子串,并返回结果。 |
是有点多,但是你不用记,想用就查一下就行,不是很难。这些函数有什么用呢?那就大有用处啦,假如让你写一段sql,查询今天的销量,这时你的日期不能写死吧?不然你今天写的sql拿到明天就不能用了,这时函数就可以派上用场了,它可以自动获取当天的日期,懂得都懂了哈。
这里就讲解前5个函数的功能,
常见的数值函数 | |
函数关键字 | 功能 |
ABS(x) | 取绝对值,即去掉其负号。 |
ROUND(x,d) | 按x取四舍五入,d保留小数的位数 |
FLOOR(x) | 向下取整 |
CEILING(x) | 向上取整 |
RAND() | 返回一个0~1之内随机数。 |
MOD(x, y) | 取余 |
POWER(x, y) | 返回 x 的 y 次幂。 |
SQRT(x) | 返回给定数值的平方根。 |
SIGN(x) | 返回给定数值的符号。如果 x 是正数,则返回 1;如果 x 是负数,则返回 -1;如果 x 是 0,则返回 0。 |
TRUNCATE(x, d) | 将给定数值按指定的小数位数截断。 |
LOG(x) | 返回给定数值以自然对数(底数为 e)为基的对数值。 |
LOG10(x) | 返回给定数值以 10 为基的对数值。 |
EXP(x) | 返回 e 的给定幂次方。 |
LEAST(x1, x2, ..., xn) | 返回给定多个数值中的最小值。 |
GREATEST(x1, x2, ..., xn) | 返回给定多个数值中的最大值。 |
演示前5个,剩余的也不难,网上查一下就知道怎么使用了
select ABS(-1); -- 返回1
select ABS(1); -- 返回1
select ABS(-1.4); -- 返回1.4
select ROUND(3.1415926,0); -- 返回3
select ROUND(3.1415926,3); -- 返回3.141
select ROUND(3.1415926,4); -- 返回3.1415
select FLOOR(2.1); -- 返回2
select FLOOR(2.8); -- 返回2
select FLOOR(2.9); -- 返回2
select CEILING(2.1); -- 返回3
select CEILING(2.8); -- 返回3
select CEILING(2.9); -- 返回3
这个不好演示, 因为它返回的是一个随机数。如下
select RAND(); -- 随机返回0.10286967465921275
select RAND(); -- 随机返回0.7462309028452551
......
生成5位数之内的随机数:
SELECT FLOOR(RAND()*100000); -- 生成5位数之内的随机数
生成1到10之内的随机数,可以这样做:
SELECT FLOOR(RAND() * 10) + 1;
生成2到5之内的随机数,可以这样做:稍微思考一下,或者拿数字代入算一下,你就会知道原理
SELECT FLOOR(RAND() * 4) + 2;
日期函数 | |
函数 | 描述 |
DATE() | 提取日期部分,返回日期字符串。 |
TIME() | 提取时间部分,返回时间字符串。 |
NOW() | 返回当前日期和时间。 |
CURDATE() | 返回当前日期。 |
CURTIME() | 返回当前时间。 |
YEAR() | 提取年份部分,返回年份。 |
MONTH() | 提取月份部分,返回月份。 |
DAY() | 提取日期部分,返回日期。 |
HOUR() | 提取小时部分,返回小时值。 |
MINUTE() | 提取分钟部分,返回分钟值。 |
SECOND() | 提取秒部分,返回秒值。 |
DAYOFWEEK() | 返回星期几的索引 (1 = 星期日, 2 = 星期一, … , 7 = 星期六)。 |
DAYOFMONTH() | 返回当前月中的天数。 |
DAYOFYEAR() | 返回当前年份的天数。 |
WEEK() | 返回一年中的周数。 |
QUARTER() | 返回当前日期的季度 (1, 2, 3, 4)。 |
TIMESTAMPDIFF() | 返回两个日期之间的差距(以指定的单位计算)。 |
DATE_FORMAT() | 根据指定的格式,格式化日期为字符串。 |
STR_TO_DATE() | 将字符串转换为日期,根据指定的格式。 |
在date()里的日期需保证完整的日期格式,否则无法识别,只要有符号隔开年月日它就可以识别,不一定非得用-,注意它提取是日期
SELECT DATE('2023-09-23 12:34:56'); -- 提取日期部分并返回 '2023-09-23'
上面DATE提取的是日期,这个提取的是时间,其它规则相同
SELECT TIME('2023-09-23 12:34:56'); -- 提取时间部分并返回 '12:34:56'
这个函数就简单明了不用我解释了吧
select NOW(); -- 返回当前日期和时间,格式为:2023-09-23 08:29:24
select CURDATE(); -- 返回当前日期,格式为:2023-09-23
select CURTIME(); -- 返回当前时间,格式为:08:29:24
流程控制函数 | |
函数 | 描述 |
IF() | 如果条件为真,返回一个值;否则返回另一个值。 |
CASE | 在满足条件的情况下返回不同的值。 |
COALESCE() | 返回参数列表中的第一个非 NULL 值。 |
NULLIF() | 如果两个参数相等,则返回 NULL;否则返回第一个参数。 |
IFNULL() | 如果第一个参数不为 NULL,则返回第一个参数;否则返回第二个参数。 |
IIF() | 如果条件为真,则返回第一个值;否则返回第二个值。 |
GREATEST() | 返回参数列表中的最大值。 |
LEAST() | 返回参数列表中的最小值。 |
RAND() | 返回 0 到 1 之间的随机浮点数。 |
ROUND() | 对一个数进行四舍五入。 |
流程控制函数在sql中使用的频率还是比较高的,而且也是非常有意思,但也是有点理解难度
如果2大于1, 则返回True, 否则返回False,不难理解,当条件成立时,返回你指的True值,当条件不成立时, 返回你指定的False值,这个True和False可以是别的类型,如表字段等
SELECT IF(2 > 1, 'True', 'False'); -- 返回 'True'
你也可以使用表中的列或其他表达式作为参数:如下
SELECT 列名, IF(列名> 10, 'Big', 'Small') FROM 表名;
这个函数有点类似于条件判断,适用的场景是这样的:如果成绩大于90,则返回优秀,如果成绩大于80小于90,则返回一般,如果成绩小于60,则返回不及格。
SELECT 成绩,
CASE
WHEN 成绩 > 90 THEN '优秀'
WHEN 80 < 成绩 < 90 THEN '一般'
WHEN 60 < 成绩 THEN '不及格'
ELSE '其它情况'
END as '可以重命名'
FROM table_name;
在上面的sql中,ELSE是可选的,它是用于处理没有匹配到条件的情况,END它是一个结束符号,是必填,as 是可以对整个判断重命名的
给它一个列表, 如果它发现列表中有null值,那就返回下一个值:
SELECT COALESCE(NULL, 2, 3); -- 返回 2
可能你也会想,这个有啥用呀,来,看一下下面的场景你就觉得有用了
假设有一个表 products 包含商品的库存和默认库存,如下
需求来了,请你检索products表的“库存”字段, 如果发现有null值,请用“默认库存”填充,那你就可以使用以下方法:
SELECT ID, COALESCE('库存', '默认库存') AS '检索后的库存' FROM products;
查询结果如下:哎,是不是有点用了?有点用就行,因为我也懒得举别的例子了
NULLIF() 函数用于比较两个表达式的值。如果这两个值相等,则返回 NULL,否则返回第一个值
SELECT NULLIF(10, 10); -- 返回 NULL
SELECT NULLIF(10, 20); -- 返回 10
SELECT NULLIF('abc', 'def'); -- 返回 'abc'
SELECT NULLIF(NULL, 5); -- 返回 NULL
可能你又觉得这个函数没用了,来,举例:用于处理除0bug。
SELECT num1 / num2 FROM 表名;
如上sql, num1除以num2, num2是一个存在表里的字段,当你无法保证num2字段是否有可能出现0的情况,那么你可以这样避免代码除0异常
SELECT num1 / NULLIF(num2, 0) FROM 表名;
如下, 如果'age'为null, 则返回‘未知’,如果'age'不为null,则返回'age'字段值
SELECT name, IFNULL(age, '未知') FROM 表名;
下一章讲解:约束