Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

普通函数 #39

Open
astak16 opened this issue Jan 30, 2022 · 0 comments
Open

普通函数 #39

astak16 opened this issue Jan 30, 2022 · 0 comments

Comments

@astak16
Copy link
Owner

astak16 commented Jan 30, 2022

算术函数

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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant