至少有两种类型的函数——常规函数和聚合函数。这些是完全不同的概念。常规函数的工作方式就好像它们分别应用于每一行(对于每一行,函数的结果不依赖于其他行)。聚合函数从各行中积累一组值(也就是说,它们依赖于整组行)
所有的函数都返回一个单一的返回值(不是几个值,而不是零值)。结果的类型通常仅由参数的类型定义,而不是由值定义
算数函数:对于所有的算术函数,如果有这样的类型,结果类型将被计算为结果适合的最小数字类型。最小值是基于位元数同时进行的,无论它是签名的,还是浮动的。如果没有足够的位元,则采用最高位类型。
SELECT toTypeName(0), toTypeName(0 + 0), toTypeName(0 + 0 + 0), toTypeName(0 + 0 + 0 + 0)
┌─toTypeName(0)─┬─toTypeName(plus(0, 0))─┬─toTypeName(plus(plus(0, 0), 0))─┬─toTypeName(plus(plus(plus(0, 0), 0), 0))─┐
│ UInt8 │ UInt16 │ UInt32 │ UInt64 │
└───────────────┴────────────────────────┴─────────────────────────────────┴──────────────────────────────────────────┘
适用于UInt8, UInt16, UInt32, UInt64, Int8, Int16, Int32, Int64, Float32, or Float64. 产生方式与C++相同
算数函数一览:
plus(a,b):a+b
minus(a,b):a-b
multiply(a,b):a*b
divide(a,b):a/b
intDiv:a/b 的商的整数部分
intDivOrZero(a, b):a/b 的商的整数部分,除以0时返回0
modulo(a, b):a/b的余数,如5/2余1
negate(a):-a ,前面增加一个负号
abs(a):a的绝对值
gcd(a, b):返回a和b的最大公约数
lcm(a, b) :返回a和b的最大公倍数
比较函数:总是返回0或1
在每个组中可以比较这些类型:数字,字符串和固定字符串,日期,时间日期,您不能将日期与字符串进行比较。你必须使用一个函数将字符串转换成日期,反之亦然。字符串是按字节进行比较的。较短的字符串比以它开头的所有字符串都要小,并且至少包含一个字符。
比较函数的符号有:a==b,a=b,a!=b,a<>b,a>b,a=b
逻辑函数:逻辑函数接受任何数字类型,但返回UINT8的0或1。0被视为false。
逻辑函数有:and or not
SELECT
now() AS now_local,
toString(now(), 'Asia/Yekaterinburg') AS now_yekat
┌───────────now_local─┬─now_yekat───────────┐
│ 2016-06-15 00:11:21 │ 2016-06-15 02:11:21 │
└─────────────────────┴─────────────────────┘
toString
toFixedString(s, N):将字符串填充为N长度的字符串(以0填充)
toStringCutToZero(s):接受一个字符串或FixedString参数。在找到的第一个零字节的时候,返回字符串的内容。
SELECT toFixedString('foo', 8) AS s, toStringCutToZero(s) AS s_cut
┌─s─────────────┬─s_cut─┐
│ foo\0\0\0\0\0 │ foo │
└───────────────┴───────┘
SELECT toFixedString('foo\0bar', 8) AS s, toStringCutToZero(s) AS s_cut
┌─s──────────┬─s_cut─┐
│ foo\0bar\0 │ foo │
└────────────┴───────┘
CAST(x, t):将x转换为t类型的
SELECT
'2016-06-15 23:00:00' AS timestamp,
CAST(timestamp AS DateTime) AS datetime,
CAST(timestamp AS Date) AS date,
CAST(timestamp, 'String') AS string,
CAST(timestamp, 'FixedString(22)') AS fixed_string
┌─timestamp───────────┬────────────datetime─┬───────date─┬─string──────────────┬─fixed_string──────────────┐
│ 2016-06-15 23:00:00 │ 2016-06-15 23:00:00 │ 2016-06-15 │ 2016-06-15 23:00:00 │ 2016-06-15 23:00:00\0\0\0 │
└─────────────────────┴─────────────────────┴────────────┴─────────────────────┴───────────────────────────┘
所有用于时区的日期和时间的函数都可以接受第二个可选的时区参数。例如:亚洲/叶卡捷琳堡。在这种情况下,他们使用指定的时区,而不是本地(默认)的时区
SELECT
toDateTime('2016-06-15 23:00:00') AS time,
toDate(time) AS date_local,
toDate(time, 'Asia/Yekaterinburg') AS date_yekat,
toString(time, 'US/Samoa') AS time_samoa
┌────────────────time─┬─date_local─┬─date_yekat─┬─time_samoa──────────┐
│ 2016-06-15 23:00:00 │ 2016-06-15 │ 2016-06-16 │ 2016-06-15 09:00:00 │
└─────────────────────┴────────────┴────────────┴─────────────────────┘
处理时间和日期的函数:
toYear(年)、toMonth(月)、toDayOfMonth(日)、toDayOfWeek(星期,星期一为1)、toHour(0~23)、
toMinute(0~59)、toSecond(0~59)、toMonday(将日期与最近的星期一四舍五入)
toStartOfMonth:返回这个日期所属月份的第一天
toStartOfQuarter:返回这个日期所属季度的第一天
toStartOfYear:返回这个日期所属年份的第一天
toStartOfMinute:将这一分钟归零到0秒
toStartOfFiveMinute:一小时的开始
toStartOfHour:同上
toStartOfDay:一天的开始
toTime:将日期变为固定的日期,时间不变
toRelativeYearNum:返回日期的年份
toRelativeMonthNum:将日期转换为月,从0开始,如2016年6月为24198个月
toRelativeWeekNum:将日期转换为周,从1970年开始,如2016年6月为2426
toRelativeDayNum:将日期转换为天,从1970年开始,如2016年6月30日为16982
toRelativeHourNum:将日期转换为小时,从1970年开始,如2016年6月30日为407595
toRelativeMinuteNum:将日期转换为分钟,从1970年开始
toRelativeSecondNum:将日期转换为秒,从1970年开始
NOW:返回当前时间
today:返回当前日期
yestoday:返回昨天日期
timeSlot:将时间间隔分为半小时(Yandex用)
timeSlots(StartTime, Duration)=[toDateTime('2012-01-01 12:00:00'), toDateTime('2012-01-01 12:30:00')]
使用字符串的函数:
empty:是空字符串返回1,否则返回0. 空格也返回0
notEmpty:空字符串返回0,其他返回1
length:以字节(不是字符,而不是代码点)返回字符串的长度。结果类型为UInt64。这个函数也适用于数组
lengthUTF8:在Unicode编码点(不是字符)中返回字符串的长度,假设字符串包含组成UTF-8编码文本的一组字节。如果这个假设没有被满足,它将返回一些结果(它不会抛出异常)。结果类型为UInt64。
lower:转换为小写
upper:转换为大写
lowerUTF8:把字符串转换成小写,假设字符串包含一组字节,这些字节组成了UTF-8编码的文本。它不检测语言。所以对土耳其来说,结果可能并不完全正确。如果一个代码点的上和下一个例子的UTF-8字节序列的长度是不同的,那么这个代码点的结果可能是不正确的。如果字符串包含一组字节,而不是UTF-8,那么行为就没有定义
upperUTF8:将字符串转换为大写,假设该字符串包含组成UTF-8编码文本的一组字节。它不检测语言。所以对土耳其来说,结果可能并不完全正确。如果一个代码点的上和下一个例子的UTF-8字节序列的长度是不同的,那么这个代码点的结果可能是不正确的。如果字符串包含一组字节,而不是UTF-8,那么行为就没有定义
reverse:反串字符串,‘abc’返回‘cba’
reverseUTF8:如果字符串包含一组表示UTF-8文本的字节,则反转一组Unicode代码点。否则,它会执行其他操作(不会抛出异常)。
concat(s1, s2, ...):将S1,S2连接起来而不使用分隔符号
substring(s, offset, length):返回一个子字符串,从“长度”字节长的“偏移”索引开始。字符索引从一个开始(就像标准SQL一样)。“偏移”和“长度”的参数必须是常量
substringUTF8(s, offset, length):与“substring”相同,但对于Unicode代码点来说。在假定字符串包含一组字节表示UTF-8编码的文本的假设下工作。如果这个假设没有被满足,它将返回一些结果(它不会抛出异常)。
appendTrailingCharIfAbsent(s, c):如果“s”不是空的,并且在结尾处不包含“c”字符,那么它将“c”字符附加到末尾。
convertCharset(s, from, to) 返回从from到to的字符串
搜索字符串函数:在所有这些函数中,搜索是大小写敏感的,搜索子符串或正则表达式必须是一个常量。
函数列举如下:
position(haystack, needle):返回搜索到的字符串的位置(以字节为单位,1为起始)。
positionUTF8(haystack, needle):与上述相同,是以UTF8为基准寻找,如在【你好吗我很好】里搜索【好】,此处返回2,上述返回4
match(haystack, pattern):检查这个字符串是否与正则表达式匹配。re2公司正则表达式。如果匹配不匹配,则返回0;如果匹配,则返回1。如果在字符串里搜索字符,建议用Like或者Postion,因为他们工作的更快
extract(haystack, pattern):提取第一个符合正则表达式的字符串,如果没有则返回空
extractAll(haystack, pattern):提取所有符合正则表达式的字符串,如果没有则返回空
like(haystack, pattern) or haystack LIKE pattern:同mysql,%代表若干个字节,_代表一个,\转义
notLike(haystack, pattern), haystack NOT LIKE pattern :跟Like一样,不过是否定的
数学函数:所有的函数都返回Float64。结果的精度接近于最大精度,但结果可能与与实际数字最接近的机器的可表示数不一致。
e():返回一个接近e的Float64
pi():返回一个接近π的Float64
exp(x):返回一个以e为底的x次方的Float64
log(x):返回一个以e为底x为参数的对数
exp2(x):返回一个以2为底的x次方的数,exp2(3)返回8
log2(x):返回一个以2为底x为参数的对数
exp10(x):返回一个以10为底的x次方的Float64
log10(x):返回一个以10为底x为参数的对数
sqrt(x):平方根
cbrt(x):立方根
erf(x):关于正态分布的,没搞懂
erfc(x):与上述相对的为1 - erf(x)
sin、cos、tan组合,asin为arcsin(x),以此类推
pow(x, y):以x为底y为参数的指数,pow(2,3)=8
取整函数:
floor(x[, N]),四舍五入
floor(123.45, 1) = 123.4, floor(123.45, -1) = 120.
ceil(x[, N]),往上取整
round(x[, N]),往下取整
roundToExp2(num):往下取2进制数,2、4、8、16……
使用数组的函数:
empty:对于空的数组返回1,其他返回0,类型为UInt8。
notEmpty:与上相对
length:返回数组中条目的数量
emptyArrayUInt8, emptyArrayUInt16, emptyArrayUInt32, emptyArrayUInt64
emptyArrayInt8, emptyArrayInt16, emptyArrayInt32, emptyArrayInt64
emptyArrayFloat32, emptyArrayFloat64
emptyArrayDate, emptyArrayDateTime
emptyArrayString
接受零参数并返回适当类型的空数组。
range(N):返回一个从0到N-1的数字数组 ,range(3)为【0,1,2,】
array(x1, ...):创建一个数组【x1,....】
arrayConcat:将数组作为参数传递,将各个数组拼接起来
arrayConcat(arrays)
SELECT arrayConcat([1, 2], [3, 4], [5, 6]) AS res
┌─res───────────┐
│ [1,2,3,4,5,6] │
└───────────────┘
arrayElement(arr, n):寻找arr数据的第n个参数,-1代表最后一个,1为起始
has(arr, elem):检查arr数组有无elem元素,有返回1,没有返回0
indexOf(arr, x):返回x元素的索引
countEqual(arr, x):返回arr数组里等于x的数量
arrayEnumerate(arr):返回数组的长度【1,2,3,4,5,...length(arr)】
arrayEnumerateUniq(arr, ...):返回一个与源数组相同大小的数组,指示每个元素在具有相同值的元素之间的位置。例如:arrayEnumerateUniq(10,20,10,30)=【1,1,2,1】。
SELECT arrayEnumerateUniq([1, 1, 1, 2, 2, 2], [1, 1, 2, 1, 1, 2]) AS res
┌─res───────────┐
│ [1,2,1,1,2,1] │
└───────────────┘
arrayPopBack:删除数组中最后一个条目
arrayPopFront:删除数组中第一个条目
arrayPushBack:在数组的末尾添加一项
arrayPushFront:在数组的最前面添加一项
arraySlice(array, offset[, length]):从array数组的第offset位开始截取length个
SELECT arraySlice([1, 2, 3, 4, 5], 2, 3) AS res
┌─res─────┐
│ [2,3,4] │
└─────────┘
arrayUniq(arr, ...):
如果传递了一个参数,那么它将计算数组中不同元素的数量。如果传递多个参数,那么它将计算多个阵列中相应位置的元素的不同元组数
splitByString(separator, s):同上,separator为一串多字符常量
arrayStringConcat(arr[, separator]):将数组里的字符串连接起来,分隔符默认为空
alphaTokens(s):从A-Z和A-Z的范围选择连续字节的子串。返回一组子字符串。
生成伪随机数的函数:
rand:返回一个Uint32的随机数
rand64:返回一个Uint64的随机数
其他函数
toTypeName(x):x的类型
blockSize():得到方块的大小。在ClickHouse中,查询总是以块(一组列部件)运行。这个函数允许你调用你所调用的块的大小。
currentDatabase():返回当前数据库的名称
isNaN(x):如果为NaN返回1,其他为0
least(a, b):从a和b里返回最小值
greatest(a, b):从a和b里返回最大值
version():查看当前的版本
runningDifference(x):计算数据块中连续行值之间的差异。第一行返回0,并为随后一行的前一行的差值
tupleElement(tuple, n):从元祖中获得一个列
tuple(x, y, ...):允许对多个列进行分组的函数