SQL常用函数(多平台对比)
一、数值型函数
(一)Teradata
abs(-10) --绝对值;结果:10
ceiling(11.999) --向上取整;返回不小于11.999的最小整数,结果:12
floor(11.999) --向下取整;返回不大于11.999的最大整数,结果:11
exp(2) --e的指数;结果:e的2次幂
log(100) --底数为10,100的对数;结果:2
ln(4) --4自然对数
sqrt(16) --平方根;结果:4
power(3,2) --求幂;结果:9
102 mod 10 --取余;结果:2
round(1.235,2) --四舍五入;结果:保留2位小数,1.24
trunc(1.235,2) --截断数字;结果:1.23
random(1,100) --返回一个随机数;结果:1-100之间的一个随机整数
sign(-10) --返回数值符号,结果为 -1、1或0;结果:-1
zeroifnull(null) --将null转换成0
--三角函数
sin(x) --正弦
asin(x) --反正弦
cos(x) --余弦
acos(x) --反余弦
tan(x) --正切
atan(x) --反正切
--双曲函数
sinh(x) --双曲正弦
asinh(x) --反双曲正弦
cosh(x) --双曲余弦
acosh(x) --反双曲余弦
tanh(x) --双曲正切
atanh(x) --反双曲正切
(二)Oracle
abs(-10) --绝对值;结果:10
ceil(11.999) --向上取整;返回不小于11.999的最小整数,结果:12
floor(11.999) --向下取整;返回不大于11.999的最大整数,结果:11
exp(2) --e的指数;结果:e的2次幂
log(100,10) --底数为10,100对数;结果:2
ln(4) --自然对数
sqrt(16) --平方根;结果:4
power(3,2) --求幂;结果:9
mod(102,10) --取余;结果:2
round(1.235,2) --四舍五入;结果:保留2位小数,1.24
trunc(1.235,2) --截断数字;结果:1.23
sign(-10) --返回数值符号,结果为 -1、1或0;结果:-1
--三角函数
sin(x) --正弦
asin(x) --反正弦
cos(x) --余弦
acos(x) --反余弦
tan(x) --正切
atan(x) --反正切
(三)Mysql
--待填坑
(四)Hive
abs(-10) --绝对值;结果:10
ceil(11.999) --向上取整;返回不小于11.999的最小整数,结果:12
ceiling(11.999) --向上取整;返回不小于11.999的最小整数,结果:12
floor(11.999) --向下取整;返回不大于11.999的最大整数,结果:11
exp(2) --e的指数;结果:e的2次幂
log10(100) --底数为10,100的对数;结果:2
log2(4) --底数为2,4的对数;结果:2
log(2,4) --底数为2,4的对数;结果:2
ln(4) --4的自然对数
sqrt(16) --平方根;结果:4
pow(3,2) --求幂;结果:9
pmod(102,10) --取余;结果:2
round(1.235,2) --四舍五入;结果:保留2位小数,1.24
rand() --返回一个0-1之间的随机数;结果:0-1之间的一个随机数
sign(-10) --返回数值符号,结果为 -1、1或0;结果:-1
positive(10) --取原数;结果:10
positive(-10) --取原数;结果:-10
negative(10) --取反;结果:-10
negative(-10) --取反;结果:10
--三角函数
sin(x) --正弦
asin(x) --反正弦
cos(x) --余弦
acos(x) --反余弦
tan(x) --正切
atan(x) --反正切
二、文本函数
(一)Teradata
'str_1'||'str_2' --拼接;结果:'str_1str_2'
lpad('a',10,'#') --把“#”不断添加到字符串左侧,直到字符串满足10位长度。结果:#########a
rpad('a',10,'#') --结果:a#########
ascii('y') --将字符串转换为ascii码;结果:121
chr(121) --将ascii码转换为字符串;结果:y
initcap('hello world') --将首字母变为大写;结果:'Hello World'
lower('Abc') --将字符串全部转换成小写字母;结果:abc
upper('abc') --将字符串全部转换成大写字母;结果:ABC
instr('str', 'r') --搜索在字符串'str'中是否出现'r',返回0或1;结果:1
length('abc') --返回字符串长度;结果:3
index('str_r','r') --定位函数;结果:在'str_r'中搜寻r的位置,返回3
position('r' in 'str') --定位函数;结果:'r'在'str'中的位置,返回3
substr('str',1,2) --截取函数;结果:从第1个字符开始,截取2个字符,即:'tr'
substring('str' from 1 for 2) --同上
strtok(待分割字符串, 分隔符, 返回第几个)
strtok('http://www.teradata.com/', '/.', 3) --结果:'teradata'
strtok_split_to_table --类似strtok,返回一个table
reverse('abc') --反转函数;结果:'cba'
oreplace('a####b###c', '#', '*') --将字符串中所有的#替换成*
otranslate('s***tr st***r str***', 'str', 'new') --能够跨字节替换;结果:'n***ew ne***w new***'
otranslate('s***tr st***r str***', 'str', 'ne') --能够跨字节替换;结果:'n***e ne*** ne***'
trim(both '*' from '**str**') --去除字符串两侧的空格;结果:'str'
trim(' str ') --去除字符串两侧的空格;结果:'str
ltrim(' str ') --去除字符串左侧空格;结果:'str '
ltrim(' aaastr', 'a') --去除字符串左侧的空格;结果:'aaastr',因为a没有左顶格,所以去不掉
ltrim('aaastr', 'a') --去除字符串左侧的a;结果:'str'
rtrim(' str ') --去除字符串右侧空格;结果:' str'
rtrim(' str*** ', '*') --去除字符串右侧的'*';结果:' str***',*没有右顶格,去不掉
rtrim(' str***', '*') --去除字符串右侧的'*';结果:' str'
ngram(字符串1, 字符串2, 匹配粒度)
ngram('abc', '*ab*bc*', 1) --对比'abc'与'*ab*bc*'在长度粒度为1的情况下,有几个能匹配上;'a'、'b'、'c' 结果:3
ngram('abc', '*ab*bc*', 2) --对比'abc'与'*ab*bc*'在长度粒度为2的情况下,有几个能匹配上;'ab'、'bc' 结果:2
ngram('abc', '*ab*bc*', 3) --对比'abc'与'*ab*bc*'在长度粒度为3的情况下,有几个能匹配上;'abc' 结果:0
nvp(目标字符串, 标签字符串, 标签分隔符, 值分隔符, 当有同一个标签名出现时匹配第几个标签的值)
nvp('name1:n1**name2=n2_1&name2#n2_2=name3%n3', 'name1', '** & =', ': = # %', 1) --结果:n1
nvp('name1:n1**name2=n2_1&name2#n2_2=name3%n3', 'name1', '** & =', ': = # %', 2) --结果:null
nvp('name1:n1**name2=n2_1&name2#n2_2=name3%n3', 'name2', '** & =', ': = # %', 1) --结果:n2_1
nvp('name1:n1**name2=n2_1&name2#n2_2=name3%n3', 'name2', '** & =', ': = # %', 2) --结果:n2_2
(二)Oracle
'str_1'||'str_2' --拼接;结果:'str_1str_2'
concat('str1','str2') --拼接;结果:'str1str2'
lpad('a',10,'#') --把“#”不断添加到字符串左侧,直到字符串满足10位长度。结果:#########a
rpad('a',10,'#') --结果:a#########
ascii('y') --将字符串转换为ascii码;结果:121
chr(121) --将ascii码转换为字符串;结果:y
initcap('hello world') --将首字母变为大写;结果:'Hello World'
lower('Abc') --将字符串全部转换成小写字母;结果:abc
upper('abc') --将字符串全部转换成大写字母;结果:ABC
instr('重庆某某软件公司', '某', 1, 2) --(全角算1个字符)在字符串'重庆某某软件公司'中从第1个字节开始搜索'某',返回第2次出现的位置;结果:4
instrb('重庆某某软件公司', 1, 2) --(全角算2个字符)在字符串'重庆某某软件公司'中从第1个字节开始搜索'某',返回第2次出现的位置;结果:7
length('重庆') --返回字符串长度;结果:2
lengthb('重庆') --返回字符串长度;结果:4
substr('重庆某某软件公司',3,2) --(全角算1个字符)截取函数;结果:从第3个字符开始,截取2个字符,即:'某某'
substrb('重庆某某软件公司',3,2) --(全角算2个字符)截取函数;结果:从第3个字符开始,截取2个字符,即:'庆某'
replace('a####b###c', '#', '*') --将字符串中所有的#替换成*
translate('s***tr st***r str***', 'str', 'new') --能够跨字节替换;结果:'n***ew ne***w new***'
translate('s***tr st***r str***', 'str', 'ne') --能够跨字节替换;结果:'n***e ne*** ne***'
trim(both '*' from '**str**') --去除字符串两侧的空格;结果:'str'
trim(' str ') --去除字符串两侧的空格;结果:'str
ltrim(' str ') --去除字符串左侧空格;结果:'str '
ltrim(' aaastr', 'a') --去除字符串左侧的空格;结果:'aaastr',因为a没有左顶格,所以去不掉
ltrim('aaastr', 'a') --去除字符串左侧的a;结果:'str'
rtrim(' str ') --去除字符串右侧空格;结果:' str'
rtrim(' str*** ', '*') --去除字符串右侧的'*';结果:' str***',*没有右顶格,去不掉
rtrim(' str***', '*') --去除字符串右侧的'*';结果:' str'
(三)Mysql
--待填坑
(四)Hive
'str_1'||'str_2' --拼接;结果:'str_1str_2'
concat('str1','str2') --拼接;结果:'str1str2'
lpad('a',10,'#') --把“#”不断添加到字符串左侧,直到字符串满足10位长度。结果:#########a
rpad('a',10,'#') --结果:a#########
initcap('hello world') --将首字母变为大写;结果:'Hello World'
lower('Abc') --将字符串全部转换成小写字母;结果:abc
upper('abc') --将字符串全部转换成大写字母;结果:ABC
instr('str', 'r') --搜索在字符串'str'中是否出现'r',返回0或1;结果:1
length('abc') --返回字符串长度;结果:3
locate('str_r','r') --定位函数;结果:在'str_r'中搜寻r的位置,返回3
substr('str',1,2) --截取函数;结果:从第1个字符开始,截取2个字符,即:'tr'
substring('str',1,2) --同上
replace('a####b###c', '#', '*') --将字符串中所有的#替换成*
repeat('str',2) --将'str'重复2遍;结果:'strstr'
trim(both '*' from '**str**') --去除字符串两侧的空格;结果:'str'
trim(' str ') --去除字符串两侧的空格;结果:'str
ltrim(' str ') --去除字符串左侧空格;结果:'str '
ltrim(' aaastr', 'a') --去除字符串左侧的空格;结果:'aaastr',因为a没有左顶格,所以去不掉
ltrim('aaastr', 'a') --去除字符串左侧的a;结果:'str'
rtrim(' str ') --去除字符串右侧空格;结果:' str'
rtrim(' str*** ', '*') --去除字符串右侧的'*';结果:' str***',*没有右顶格,去不掉
rtrim(' str***', '*') --去除字符串右侧的'*';结果:' str'
regexp_extract('foothebar', 'foo(.*?)(bar)', 2) --正则匹配;结果:'bar'
regexp_replace('foobar', 'oo|ar', '') --正则替换;结果:'fb'
三、聚合函数
(一)Teradata
avg() --平均数
count() --计数
sum() --求和
max() --最大值
min() --最小值
(二)Oracle
avg() --平均数
count() --计数
sum() --求和
max() --最大值
min() --最小值
(三)Mysql
avg() --平均数
count() --计数
sum() --求和
max() --最大值
min() --最小值
(四)Hive
avg() --平均数
count() --计数
sum() --求和
max() --最大值
min() --最小值
四、转换函数
(一)Teradata
coalesce(arg1,arg2) --如果arg1为null,则返回arg2,否则返回arg1
cast(arg1 as integer) --将arg1转化成integer格式
cast(arg1 as date format'yyyy-mm-dd') --将arg1转化成日期'yyyy-mm-dd'格式
date'2020-01-01' --结果:2020-01-01
time'18:01:15' --结果:18:01:15
timestamp'2020-01-01 16:01:01' --结果:2020-01-01 16:01:01.0
to_date('20200101', 'yyyymmdd') --结果:2020-01-01
to_timestamp('January 15, 1989, 11:00 A.M.', 'Month dd, YYYY, HH: MI A.M.') --结果:1989-01-15 11:00:00.000000
to_number('123') --结果:123
to_char(123) --结果:'123'
(二)Oracle
--待填坑
(三)Mysql
--待填坑
(四)Hive
--待填坑
五、时间函数
(一)Teradata
current_date --当前日期,2020-09-19
current_time --当前时间,09:44:05+00:00
current_timestamp --当前时间戳,2020-09-19 09:44:33.160000+00:00
last_day(date'2020-01-01') --定位2020-01-01所在月份的最后一天;结果:2020-01-31
next_day(date'2020-01-01','monday') --定位2020-01-01后的第一个星期一
months_between(date'2020-02-28', date'2020-01-01') --返回2020-01-01和2020-02-28之间的月份数,可能为小数;结果:1.8709...
add_months(date'2020-01-31', 1) --在2020-01-31的基础上加上1个月
oadd_months(date'2020-01-31', 1) --在2020-01-31的基础上加上1个月
trunc(date'2020-02-13', 'd') --截断日期,返回目标日期的指定截断点上,'D'表示截断到目标日期所在周的第一天,'MM'表示所在月初第一天,'Y'表示所在年初第一天;结果:2020-02-09
trunc(date'2020-02-13', 'mm') --结果:2020-02-01
round(date'2020-02-13', 'mm') --四舍五入时间,如果时间靠近月末,就取下月初日期,如果靠近月初,就取月初时间;结果:2020-02-01
round(date'2020-02-18', 'mm') --结果:2020-03-01
extract(day from date'2020-01-03') --时间抽取函数,从目标时间中抽取日,结果:3
extract(month from date'2020-01-03') --时间抽取函数,从目标时间中抽取月,结果:1
extract(year from date'2020-01-03') --时间抽取函数,从目标时间中抽取年,结果:2020
(二)Oracle
--待填坑
(三)Mysql
--待填坑
(四)Hive
--待填坑
六、窗口函数
(一)Teradata
--累加函数
csum(累加列, 排序列 <asc or desc>) <group by 聚合列>
--累积分布函数
cume_dist() over(<partition by 分区列> order by 累积列 <asc or desc> <nulls first or nulls last> <reset when condition>)
--移动平均
mavg(求平均列, 窗口步长, 排序列 <asc or desc>) <group by 聚合列>
--移动求和
msum(求和列, 窗口步长, 排序列 <asc or desc>) <group by 聚合列>
--移动差分
mdiff(差分列, 窗口步长, 排序列 <asc or desc>) <group by 聚合列>
--排序函数
rank(排序列 <asc or desc>) --相同数值,排序相同,排序断开
rank() over(<partition by 分区列> order by 累积排序列 <asc or desc> <nulls first or nulls last> <reset when condition>) --相同数值,排序相同,排序断开
dense_rank() over(<partition by 分区列> order by 累积排序列 <asc or desc> <nulls first or nulls last> <reset when condition>) --相同数值,排序相同,排序连续
row_number() over(<partition by 分区列> order by 累积排序列 <asc or desc> <nulls first or nulls last> <reset when condition>) --相同数值,排序不同,排序连续
percent_rank() over(<partition by 分区列> order by 累积排序列 <asc or desc> <nulls first or nulls last> <reset when condition>) --排序比例,即(rank排序数值-1)/(记录数-1)
sel * from 目标表 qualify row_number() <其他窗口函数也可> over(...) = 1; --从表中查询排序为1的记录
--分位插值函数
percentile_cont(分位值[0-1]) within group (order by 目标排序列 <asc or desc> <nulls first or nulls last>) --返回位于该分位点应该有的值
percentile_disc(分位值[0-1]) within group (order by 目标排序列 <asc or desc> <nulls first or nulls last>) --返回位于该分位点应该有的值
median(目标列) --类似percentile_cont(0.5)
--分类函数
qauntile(4, 目标列 <asc or desc>) --将目标列分为4类,然后按照类大小排序,返回排序值
--线性回归函数
mlinreg(预测列, 回归窗口, 排序列[自变量]) --返回预测值
(二)Oracle
--待填坑
(三)Mysql
--待填坑
(四)Hive
--待填坑
七、统计相关函数(聚合)
(一)Teradata
--方差(分母不减1)
var_pop(col)
--方差(分母减1)
var_samp(col)
--标准差(分母不减1)
stddev_pop(col)
--标准差(分母减1)
stddev_samp(col)
--协方差(分母不减1)
covar_pop(col_1, col_2)
--协方差(分母减1)
covar_samp(col_1, col_2)
--相关系数
corr(col1, col2)
--峰度
kurtosis(col)
--偏度
skew(col)
--一元线性回归自变量平均值函数
regr_avgx(因变量列, 自变量列)
--一元线性回归因变量平均值函数
regr_avgy(因变量列, 自变量列)
--一元线性回归斜率函数
regr_slope(因变量列, 自变量列) --返回参数值
--一元线性回归截距函数
regr_intercept(因变量列, 自变量列) --返回截距值
--R^2
regr_r2(因变量列, 自变量列)
--sum(x**2) - sum(x)*(sum(x)/n)
regr_sxx(因变量列, 自变量列)
--sum(x*y) - sum(x)*(sum(y)/n)
regr_sxy(因变量列, 自变量列)
--sum(y**2) - sum(y)*(sum(y)/n)
regr_syy(因变量列, 自变量列)
(二)Oracle
--待填坑
(三)Mysql
--待填坑
(四)Hive
--同Teradata
八、比较函数(非聚合)
(一)Teradata
greatest(1,3,4,6,7) --最大值;结果:7
least(1,3,4,6,7) --最小值;结果:1
(二)Oracle
--待填坑
(三)Mysql
--待填坑
(四)Hive
greatest(1,3,4,6,7) --最大值;结果:7
least(1,3,4,6,7) --最小值;结果:1