【学习总结】SQL的学习-4-常用函数介绍
参考链接
目录
=======================================================
合并字符串函数
概述
- 字符函数接受字符参数,这些参数可以是表中的列,也可以是一个字符串表达式。
合并字符串函数concat
-
语法:concat(s1,s2,...,sn)
-
解析
-
该函数会将传入的参数连接起来返回合并的字符串类型的数据。
-
如果其中一个参数为null,则返回值为null。
-
-
合并字符串(即数据不是来自表,而是直接手动键入的):
-
示例1:
select concat ('huang','lao','shi'), concat('huang','lao','shi',null)
-- 直接输出语句中的字符串
-
示例2:
select concat(curdate(),12.2);
-
-
将字段合并输出
- 示例:
select concat (name, "|", house_location) from houses;
- 示例:
合并字符串函数concat_ws
-
语法:concat_ws(seq, s1, s2, ... , sn)
-
解析
-
本函数与concat()的区别:多了一个表示分隔符的seq参数,不仅将传入的其他参数连接起来,而且会通过分隔符将各个字符串分隔开来。
-
分隔符可以是一个字符,也可以是其他参数。如果分隔符为null,则返回结果为null。函数会忽略任何分隔符后的参数null。
-
-
使用分隔符合并字符串并输出的示例
-
示例1:
select concat_ws('-','020','8331234567');
-
示例2:
select concat_ws('-','020','8331234567');
-- 连接多个字符串
-
示例3:
select concat_ws('null','020','8331234567'), concat_ws('-','020','null','8331234567');
-- null的处理
-
=======================================================
比较字符串大小的函数
获取字符串长度的函数length
-
关键字:
-
获取字符串长度函数:length()
-
获取字符数函数:char_length()
-
-
语法:
-
length(str):一个汉字算3个字符,一个数字或字母算一个字符。
-
char_length(str):不管是汉字还是数字或字母,都算一个字符。
-
-
示例:
-
示例1:对比汉字和字母数字的不同结果
-
示例2:数字的结果对比
-
示例3:对负数的处理。注:ceil(n) 取大于等于数值n的最小整数;
-
比较字符串大小的函数strcmp
-
关键字:strcmp()
-
语法:
strcmp(str1, str2)
-
解析:
- 如果
str1>str2
,则返回1;如果str1<str2
,则返回-1;如果str1==str2
,则返回0。
- 如果
-
示例:(根据安装时的配置,遵循utf-8字符串的规律,基于不同字符集,可能结果不同)
-
示例1:等长,且相同大小写的字母比较
-
示例2:相同字母的大小写比较
-
示例3:不等长的字母比较
-
示例4:单个数字比较
-
示例5:不等长的数字比较
-
示例6:单个中文字符比较
-
=======================================================
大小写转换函数
将字母转换为大写的函数upper和ucase
-
语法:
-
upper(s)
-
ucase(s)
-
将字母转换为小写的函数lower和lcase
-
语法:
-
lower(s)
-
lcase(s)
-
示例
-
字母转换对比:结果一致
-
只有非字母符号时:直接输出,结果不变
-
字母与非字母组合:字母正常转换,非字母不变
=======================================================
查找字符串函数
返回字符串位置的函数find_in_set
-
关键字:find_in_set()
-
语法:find_in_set(str1, str2)
-
解析:
- 该函数会返回在字符串str2中与str1相匹配的字符串的位置,参数str2字符串中包含若干个用逗号隔开的字符串。
-
示例:
返回指定字符串位置的函数field
-
关键字:field()
-
语法:field(str, str1, str2...)
-
解析:
- 该函数返回第一个与字符串str匹配的字符串的位置。
-
区别:
- 字符串个数:find_in_set只有两个字符串,而field可以传入多个字符串。
- 空格:find_in_set空格在任意位置都有效,而field放在前面的空格有效,放在后面的空格可忽略。
-
示例:
返回指定位置的字符串的函数elt
-
关键字:elt()
-
语法:elt(n,str1,str2,...);
-
解析:
- 返回指定位置n的字符串
-
注意:
-
如果n超过了字符串个数的范围,(大于或小于),则返回null;
-
对于空格:任意位置的空格(前面的空格或者后面的空格)都算在返回结果内,不会自动删除。
-
-
示例:
=======================================================
字符串截取与替换函数
从左边或右边截取子字符串的函数left和right
-
语法:left(str, num), right(str, num)
-
解析:
-
返回字符串str中包含前num个字母(从左边数)、(从右边数)的字符串,并按照原顺序返回结果。
-
参数num超出正常范围时:返回空白,没有null的空白那种。
-
-
示例:
截取指定位置和长度的字符串的函数substring
-
语法1:substring(str, num, len)
-
解析:
- 返回字符串str中的第num个位置开始,且长度为len的子字符串。
-
示例:
-
语法2:mid(str, num, len)
-
解析:
- substring(str,pos,len)的同义词,参数从1开始,不是从0开始。
-
示例:
替换字符串的函数replace
-
语法:replace(str, substr, newstr)
-
解析:
- 将字符串str中的子字符串substr用字符串newstr来替换。
-
示例:
=======================================================
获取整数函数
返回大于或等于数值x的最小整数的函数ceil
-
语法:ceil(x)
-
示例:
返回小于或等于数值x的最大整数的函数floor
-
语法:floor(x)
-
示例:
截取数值函数truncate
-
语法:truncate(x,y)
-
解析:
- 返回数值x,保留小数点后y位。
-
注意:
- y为正数即取小数点,y为负数即往整数位截取;简单粗暴直接截取,并不进行四舍五入。
-
示例:
函数返回值x经过四舍五入操作后的数值的函数round
-
语法:round(x);round(x,y)
-
解析:
- x表示原数值,y表示要保留的小数位数。y可以省略。
-
注意:
- 负数:数值位按照正数处理,不按照负数的数学规则。
-
对比:round与truncate
- round:截取并四舍五入;truncate:直接截取,不四舍五入。
-
示例:
=======================================================
获取日期和时间的函数
获取当前日期和时间的函数now和sysdate
-
关键字:
- now(); sysdate(); current_timestamp(); current_date(); current_time();
-
语法:
- 使用
select 函数名();
-- 来查看时间函数的返回值
- 使用
-
now():返回该条语句(而不是该函数)运行时的具体日期时间。
-
sysdate():与now()类似。
-
三个current时间函数:结果同now,不变。
-
current_timestamp():获取当前时间戳,包括年月日+时分秒。
-
current_date():获取当前日期,包括年月日。
-
current_time():获取当前时间,包括时分秒。
-
-
辨析:
-
now():在语句执行开始时,值就得到了,后面再取,值不变;
-
sysdate():在函数执行时动态得到值,后面再取,值会变。
-
-
示例:
获取日期和时间各部分值year和hour等
=======================================================
格式化函数
format函数
-
语法与解析:
-
格式化数字:format(x,y):把x格式化为以逗号隔开的数字序列,y是结果的小数位数。
-
格式化时间:date_format(date,fmt), time_format(time,fmt) :
- 依照字符串fmt格式化时间:
'%+字母+分隔符+%+字母+分隔符+...'
- 不同字母代表不同含义:y-年,m-月,d-日,w-星期,r-带AM,PM的时分秒,p-仅am/pm, h-i-s:时分秒,等。
- 注意:相同字母的不同大小写,对应不同的输出格式。
- 依照字符串fmt格式化时间:
-
-
注意:format-数字时会进行四舍五入。
-
示例
去除首尾空格函数trim
-
关键字:
- ltrim(str), rtrim(str), trim(str)
-
解析:
- 返回去掉开始处、结束处、首尾空格的字符串
-
示例
=======================================================
聚合函数
关键字 avg sum count min max
语法与解析
-
注意:
-
1、格式:
select + 函数名(参数名)
-
2、配合
group by
进行分组,注意字段有重复元素和无重复元素得到的结果的不同。
-
示例
=======================================================
控制流函数
条件IF
-
语法:IF(test, t, f)
-
解析:如果test为真,返回t;否则,返回f。
-
示例:
SELECT IF(1<10, 2, 3);
-- 输出:2
判非空IFNULL
-
语法:IFNULL(arg1, arg2)
-
解析:如果arg1不是空,则返回arg1;否则,返回arg2。
- 注:参数可以是select语句。
-
示例:
相等则返回空NULLIF
-
语法:NULLIF(arg1, arg2)
-
解析:如果arg1=arg2,则返回null;否则,,返回arg1。
-
示例:
组合判断1-case-when
-
语法:CASE WHEN[test1] THEN [result1] WHEN..THEN.. ELSE [default] END
- 注意:此处的when相当于
switch-case
里的每个case,可以组合为when...when....when...else
;注意else别放在when中间。
- 注意:此处的when相当于
-
解析:如果testN为真,则返回resultN;否则,返回default。
- 注:如果有多个符合,则返回第一个匹配的testN对应的结果。
-
示例:
组合判断2-case-xx-when
-
语法:CASE[test] WHEN[val1] THEN [result1] WHEN..THEN.. ELSE [default] END
-
解析:如果test和valN相等,则返回resultN,否则返回default。
- 注意:如果有多个符合,则返回第一个匹配的testN对应的结果。
-
示例:
=======================================================
系统信息函数
查询系统函数version-database-user等
-
语法与解析
-
返回数据库版本号:
version()
-
返回当前数据库名:
database()
-
返回当前用户名:
user()
,system_user()
,session_user()
,current_user()
-
-
示例: