astak16/blog-mysql

普通函数

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 数字表示截取的长度,

  • start1 开始,不是 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