普通函数
Opened this issue · 0 comments
算术函数
abs()
绝对值
正常情况下,绝对值的结果
select abs(2); // 2
select abs(-2); // 2
select abs(0); // 0
select abs(-0); // 0
有些极端情况下,输入的值不一定是数字,我们看一下它的结果:
select abs('11'); // 11
select abs('123dd'); // 123
select abs('dd123'); // 0
select abs('mysql'); // 0
select abs(null); // null
select abs(1/0); // null
select abs('2022-01-22'); // 2022
select abs(true); // 1
select abs(false); // 0
select abs(CURRENT_TIMESTAMP()); // 20220128155334
总结:
- 如果是
字符串类型的数字
,先将它转换成数字再做绝对值 - 如果是
数字开头加非数字字符串
,取前面数字部分做绝对值 - 如果是
非数字开头
,结果是0
- 如果是
null
,结果是null
- 如果是
1/0
,结果是null
- 如果是
true
,结果是1
- 如果是
false
,结果是0
- 如果
字符串是通过特殊符号连接
,则去第一个特殊符号前的值,做转换 - 如果是日期,则去掉日期的连接符号
mod()
取余数
正常情况下,取余数的结果
select mod(4, 3); // 1
select mod(4, 2); // 0
select mod(3, 4); // 3
在极端情况下的结果
select mod(4, 0); // null
select mod(4, 'e'); // null
select mod(4, '3'); // 1
select mod(4, '123d'); // 1
select mod(4, true); // 0
select mod(4, 1/0); // null
select mod(4, null); //null
总结:它的转换逻辑
- 两个都是数字,直接取余
- 如果有一个或者两个不是数字,会将它们转换成数字,再进行取余
- 如果转换后的数字是
0
或者null
则结果null
- 如果转换后的数字是
round()
四舍五入
正常情况下,四舍五入的结果
select round(3.24, 1); // 3.2
非正常情况下的结果
select round(3.23, null); // null
select round(3.23, 1/0); // null
总结:算术类的函数,如果输入的值不是数字,会先将它转换成数字,然后在进行后面的操作。
字符串函数
concat()
连接函数
正常情况下使用 concat()
的结果
select concat('abc', 123); // 'abc123'
在极端情况下使用结果
select concat('abc', true); // 'abc1'
select concat('abc', false); // 'abc0'
select concat('abc', null); // null
select concat('abc', 1/0); // null
select concat('abc', CURRENT_TIMESTAMP()); // abc2022-01-29 14:52:01
这个函数比较简单,没有太多极端的情况,和 null
连接,结果就是 null
length()
计算长度
一个汉字算三个字符,一个数字或者字母算一个字符
select length('abc'); // 3
select length(23); // 2
select legnth(1.2); // 3
select length("你好"); // 6
极端情况的结果
select length(true); // 1,true 是 1 所以结果是 1
select length(null); // null
char_length()
字符长度
字母,数字,汉字都算一个字符
select char_length('abc'); // 3
select char_length('你好'); // 2
select char_length(123); // 3
select char_length(true); // 1
select char_legnth(null); // null
lower()
、 upper()
大小写函数
select lower('FF'); // 'ff'
select lower(1); // 1
select lower(true); // 1
select lower(null); // null
select lower(1/0); // null
select lower('你好'); // '你好'
upper()
和 lower()
用法一样,如果是不是字母,输出原值
replace()
替换函数
select replace('abc', 'c', 'd'); // 'abd'
select replace('abc', 'd', 'D'); // 'abc'
select replace('abc', 'c', true); // 'ab1'
select replace('abc', 'c', null); // null
select replace(true, 1, 'abc'); // 'abc'
select replace(true, true, 'abc'); // 'abc'
select replace(true, 'a', 34); // 1
substring(string, start, length)
截取字符串函数
start
表示开始截取的位置,length
数字表示截取的长度,
start
从1
开始,不是0
start
如果是负数,表示从后往前开始
select substring('abcd', 1, 3); // 'abc'
select substring('abcd', 0, 3); // 空
select substring('abcd', 3, 1); // 'c'
select substring('abcd', 3, -1); // 空
select substring('abcd', 1, 1); // 'a'
select substring('abcd', 2, 2); // 'bc'
select substring('abcd', -1, 1); // 'd'
select substring('abcd', 1, null); // null
select substring('abcd', 1, 'd'); // 空
日期函数
current_time()
获取当前系统的时间
current_date()
获取当前系统的日期
current_timestamp()
获取当前系统的时间 + 日期
extract()
获取具体的年月日
date()
获取时间的日期部分
year()
获取时间的年份部分
month()
获取时间的月份部分
day()
获取时间的天数部分
hour()
获取时间的小时部分
minute()
获取时间的分钟部分
second()
获取时间的秒部分
select current_time(); // 12:01:34
select current_date(); // 2022-01-30
select current_timestamp(); // 2022-01-30 12:01:34
select extract(year from '2022-01-30 12:01:34'); // 2022
select date('2022-01-30 12:01:34'); // 2021-01-30
select year('2022-01-30 12:01:34'); // 2022
select month('2022-01-30 12:01:34'); // 01
select day('2022-01-30 12:01:34'); // 30
select hour('2022-01-30 12:01:34'); // 12
select minute('2022-01-30 12:01:34'); // 01
select second('2022-01-30 12:01:34'); // 34
转换函数
cast()
数据类型转换
参数是个表达式,通过 as
分割 2 个参数,一个是原始数据,一个是目标类型
select cast(12.3 as signed); // 12
select cast(12.3 as char); // 12.1
将字符串数字转成 int
类型会报错,转成 float
类型就不会报错
select cast('12' as int); // 报错
select cast('12' as float); // 12
还可以使用 decimal()
指定精度,接收两个参数,第一个参数是精度位(包括小数部分),第二个参数是小数位数
下面的 SQL 语句中,为什么两个输出值是一样的?
因为小数位是两个,小数位加整数位不够八位,所以,最后呈现出来的是 6
。
select cast('1234.56789' as decimal(8, 2)); // 1234.57
select cast('1234.56789' as decimal(6, 2)); // 1234.57
coalesce()
返回第一个非空数值
select coalesce(null, null, 2); // 2
select coalesce(null, 1); // 1