数仓、接口开发常用clickhouses函数详解

前提介绍

字段类型分类概览

sql 复制代码
ClickHouse数据类型
├── 基础类型
│   ├── 整数类型 (Int8, UInt8, Int16, UInt16, Int32, UInt32, Int64, UInt64, Int128, UInt128, Int256, UInt256)  --分为有/无符号整数
│   ├── 浮点类型 (Float32, Float64)
│   ├── 小数类型 (Decimal32, Decimal64, Decimal128, Decimal256)
│   ├── 布尔类型 (Bool)
│   └── 字符串类型 (String, FixedString)
├── 时间类型
│   ├── 日期类型 (Date, Date32)
│   ├── 时间类型 (DateTime, DateTime64)
│   └── 时间间隔 (Interval)
├── 复合类型
│   ├── 数组类型 (Array(T))
│   ├── 元组类型 (Tuple(T1, T2, ...))
│   ├── 嵌套类型 (Nested)
│   ├── 映射类型 (Map(key, value))
│   └── 结构类型 (Object)
├── 特殊类型
│   ├── 可空类型 (Nullable(T))
│   ├── 枚举类型 (Enum8, Enum16)
│   ├── UUID类型 (UUID)      -- 存id类数据,全局唯一标识符
│   ├── IP类型 (IPv4, IPv6)   --存ip类数据,192.168.1.1
│   ├── 聚合函数类型 (AggregateFunction)
│   └── 域类型 (Domain)
└── 别名类型
    └── 类型别名

常用日期格式

sql 复制代码
%Y- 4位年份
%m- 月份(01-12)
%d- 日期(01-31)
%H- 小时(00-23)
%M- 分钟(00-59)
%S- 秒(00-59)
ch年月日:%Y-%m-%d %H-%M-%S   
hive年月日:yyyy-MM-dd HH:mm:ss

一、时间或日期截取函数

1、返回值为非日期

toTime()、toYear()、toMonth()、toMonday()、toDayofMonth()、toDayofWeek()、toHour()、toMinutes()、toSecond()

此类函数从日期或日期时间中提取特定部分,返回结果为数字或时间,而非完整日期。

函数 功能描述 示例 结果
toTime(datetime) 从DateTime中提取时间部分。 SELECT toTime('2026-03-15 14:30:45') AS time_part; 1970-01-01 14:30:45
toYear(date/datetime) 提取日期或日期时间的年份。 SELECT toYear('2026-03-15') AS year; SELECT toYear('2026-03-15 14:30:45') AS year; 2026
toMonth(date/datetime) 提取月份(1-12)。 SELECT toMonth('2026-03-15') AS month; SELECT toMonth('2026-12-31 23:59:59') AS month; 3 12
toMonday(date/datetime) 返回包含指定日期的周一的日期。 SELECT toMonday('2026-03-15') AS monday; SELECT toMonday('2026-03-10') AS monday; 2026-03-09
toDayOfMonth(date/datetime) 提取一个月中的第几天(1-31)。 SELECT toDayOfMonth('2026-03-15') AS day; SELECT toDayOfMonth('2026-02-28') AS day; 15 28
toDayOfWeek(date/datetime) 提取一周中的第几天(周一为1,周日为7)。 SELECT toDayOfWeek('2026-03-15') AS day_of_week; SELECT toDayOfWeek('2026-03-16') AS day_of_week; 7 1
toHour(date/datetime) 提取小时(0-23)。 SELECT toHour('2026-03-15 14:30:45') AS hour; SELECT toHour('2026-03-15 00:00:00') AS hour; 14 0
toMinute(date/datetime) 提取分钟(0-59)。 SELECT toMinute('2026-03-15 14:30:45') AS minute; SELECT toMinute('2026-03-15 14:05:00') AS minute; 30 5
toSecond(date/datetime) 提取秒(0-59)。 SELECT toSecond('2026-03-15 14:30:45') AS second; SELECT toSecond('2026-03-15 14:30:00') AS second; 45 0

2、返回值为日期的起始时间函数

timeSlot()、toStartOfYear()、toStartOfMonth()、toStartOfDay()、toStartOfHour()、toStartOfQuarter()、toStartOfFifteenminnutes()、toStartOfMinutes()

此类函数用于将日期或日期时间截取/规整到特定的起始点,返回结果为日期或日期时间类型。

函数 功能描述 示例 结果
timeSlot(datetime) 将时间向下取整到最近的半小时时间槽的起始点。 SELECT timeSlot('2026-03-15 14:30:45') AS slot; SELECT timeSlot('2026-03-15 14:45:00') AS slot; 2026-03-15 14:30:00 2026-03-15 14:30:00
toStartOfYear(date/datetime) 返回指定日期所在年份的第一天。 SELECT toStartOfYear('2026-03-15') AS year_start; SELECT toStartOfYear('2026-12-31 23:59:59') AS year_start; 2026-01-01
toStartOfMonth(date/datetime) 返回指定日期所在月份的第一天。 SELECT toStartOfMonth('2026-03-15') AS month_start; SELECT toStartOfMonth('2026-02-28') AS month_start; 2026-03-01 2026-02-01
toStartOfDay(date/datetime) 返回指定日期的当天起始时间(00:00:00)。 SELECT toStartOfDay('2026-03-15') AS day_start; SELECT toStartOfDay('2026-03-15 14:30:45') AS day_start; 2026-03-15 00:00:00
toStartOfHour(date/datetime) 返回指定日期时间所在小时的起始点。 SELECT toStartOfHour('2026-03-15 14:30:45') AS hour_start; SELECT toStartOfHour('2026-03-15 00:00:00') AS hour_start; 2026-03-15 14:00:00 2026-03-15 00:00:00
toStartOfQuarter(date/datetime) 返回指定日期所在季度的第一天。 SELECT toStartOfQuarter('2026-03-15') AS quarter_start; SELECT toStartOfQuarter('2026-11-15') AS quarter_start; 2026-01-01 2026-10-01
toStartOfFifteenMinutes(datetime) 将时间向下取整到最近15分钟的起始点。 SELECT toStartOfFifteenMinutes('2026-03-15 14:30:45') AS fifteen_start; SELECT toStartOfFifteenMinutes('2026-03-15 14:42:00') AS fifteen_start; 2026-03-15 14:30:00 2026-03-15 14:30:00
toStartOfMinute(datetime) 返回指定日期时间所在分钟的起始点。 SELECT toStartOfMinute('2026-03-15 14:30:45') AS minute_start; SELECT toStartOfMinute('2026-03-15 14:30:00') AS minute_start; 2026-03-15 14:30:00

注意

  1. timeSlot` 函数固定按30分钟(半小时)的间隔进行规整,常用于将时间划分为固定的时间槽进行聚合分析。
  2. 季度划分toStartOfQuarter将一年划分为四个季度(1-3月、4-6月、7-9月、10-12月),并返回每个季度第一天的日期。
  3. toStartOfFifteenMinutes 将时间规整到最近的15分钟整数倍,对于分析15分钟级别的聚合数据非常有用。

3、取昨日或当前日期函数

yesterday()、now()、today()

此类函数用于获取相对日期,如昨日、今日的日期,或当前的日期时间。

函数 功能描述 示例 结果
yesterday() 返回昨日 的日期,类型为 Date SELECT yesterday() AS yesterday_date; 2026-03-14(假设当前日期为2026-03-15)
now() 返回当前 的日期与时间,类型为 DateTime SELECT now() AS current_datetime; 2026-03-15 14:30:45(示例时间)
today() 返回今日 的日期,类型为 Date SELECT today() AS today_date; 2026-03-15(示例日期)

注意

  1. 无参数函数:以上所有函数均不接收任何参数,其返回值基于服务器的当前系统时间。
  2. 返回值类型now()返回 DateTime,而 today()yesterday()返回 Date,这在需要进行日期比较或时间计算时需特别注意。

二、类型转化类函数

1、精度截取函数(非四舍五入)

toDecimal32()、toDecimal64()、toDecimal128

该类函数用于对数值型或数值字符串进行精度转换,采用截断而非四舍五入的方式处理多余的小数位。

函数 功能描述 示例 结果
toDecimal32(value, scale) 将值(数值或字符串)转换为Decimal32类型,并指定小数位数scale。多余的小数位将被直接截断 SELECT toDecimal32(123.456789, 2) AS result; SELECT toDecimal32('123.456789', 2) AS result; 123.45
toDecimal64(value, scale) 将值转换为Decimal64类型,并指定小数位数scale。拥有比Decimal32更高的整数位和小数位精度,处理方式为截断。 SELECT toDecimal64(123.456789, 2) AS result; SELECT toDecimal64('123.456789', 2) AS result; 123.45
toDecimal128(value, scale) 将值转换为Decimal128类型,并指定小数位数scale。拥有三种类型中最高的精度,处理方式为截断。 SELECT toDecimal128(123.456789, 2) AS result; SELECT toDecimal128('123.456789', 2) AS result; 123.45

重要提示 :以上所有函数在执行转换时,如果原始值的小数部分超过指定的scale多余的小数位将被直接舍弃,不进行任何舍入操作

2、字符串型转为整型(非整数的字符串返回值为0)

toInt8()、toInt16()、toInt32()、toInt64()、

安全转换:toUInt8OrZero()、toInt8OrZero()、toFloat32OrZero()

此类函数是安全版本 的转换函数。它们在转换失败时返回 0或默认值,而不会抛出错误。函数名通常带有 OrZero后缀。

函数 功能描述 示例 结果
toUInt8OrZero(string) 将字符串转换为无符号8位整数(范围:0 到 255)。转换失败时返回 0 SELECT toUInt8OrZero('255') AS result; SELECT toUInt8OrZero('abc') AS result; 255 0
toInt8OrZero(string) 将字符串转换为有符号8位整数(范围:-128 到 127)。转换失败时返回 0 SELECT toInt8OrZero('-128') AS result; SELECT toInt8OrZero('abc') AS result; -128 0
toFloat32OrZero(string) 将字符串转换为32位浮点数。转换失败时返回 0 SELECT toFloat32OrZero('123.456') AS result; SELECT toFloat32OrZero('abc') AS result; 123.456 0

注意

  1. 转换失败的定义:当输入字符串无法被解析为对应类型(整数/浮点数)的有效数字表示时,即视为转换失败。
  2. 与标准转换函数的区别 :标准转换函数(如 toInt8)在遇到无法转换的字符串时会抛出异常,而 OrZero系列函数则安全地返回 0,适用于需要容错处理的场景。

3、将 字符串、整数(时间戳)或日期时间类型 转换为日期类型

toDate()、toDateTme()

此类函数用于将各种格式的输入转换为日期(Date)或日期时间(DateTime)类型。

函数 功能描述 示例 结果
toDate(value) 将字符串、整数(Unix时间戳)或DateTime转换为日期类型(仅包含年月日)。 SELECT toDate('2026-03-15 14:30:45') AS date; SELECT toDate(1678886400) AS date; SELECT toDate(now()) AS date; 2026-03-15 2023-03-16 2023-07-20(当前日期)
toDateTime(value [, timezone]) 将字符串、整数(Unix时间戳)或Date转换为日期时间类型(包含年月日时分秒)。可选的第二个参数指定时区。 SELECT toDateTime('2026-03-15 14:30:45') AS datetime; SELECT toDateTime(1678886400) AS datetime; SELECT toDateTime('2026-03-15 14:30:45','Asia/Shanghai') AS datetime; 2026-03-15 14:30:45 2023-03-16 00:00:00 2026-03-15 14:30:45(上海时区)

注意

  1. 时间戳处理:整数参数被解释为Unix时间戳(自1970-01-01 00:00:00 UTC以来的秒数)。
  2. 时区toDateTime函数支持可选的时区参数。如果未指定,默认使用服务器时区。
  3. 格式要求 :字符串输入必须符合标准的日期或日期时间格式(如'YYYY-MM-DD''YYYY-MM-DD HH:MM:SS'),否则转换将失败。

4、时间戳与日期相互转换函数

fromUnixTimestamp()、toDate()

关系如下:

Unix时间戳 (秒/毫秒) ⇄ DateTime/DateTime64 ⇄ Date

整数类型 日期时间类型 日期类型

此类函数用于Unix时间戳(秒级)与Date/DateTime类型之间的转换

函数 功能描述 示例 结果
fromUnixTimestamp(unix_timestamp [, timezone]) 将秒级Unix时间戳转换为DateTime类型。可选的第二个参数用于指定输出时间的时区。 SELECT fromUnixTimestamp(1700000000) AS dt; 2023-11-14 22:13:20(默认UTC时区)
指定目标时区进行转换。 SELECT fromUnixTimestamp(1700000000, 'Asia/Shanghai') AS dt_beijing; 2023-11-15 06:13:20(北京时间,UTC+8)
toDate(value) 从秒级Unix时间戳直接获取Date(仅日期部分)。 SELECT toDate(1700000000) AS date_only; 2023-11-14
组合fromUnixTimestamp使用,先转为DateTime再提取Date。 SELECT toDate(fromUnixTimestamp(1700000000)) AS same; 2023-11-14
从DateTime类型中提取Date。 SELECT toDate(toDateTime(1700000000)) AS date_from_dt; 2023-11-14

注意

  1. 时区影响fromUnixTimestamp的转换结果依赖于时区。不指定时区时,默认使用UTC;指定时区后,结果会相应调整。
  2. toDate的多功能性toDate函数可以直接接收时间戳,也可以接收DateTime类型作为输入,均能正确提取出日期部分,使用上非常灵活。

5、其他

cast()、toString()、toTypeName()

此类函数用于在数据类型之间进行转换,或将值转换为字符串,以及查询值的数据类型。

函数 功能描述 示例 结果
cast(value, type) 将值转换为指定的数据类型。这是通用的类型转换函数。 SELECT cast('123', 'Int32') AS int_val; SELECT cast(123.456, 'String') AS str_val; SELECT cast('2026-03-15', 'Date') AS date_val; 123 '123.456' 2026-03-15
使用::运算符进行类型转换(CAST的语法糖)。 SELECT '123'::Int32 AS int_val; SELECT 123.456::String AS str_val; 123 '123.456'
toString(value) 将任意类型的值转换为字符串表示。 SELECT toString(123) AS str; SELECT toString(12.34) AS str; SELECT toString(today()) AS str; '123' '12.34' '2026-03-15'
toTypeName(value) 返回传入值的数据类型名称。 SELECT toTypeName(123) AS type; SELECT toTypeName(12.34) AS type; SELECT toTypeName('hello') AS type; SELECT toTypeName(today()) AS type; 'Int32' 'Float64' 'String' 'Date'

注意

  1. 类型转换的安全性cast函数在转换失败时会抛出异常。对于可能转换失败的情况,建议使用带有OrZeroOrNullOrDefault后缀的安全转换函数(如之前提到的toInt32OrZero等)。
  2. ::运算符运算符:这是CAST函数的简写形式,功能完全相同,但书写更简洁。
  3. toString`的用途:常用于将数值、日期等类型转换为字符串以便进行字符串拼接、格式化输出等操作。
  4. toTypeName的调试价值:在编写复杂查询或处理不确定类型的列时,此函数非常有用,可帮助确认数据的实际类型。

三、字符串函数

1、字符串处理

length()、lower()、upper()、subString()、concat()

empty()、notEmpty()、reverse()、appendTrailingCharIfAbsent()

此类函数用于处理字符串,包括获取长度、转换大小写、截取子串、拼接、判断空值、反转和追加字符等操作。

函数 功能描述 示例 结果
length(s) 返回字符串的字节长度(对于UTF-8编码,一个汉字占3个字节)。 SELECT length('Hello') AS len; SELECT length('你好') AS len; 5 6
lower(s) 将字符串转换为小写。 SELECT lower('Hello WORLD') AS lower_str; 'hello world'
upper(s) 将字符串转换为大写。 SELECT upper('Hello world') AS upper_str; 'HELLO WORLD'
substring(s, offset, length) (或 substr 从字符串 soffset位置开始截取指定 length长度的子串。位置从1开始计数。 SELECT substring('Hello World', 7, 5) AS substr; SELECT substring('你好世界', 4, 3) AS substr; 'World' '世'(UTF-8中一个汉字占3个字节)
concat(s1, s2, ...) 将多个字符串按顺序拼接成一个字符串。 SELECT concat('Hello', ' ', 'World') AS concat_str; SELECT concat('2026', '-', '03', '-', '15') AS date_str; 'Hello World' '2026-03-15'
empty(s) 判断字符串是否为空。如果字符串为空(长度为0),则返回1,否则返回0。 SELECT empty('') AS is_empty; SELECT empty('Hello') AS is_empty; 1 0
notEmpty(s) 判断字符串是否非空。如果字符串长度大于0,则返回1,否则返回0。 SELECT notEmpty('') AS not_empty; SELECT notEmpty('Hello') AS not_empty; 0 1
reverse(s) 将字符串反转。 SELECT reverse('abc') AS rev; SELECT reverse('你好') AS rev; 'cba' '好你'
appendTrailingCharIfAbsent(s, char) 如果字符串 s的末尾没有以字符 char结尾,则在末尾追加该字符。 SELECT appendTrailingCharIfAbsent('hello', '!') AS str1; SELECT appendTrailingCharIfAbsent('hello!', '!') AS str2; 'hello!' 'hello!'(已以'!'结尾,保持不变)

注意

  1. 字符串长度length函数返回的是字节数,而非字符数。对于多字节字符(如中文),需要使用 lengthUTF8函数来获取字符数。
  2. 子串截取 *:substring函数的偏移量(offset)从1开始。如果使用字节偏移,对于多字节字符需谨慎;可使用 substringUTF8函数按字符数截取。
  3. 空字符串判断 *:emptynotEmpty函数对于只包含空白字符的字符串会返回非空(因为长度大于0),必要时可结合 trim函数使用。
  4. 字符追加 *:appendTrailingCharIfAbsent常用于确保字符串以特定字符(如路径分隔符)结尾,避免重复追加。

2、字符串查找、替换、切割、拼接、重复与空格填充

字符串查找:

match()、extractAll()、like()、notLike()

函数 功能描述 示例 结果
match(haystack, pattern) 检查字符串 haystack是否与正则表达式 pattern匹配。匹配返回1,否则返回0。 SELECT match('Hello World', '^Hello.*') AS matched; SELECT match('Hello World', '^World.*') AS matched; 1 0
extractAll(haystack, pattern) 从字符串 haystack中提取所有匹配正则表达式 pattern的子串,返回一个数组。 SELECT extractAll('a1 b2 c3', '[a-c]') AS extracts; SELECT extractAll('123-456-789', '\d+') AS extracts; ['a','b','c'] ['123','456','789']
like(haystack, pattern) 检查字符串 haystack是否匹配简单的SQL LIKE模式(支持 %_通配符)。匹配返回1,否则返回0。 SELECT like('Hello World', 'Hello%') AS is_like; SELECT like('Hello World', '%World') AS is_like; SELECT like('Hello World', 'Hello_World') AS is_like; 1 1 0
notLike(haystack, pattern) 检查字符串 haystack是否不匹配简单的SQL LIKE模式。不匹配返回1,否则返回0。 SELECT notLike('Hello World', 'Hello%') AS not_like; SELECT notLike('Hello World', '%Test%') AS not_like; 0 1
字符串替换:

repalceOne()、repalceAll()、repalceRegexpOne()、repalceRegexpAll()

函数 功能描述 示例 结果
replaceOne(haystack, pattern, replacement) 将字符串 haystack第一个 匹配的子串 pattern替换为 replacement SELECT replaceOne('Hello World World', 'World', 'Test') AS replaced; SELECT replaceOne('aaa', 'a', 'b') AS replaced; 'Hello Test World' 'baa'
replaceAll(haystack, pattern, replacement) 将字符串 haystack所有 匹配的子串 pattern替换为 replacement SELECT replaceAll('Hello World World', 'World', 'Test') AS replaced; SELECT replaceAll('aaa', 'a', 'b') AS replaced; 'Hello Test Test' 'bbb'
replaceRegexpOne(haystack, pattern, replacement) 使用正则表达式 pattern进行匹配,替换字符串 haystack第一个匹配项。 SELECT replaceRegexpOne('Hello 123 World 456', '\d+', '#') AS replaced; SELECT replaceRegexpOne('a1 b2 c3', '[a-z]', '*') AS replaced; 'Hello # World 456' '*1 b2 c3'
replaceRegexpAll(haystack, pattern, replacement) 使用正则表达式 pattern进行匹配,替换字符串 haystack所有匹配项。 SELECT replaceRegexpAll('Hello 123 World 456', '\d+', '#') AS replaced; SELECT replaceRegexpAll('a1 b2 c3', '[a-z]', '*') AS replaced; 'Hello # World #' '*1 *2 *3'
字符串切割:

splitByChar()、splitByString()

函数 功能描述 示例 结果
splitByChar(separator, haystack) 使用单个字符 separator作为分隔符,将字符串 haystack分割成子串数组。 SELECT splitByChar(',', 'a,b,c') AS parts; ['a','b','c']
splitByString(separator, haystack) 使用字符串 separator作为分隔符,将字符串 haystack分割成子串数组。 SELECT splitByString('--', 'x--y--z') AS parts; ['x','y','z']

注意

  1. 正则表达式matchextractAllreplaceRegexpOnereplaceRegexpAll使用正则表达式,语法遵循Re2库。
  2. LIKE模式likenotLike使用SQL标准的LIKE模式,其中 %匹配任意数量字符,_匹配单个字符。
  3. 替换函数replaceOnereplaceAll进行简单字符串替换,而 replaceRegexpOnereplaceRegexpAll使用正则表达式进行模式匹配替换。
  4. 分割函数splitByChar要求分隔符为单个字符,而 splitByString的分隔符可以是任意字符串。
字符串拼接函数

此类函数用于将多个字符串或值连接成单个字符串。

函数 功能描述 示例 结果
concat(s1, s2, ...) 将多个字符串按顺序连接成一个字符串。 SELECT concat('Hello', ' ', 'World') AS str; SELECT concat('2026', '-', '03', '-', '15') AS date_str; SELECT concat(42, ' is the answer') AS mixed; 'Hello World' '2026-03-15' '42 is the answer'(数字被隐式转换为字符串)
concatAssumeInjective(s1, s2, ...) 功能同concat,但向查询优化器声明此连接是"单射的"(即不同输入始终产生不同输出),可用于查询优化。 SELECT concatAssumeInjective('user', '_', 123) AS user_id; SELECT concatAssumeInjective('path/', filename) AS full_path; 'user_123' 'path/document.txt'(假设filename='document.txt')
concatWithSeparator(separator, s1, s2, ...) 用指定的分隔符连接多个字符串。 SELECT concatWithSeparator(', ', 'apple', 'banana', 'cherry') AS fruits; SELECT concatWithSeparator('-', '2026', '03', '15') AS date_str; 'apple, banana, cherry' '2026-03-15'
format(pattern, s1, s2, ...) 按照C风格的格式化字符串(%s%d等)将参数格式化。 SELECT format('Hello %s!', 'World') AS greeting; SELECT format('%s is %d years old', 'Alice', 30) AS info; SELECT format('%04d-%02d-%02d', 2026, 3, 15) AS date_str; 'Hello World!' 'Alice is 30 years old' '2026-03-15'

字符串拼接运算符

除了函数,ClickHouse还支持||运算符进行字符串连接。

运算符/用法 功能描述 示例 结果
**`s1 s2

字符串重复与空格填充
函数 功能描述 示例 结果
repeat(s, n) 将字符串s重复n次。 SELECT repeat('ab', 3) AS repeated; SELECT repeat('-', 10) AS line; 'ababab' '----------'
space(n) 返回由n个空格组成的字符串。 `SELECT 'Hello'

四、条件判断函数

此类函数用于根据条件执行不同的操作,实现类似编程语言中的 if-else 逻辑。

函数 功能描述 示例 结果
if(condition, then, else) 如果条件为真(非零),返回then的值,否则返回else的值。 SELECT if(1 > 0, 'true', 'false') AS result; SELECT if(length('abc') > 5, 'long', 'short') AS result; SELECT if(0, 'yes', 'no') AS result; 'true' 'short' 'no'
multiIf(cond1, res1, cond2, res2, ..., else_res) 多条件分支判断,按顺序检查条件,返回第一个为真条件对应的结果,如果没有条件为真则返回else_res SELECT multiIf(score >= 90, 'A', score >= 80, 'B', score >= 60, 'C', 'D') AS grade FROM (SELECT 85 AS score); SELECT multiIf(1=2, 'a', 3>2, 'b', 'c') AS result; 'B' 'b'
CASE 表达式 CASE WHEN cond1 THEN res1 WHEN cond2 THEN res2 ... ELSE else_res END 标准SQL的CASE WHEN表达式,功能同multiIf,但语法更SQL标准。 SELECT CASE WHEN 1=0 THEN 'a' WHEN 1=1 THEN 'b' ELSE 'c' END AS result; SELECT CASE WHEN 2>3 THEN 'big' WHEN 2>1 THEN 'small' ELSE 'equal' END AS result; 'b' 'small'
isNull(x) 检查参数是否为NULL。如果是NULL则返回1,否则返回0。 SELECT isNull(NULL) AS isnull1; SELECT isNull('not null') AS isnull2; 1 0
isNotNull(x) 检查参数是否不为NULL。如果不是NULL则返回1,否则返回0。 SELECT isNotNull(NULL) AS notnull1; SELECT isNotNull('not null') AS notnull2; 0 1
ifNull(x, y) 如果x不为NULL,则返回x,否则返回y SELECT ifNull(NULL, 'default') AS val1; SELECT ifNull('not null', 'default') AS val2; 'default' 'not null'
nullIf(x, y) 如果x等于y,则返回NULL,否则返回x SELECT nullIf(5, 5) AS val1; SELECT nullIf(5, 3) AS val2; NULL 5
coalesce(x1, x2, ..., xn) 返回参数列表中第一个非NULL的值。如果所有参数都为NULL,则返回NULL。 SELECT coalesce(NULL, NULL, 'first not null', 'ignored') AS val; SELECT coalesce(NULL, NULL, NULL) AS val; 'first not null' NULL

注意

  1. 条件判断:条件表达式应为布尔类型(0表示假,非0表示真)。
  2. 类型一致性ifmultiIf函数中的then/else参数应有相同或兼容的数据类型。
  3. NULL处理isNullisNotNullifNullnullIfcoalesce是专门处理NULL值的函数,在数据清洗和转换中非常有用。
  4. CASE表达式 :是SQL标准语法,可读性更好,尤其适用于多个条件分支的情况。multiIf是ClickHouse的特定函数,功能相同但语法更简洁。
  5. 性能multiIf在处理大量分支时可能比嵌套的if函数更高效。

五、数学函数

此类函数用于执行基本的数学运算,包括取整、绝对值、幂运算、对数、三角函数等。

函数 功能描述 示例 结果
abs(x) 返回x的绝对值。 SELECT abs(-5) AS val; SELECT abs(3.14) AS val; 5 3.14
ceil(x) (或ceiling 返回大于或等于x的最小整数(向上取整)。 SELECT ceil(3.14) AS val; SELECT ceil(-3.14) AS val; 4 -3
floor(x) 返回小于或等于x的最大整数(向下取整)。 SELECT floor(3.14) AS val; SELECT floor(-3.14) AS val; 3 -4
round(x , n) x四舍五入到指定的小数位数n。如果省略n,则四舍五入到整数。 SELECT round(3.14159, 2) AS val; SELECT round(3.14159) AS val; SELECT round(3.5) AS val; 3.14 3 4
truncate(x , n) (或trunc x截断到指定的小数位数n(不四舍五入)。如果省略n,则截断为整数。 SELECT truncate(3.14159, 2) AS val; SELECT truncate(3.14159) AS val; SELECT truncate(3.999) AS val; 3.14 3 3
pow(x, y) (或power 返回xy次幂。 SELECT pow(2, 3) AS val; SELECT pow(9, 0.5) AS val; 8 3
sqrt(x) 返回x的平方根。 SELECT sqrt(9) AS val; SELECT sqrt(2) AS val; 3 1.4142135623730951
exp(x) 返回e(自然对数的底)的x次幂。 SELECT exp(1) AS val; SELECT exp(0) AS val; 2.718281828459045 1
ln(x) (或log 返回x的自然对数(以e为底)。 SELECT ln(1) AS val; SELECT ln(exp(2)) AS val; 0 2
log10(x) 返回x的以10为底的对数。 SELECT log10(100) AS val; SELECT log10(1000) AS val; 2 3
log2(x) 返回x的以2为底的对数。 SELECT log2(8) AS val; SELECT log2(1) AS val; 3 0
sin(x) 返回x的正弦值,x为弧度。 SELECT sin(0) AS val; SELECT sin(pi()/2) AS val; 0 1
cos(x) 返回x的余弦值,x为弧度。 SELECT cos(0) AS val; SELECT cos(pi()) AS val; 1 -1
tan(x) 返回x的正切值,x为弧度。 SELECT tan(0) AS val; SELECT tan(pi()/4) AS val; 0 1
asin(x) 返回x的反正弦值,结果在[-π/2, π/2]弧度之间。 SELECT asin(0) AS val; SELECT asin(1) AS val; 0 1.5707963267948966
acos(x) 返回x的反余弦值,结果在[0, π]弧度之间。 SELECT acos(1) AS val; SELECT acos(0) AS val; 0 1.5707963267948966
atan(x) 返回x的反正切值,结果在[-π/2, π/2]弧度之间。 SELECT atan(0) AS val; SELECT atan(1) AS val; 0 0.7853981633974483
pi() 返回圆周率π的近似值。 SELECT pi() AS pi_val; 3.141592653589793
mod(x, y) 返回x除以y的余数。 SELECT mod(10, 3) AS val; SELECT mod(10.5, 3) AS val; 1 1.5
rand() 返回一个在[0, 1)范围内的均匀分布随机浮点数。 SELECT rand() AS random_val; SELECT rand() AS another_random; 随机值,如0.123456 另一个随机值
randConstant() 返回一个在[0, 1)范围内的随机浮点数,但在单个查询中该值是常量。 SELECT randConstant() AS const_random; (同一查询中多次调用返回相同值) 随机但固定的值,如0.789

注意

  1. 参数单位 :三角函数(sincostan等)的参数为弧度,而非角度。可使用pi()函数进行转换,例如sin(radians(30)),但ClickHouse本身不提供radians函数,需手动计算(弧度 = 角度 * π / 180)。
  2. 取整差异ceil始终向上取整,floor始终向下取整,round为四舍五入,truncate为直接截断。
  3. 随机数生成rand()每次调用都可能返回不同的值,而randConstant()在同一个查询中返回相同的值,但在不同查询中会变化。
  4. 数学常数pi()函数返回圆周率π,常用于三角函数计算。

六、URL操作函数

此类函数用于解析、提取和处理URL字符串的各个组成部分。

函数 功能描述 示例 结果
protocol(url) 提取URL的协议部分(如http、https、ftp等)。 SELECT protocol('https://www.example.com/path') AS prot; SELECT protocol('ftp://server.com/file.txt') AS prot; 'https' 'ftp'
domain(url) 提取URL的域名(包含端口)。 SELECT domain('https://www.example.com:8080/path') AS dom; SELECT domain('https://sub.example.com/path') AS dom; 'www.example.com:8080' 'sub.example.com'
domainWithoutWWW(url) 提取URL的域名,并去除开头的"http://www."。 SELECT domainWithoutWWW('https://www.example.com/path') AS dom; SELECT domainWithoutWWW('https://example.com/path') AS dom; 'example.com' 'example.com'
topLevelDomain(url) 提取URL的顶级域名(TLD)。 SELECT topLevelDomain('https://www.example.com/path') AS tld; SELECT topLevelDomain('https://www.example.co.uk/path') AS tld; 'com' 'co.uk'
firstSignificantSubdomain(url) 提取URL的第一个有效子域名。通常返回二级域名(对于.com等gTLD)或三级域名(对于.co.uk等ccTLD)。 SELECT firstSignificantSubdomain('https://www.example.com/path') AS sub; SELECT firstSignificantSubdomain('https://news.bbc.co.uk/path') AS sub; 'example' 'bbc'
cutToFirstSignificantSubdomain(url) 截取到第一个有效子域名的部分。 SELECT cutToFirstSignificantSubdomain('https://www.example.com/path') AS cut; SELECT cutToFirstSignificantSubdomain('https://news.bbc.co.uk/path') AS cut; 'example.com' 'bbc.co.uk'
path(url) 提取URL的路径部分(不包含查询参数和片段标识)。 SELECT path('https://example.com/path/to/file?q=1#section') AS p; SELECT path('https://example.com/') AS p; '/path/to/file' '/'
pathFull(url) 提取URL的完整路径(包括查询参数和片段标识)。 SELECT pathFull('https://example.com/path?q=1#section') AS full; SELECT pathFull('https://example.com/') AS full; '/path?q=1#section' '/'
queryString(url) 提取URL的查询字符串(问号之后的部分,不包含片段标识)。 SELECT queryString('https://example.com/path?q=1&t=2#section') AS qs; SELECT queryString('https://example.com/path') AS qs; 'q=1&t=2' ''
fragment(url) 提取URL的片段标识(#之后的部分)。 SELECT fragment('https://example.com/path#section1') AS frag; SELECT fragment('https://example.com/path') AS frag; 'section1' ''
queryParameter(url, param) 提取指定查询参数的值。 SELECT queryParameter('https://example.com/?q=1&t=2', 'q') AS val; SELECT queryParameter('https://example.com/?q=1&t=2', 't') AS val; SELECT queryParameter('https://example.com/?q=1&t=2', 'nonexistent') AS val; '1' '2' ''
decodeURLComponent(url_encoded_string) 对URL编码的字符串进行解码。 SELECT decodeURLComponent('hello%20world%21') AS decoded; SELECT decodeURLComponent('%E4%BD%A0%E5%A5%BD') AS decoded; 'hello world!' '你好'
encodeURLComponent(string) 对字符串进行URL编码(包括所有特殊字符)。 SELECT encodeURLComponent('hello world!') AS encoded; SELECT encodeURLComponent('你好') AS encoded; 'hello%20world%21' '%E4%BD%A0%E5%A5%BD'
encodeURL(string) 对字符串进行URL编码,但保留部分特殊字符不编码(如/?#=&等)。 SELECT encodeURL('path/to/file?q=1&t=2') AS encoded; SELECT encodeURL('你好 世界') AS encoded; 'path/to/file?q=1&t=2' '%E4%BD%A0%E5%A5%BD%20%E4%B8%96%E7%95%8C'
cutWWW(url) 去除URL中的"http://www."前缀。 SELECT cutWWW('www.example.com') AS cut; SELECT cutWWW('example.com') AS cut; 'example.com' 'example.com'
cutQueryString(url) 去除URL中的查询字符串部分。 SELECT cutQueryString('https://example.com/path?q=1#section') AS cut; SELECT cutQueryString('https://example.com/path#section') AS cut; 'https://example.com/path#section' 'https://example.com/path#section'
cutFragment(url) 去除URL中的片段标识部分。 SELECT cutFragment('https://example.com/path?q=1#section') AS cut; SELECT cutFragment('https://example.com/path?q=1') AS cut; 'https://example.com/path?q=1' 'https://example.com/path?q=1'
extractURLParameterNames(url) 提取URL中所有查询参数的名称,返回数组。 SELECT extractURLParameterNames('https://example.com/?q=1&t=2&s=3') AS params; SELECT extractURLParameterNames('https://example.com/') AS params; ['q','t','s'] []
extractURLParameters(url) 提取URL中所有查询参数,返回Map(String, String)类型。 SELECT extractURLParameters('https://example.com/?q=1&t=2&t=3') AS params; SELECT extractURLParameters('https://example.com/') AS params; {'q':'1','t':'3'}(注意:相同参数名取最后一个值) {}

注意

  1. 子域名处理firstSignificantSubdomaincutToFirstSignificantSubdomain函数会考虑公共后缀列表,正确处理 .co.uk.com.cn等特殊域名的逻辑。
  2. 编码/解码encodeURLComponent会编码所有非字母数字字符,而 encodeURL会保留一些URL特殊字符不编码,通常用于编码整个URL的各个部分。
  3. 查询参数queryParameter只返回第一个匹配参数的值。如果有多个同名参数,可以使用 extractURLParameters获取所有值(以Map形式)。
  4. 中文编码:URL编码/解码函数能正确处理UTF-8字符,如中文字符。

七、JSON操作函数

此类函数用于解析、提取和操作JSON格式的数据。

函数 功能描述 示例 结果
JSONExtract(json, type) 从JSON字符串中提取值并转换为指定类型。type可以是StringIntFloatBoolArrayObject等。 SELECT JSONExtract('{"name": "Alice", "age": 30}', 'String', 'name') AS name; SELECT JSONExtract('{"age": 30}', 'Int', 'age') AS age; 'Alice' 30
JSONExtractString(json, path, ...) 从JSON中提取字符串值。支持通过路径(用点号或方括号)访问嵌套字段。 SELECT JSONExtractString('{"user": {"name": "Alice"}}', 'user', 'name') AS name; SELECT JSONExtractString('{"list": ["a", "b"]}', 'list', 1) AS item;(索引从1开始) 'Alice' 'a'
JSONExtractInt(json, path, ...) 从JSON中提取整数值。 SELECT JSONExtractInt('{"data": {"count": 100}}', 'data', 'count') AS count; SELECT JSONExtractInt('{"value": 42}', 'value') AS val; 100 42
JSONExtractFloat(json, path, ...) 从JSON中提取浮点数值。 SELECT JSONExtractFloat('{"price": 19.99}', 'price') AS price; SELECT JSONExtractFloat('{"stats": {"avg": 3.14}}', 'stats', 'avg') AS avg; 19.99 3.14
JSONExtractBool(json, path, ...) 从JSON中提取布尔值。 SELECT JSONExtractBool('{"active": true}', 'active') AS active; SELECT JSONExtractBool('{"settings": {"enabled": false}}', 'settings', 'enabled') AS enabled; 1(true) 0(false)
JSONExtractArrayRaw(json, [path, ...]) 从JSON中提取数组,返回原始的JSON字符串数组。 SELECT JSONExtractArrayRaw('{"items": ["a", "b", "c"]}', 'items') AS items; SELECT JSONExtractArrayRaw('{"data": [1, 2, 3]}', 'data') AS data; '["a","b","c"]' '[1,2,3]'
JSONExtractKeys(json, [path, ...]) 从JSON对象中提取所有键名,返回数组。 SELECT JSONExtractKeys('{"name": "A", "age": 20}') AS keys; SELECT JSONExtractKeys('{"user": {"name": "A", "age": 20}}', 'user') AS keys; ['name','age'] ['name','age']
JSONExtractValues(json, [path, ...]) 从JSON对象中提取所有值,返回JSON字符串数组。 SELECT JSONExtractValues('{"a": 1, "b": "hello"}') AS values; SELECT JSONExtractValues('{"x": {"a": 1, "b": 2}}', 'x') AS values; ['1','"hello"'] ['1','2']
JSONExtractRaw(json, [path, ...]) 从JSON中提取任意类型的值,返回原始的JSON字符串表示。 SELECT JSONExtractRaw('{"data": {"nested": 123}}', 'data') AS raw; SELECT JSONExtractRaw('{"list": [1,2,3]}', 'list', 1) AS item; '{"nested":123}' '1'
JSONHas(json, [path, ...]) 检查JSON中是否存在指定的键或路径。存在返回1,否则返回0。 SELECT JSONHas('{"a": 1}', 'a') AS has; SELECT JSONHas('{"a": {"b": 2}}', 'a', 'b') AS has; SELECT JSONHas('{"a": 1}', 'b') AS has; 1 1 0
JSONLength(json, [path, ...]) 返回JSON数组的长度或JSON对象的键值对数量。 SELECT JSONLength('{"a": 1, "b": 2}') AS len; SELECT JSONLength('{"items": ["a", "b", "c"]}', 'items') AS len; SELECT JSONLength('[]') AS len; 2 3 0
JSONType(json, [path, ...]) 返回JSON值的类型名称,如ObjectArrayStringIntBoolNull等。 SELECT JSONType('{"a": 1}') AS type; SELECT JSONType('["a", "b"]') AS type; SELECT JSONType('123') AS type; SELECT JSONType('null') AS type; 'Object' 'Array' 'Int' 'Null'
JSONExtractKeysAndValues(json, [path, ...]) 从JSON对象中提取所有键值对,返回Map(String, String)类型。 SELECT JSONExtractKeysAndValues('{"a": 1, "b": "hello"}') AS map; SELECT JSONExtractKeysAndValues('{"x": {"a": 1, "b": 2}}', 'x') AS map; {'a':'1','b':'"hello"'} {'a':'1','b':'2'}
JSONExtractArray(json, type, [path, ...]) 从JSON中提取数组,并将每个元素转换为指定的类型。 SELECT JSONExtractArray('[1, 2, 3]', 'Int') AS arr; SELECT JSONExtractArray('["a", "b", "c"]', 'String') AS arr; [1,2,3] ['a','b','c']
visitParamExtractInt(json, param_name) 从简单的JSON字符串中提取整数参数(仅适用于简单的key:value格式)。 SELECT visitParamExtractInt('{"id": 100}', 'id') AS id; SELECT visitParamExtractInt('{"score": 95.5}', 'score') AS score;(浮点数截断) 100 95
visitParamExtractString(json, param_name) 从简单的JSON字符串中提取字符串参数(仅适用于简单的key:value格式)。 SELECT visitParamExtractString('{"name": "Alice"}', 'name') AS name; SELECT visitParamExtractString('{"data": "value"}', 'data') AS data; 'Alice' 'value'
JSONExtractUInt JSONExtractInt8 JSONExtractInt16 JSONExtractInt32 JSONExtractInt64 JSONExtractUInt8 JSONExtractUInt16 JSONExtractUInt32 JSONExtractUInt64 JSONExtractFloat32 JSONExtractFloat64 从JSON中提取指定精度的数值。功能同JSONExtractInt/Float,但可以明确指定整数位数和符号。 SELECT JSONExtractUInt64('{"big": 1234567890123}', 'big') AS big; SELECT JSONExtractFloat64('{"pi": 3.14159265358979}', 'pi') AS pi; 1234567890123 3.14159265358979

注意

  1. 路径语法 :路径可以是字符串键(用点号.连接)或数组索引(从1开始)。例如'a.b''a'1'list'0等。
  2. 性能visitParamExtract*函数比JSONExtract*函数性能更高,但仅适用于简单的、非嵌套的JSON字符串。
  3. 类型转换:如果JSON中的值与目标类型不兼容,函数会尝试转换,如果无法转换则返回默认值(0、空字符串、false等)。
  4. 嵌套访问JSONExtract*系列函数支持通过多个参数指定嵌套路径,如JSONExtractString(json, 'user', 'profile', 'name')
  5. 数组索引:在ClickHouse JSON函数中,数组索引通常从1开始,而不是从0开始。

八、IP地址操作函数

此类函数用于处理IPv4和IPv6地址,包括地址验证、类型转换、子网计算和属性提取

函数 功能描述 示例 结果
toIPv4(str) 将字符串转换为IPv4类型的值。这是最常用的IPv4创建函数。 SELECT toIPv4('192.168.0.1') AS ipv4; SELECT toIPv4('1.1.1.1') AS ipv4; '192.168.0.1' '1.1.1.1'
toIPv6(str) 将字符串转换为IPv6类型的值。这是最常用的IPv6创建函数。 SELECT toIPv6('2a02:6b8::11') AS ipv6; SELECT toIPv6('::ffff:192.168.0.1') AS ipv6; '2a02:6b8::11' '::ffff:192.168.0.1'
isIPv4String(str) 检查字符串是否为有效的IPv4地址。常用于数据验证。 SELECT isIPv4String('192.168.0.1') AS valid; SELECT isIPv4String('256.256.256.256') AS valid; 1 0
isIPv6String(str) 检查字符串是否为有效的IPv6地址。常用于数据验证。 SELECT isIPv6String('2a02:6b8::11') AS valid; SELECT isIPv6String('invalid') AS valid; 1 0
isIPAddressInRange(ip, cidr) 检查IP地址是否在指定的CIDR子网范围内。这是IP过滤和分组的核心函数。 SELECT isIPAddressInRange('192.168.1.5', '192.168.1.0/24') AS in_range; SELECT isIPAddressInRange('10.0.0.1', '192.168.1.0/24') AS in_range; 1 0
IPv4NumToString(num) 将32位整数表示的IPv4地址转换为字符串格式。用于处理存储为整数的IP地址。 SELECT IPv4NumToString(3232235521) AS ip_str; SELECT IPv4NumToString(16843009) AS ip_str; '192.168.0.1' '1.1.1.1'
IPv4StringToNum(str) 将IPv4地址字符串转换为32位整数表示。用于将IP地址转换为整数存储。 SELECT IPv4StringToNum('192.168.0.1') AS ip_num; SELECT IPv4StringToNum('1.1.1.1') AS ip_num; 3232235521 16843009
toIPv4OrDefault(str) 将字符串转换为IPv4类型的值,如果转换失败则返回默认值(0.0.0.0)。这是安全的转换函数。 SELECT toIPv4OrDefault('192.168.0.1') AS ip; SELECT toIPv4OrDefault('invalid') AS ip; '192.168.0.1' '0.0.0.0'
toIPv6OrDefault(str) 将字符串转换为IPv6类型的值,如果转换失败则返回默认值(::)。这是安全的转换函数。 SELECT toIPv6OrDefault('2a02:6b8::1') AS ip; SELECT toIPv6OrDefault('invalid') AS ip; '2a02:6b8::1' '::'

精选说明

  1. 基础转换toIPv4toIPv6是最常用的IP地址创建函数,推荐优先使用。
  2. 验证函数isIPv4StringisIPv6String用于数据清洗和验证,确保IP地址格式正确。
  3. 核心功能isIPAddressInRange是IP分析的核心,用于IP归属判断、网络过滤等场景。
  4. 格式转换IPv4NumToStringIPv4StringToNum用于处理存储为整数的IP地址(常见于日志系统)。
  5. 安全转换toIPv4OrDefaulttoIPv6OrDefault提供安全的转换方式,避免因无效IP地址导致的查询错误。

这9个函数覆盖了IP地址处理的绝大部分常见需求,包括创建、验证、格式转换、范围判断和安全处理。

九、加密与哈希函数

函数 功能描述 示例 结果
MD5(string) 计算字符串的MD5哈希值(128位/16字节),返回32个十六进制字符。 SELECT MD5('hello') AS md5_hash; SELECT MD5('') AS md5_empty; '5d41402abc4b2a76b9719d911017c592' 'd41d8cd98f00b204e9800998ecf8427e'
SHA1(string) 计算字符串的SHA1哈希值(160位/20字节),返回40个十六进制字符。 SELECT SHA1('hello') AS sha1_hash; SELECT SHA1('') AS sha1_empty; 'aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d' 'da39a3ee5e6b4b0d3255bfef95601890afd80709'
SHA256(string) 计算字符串的SHA256哈希值(256位/32字节),返回64个十六进制字符。 SELECT SHA256('hello') AS sha256_hash; SELECT SHA256('') AS sha256_empty; '2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824' 'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855'
SHA512(string) 计算字符串的SHA512哈希值(512位/64字节),返回128个十六进制字符。 SELECT SHA512('hello') AS sha512_hash; SELECT SHA512('') AS sha512_empty; '9b71d224bd62f3785d96d46ad3ea3d73319bfbc2890caadae2dff72519673ca72323c3d99ba5c11d7c7acc6e14b8c5da0c4663475c2e5c3adef46f73bcdec043' 'cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e'
base64Encode(string) 将字符串进行Base64编码。 SELECT base64Encode('hello world') AS encoded; SELECT base64Encode('你好') AS encoded; 'aGVsbG8gd29ybGQ=' '5L2g5aW9'
base64Decode(string) 将Base64编码的字符串解码。 SELECT base64Decode('aGVsbG8gd29ybGQ=') AS decoded; SELECT base64Decode('5L2g5aW9') AS decoded; 'hello world' '你好'
hex(string) 将字符串编码为十六进制表示。 SELECT hex('hello') AS hex_str; SELECT hex(123) AS hex_num; '68656C6C6F' '7B'(123的十六进制)
unhex(string) 将十六进制字符串解码为原始字符串。 SELECT unhex('68656C6C6F') AS original; SELECT unhex('7B') AS original_num; 'hello' '{'(ASCII 123是'{')
cityHash64(string) 计算字符串的CityHash64值(64位哈希),返回UInt64整数。这是ClickHouse自带的快速非加密哈希函数。 SELECT cityHash64('hello') AS cityhash; SELECT cityHash64('world') AS cityhash; '2794345569481354649' '18230407130658417560'

精选说明

  1. 安全哈希MD5SHA1SHA256SHA512是标准的密码学哈希函数,用于数据完整性验证、数字签名等。其中SHA256是目前最常用的安全哈希算法。
  2. 数据编码base64Encodebase64Decode用于二进制数据的文本化传输,如图片、文件等。
  3. 十六进制转换hexunhex用于二进制数据与可读十六进制表示之间的转换,常用于调试和日志记录。
  4. 快速哈希cityHash64是ClickHouse自带的非加密哈希函数,速度极快,适用于数据分片、去重、一致性哈希等场景,但不适用于安全加密用途。

注意事项

  • MD5和SHA1已不再被视为安全的加密哈希函数(存在碰撞攻击风险),但仍广泛用于数据完整性检查和校验和。
  • 对于安全敏感的应用,推荐使用SHA256或SHA512。
  • Base64编码会增加约33%的数据体积,因为每3个字节编码为4个字符。

十、数据限制与分组限制(limit)

此类功能(实际上是SQL子句)用于限制查询结果返回的行数,以及按组别限制返回的行数,对接口开发很友好

功能/子句 功能描述 示例 结果说明
LIMIT n 限制查询结果返回的行数,只返回前n行。 SELECT * FROM table_name LIMIT 5; SELECT name, age FROM users ORDER BY age DESC LIMIT 3; 返回查询结果的前5行。 返回年龄最大的3个用户。
LIMIT n OFFSET m (或LIMIT m, n 从结果集的第m行开始(跳过前m行),返回接下来的n行。 SELECT * FROM table_name LIMIT 5 OFFSET 10; SELECT * FROM table_name LIMIT 10, 5; 跳过前10行,返回第11-15行。 同上,两种语法等价。
LIMIT n BY expr 按表达式expr分组,每组返回最多n行。通常与ORDER BY结合使用,返回每组中的前n条记录。 SELECT department, name, salary FROM employees ORDER BY salary DESC LIMIT 2 BY department; SELECT date, user_id, action FROM logs ORDER BY timestamp DESC LIMIT 1 BY date, user_id; 每个部门返回工资最高的2名员工。 每个用户每天返回最近的一条操作记录。
LIMIT n WITH TIES 返回前n行,但如果第n行后有与第n行排序值相同的行,则也返回这些行。必须与ORDER BY一起使用。 SELECT name, score FROM students ORDER BY score DESC LIMIT 3 WITH TIES; SELECT product, sales FROM products ORDER BY sales DESC LIMIT 1 WITH TIES; 返回前3名,如果有并列第3名,则返回所有并列的。 返回销量最高的产品,如果有多个并列第一则都返回。

注意

  1. 性能影响LIMIT不改变查询的扫描行数,只是限制了返回结果。如果查询没有合适的索引,LIMIT仍可能扫描全表。
  2. 结合ORDER BY :通常 LIMIT会与 ORDER BY一起使用,以确保返回的是期望的"前n条"记录,否则返回的是任意n条。
  3. LIMIT BY 分组LIMIT n BY expr是ClickHouse特有的扩展语法,非常适用于分组取Top N的场景,比如每个类别的最新N条记录。
  4. WITH TIES 的使用场景:当需要返回并列记录时使用,如排名场景,但会增加结果集的不确定性,需谨慎使用。
  5. 分页实现LIMIT n OFFSET m常用于分页查询,但对于大数据量的深层分页性能较差(因为需要跳过大量记录)。
相关推荐
我是一颗柠檬4 小时前
【MySQL全面教学】MySQL基础与环境搭建Day1(2026年)
数据库·后端·sql·mysql·database
我是一颗柠檬4 小时前
【MySQL全面教学】MySQL数据类型详解Day2(2026年)
数据库·后端·sql·mysql·database
Daorigin_com4 小时前
从“被动领罚”到“主动合规”:强监管时代下,道本科技用数字化为企业筑牢“合规生命线”
大数据·数据仓库·科技·流程图·软件构建·数据库开发·数据库架构
DBdoctor官方4 小时前
2026 DBA实测推荐:5款数据库管理工具 监控、SQL审核、AI能力横评
数据库·sql·dba
一个数据大开发5 小时前
大模型驱动下的数据中台架构演进:从服务化到智能化
大数据·数据仓库·vscode·pycharm
Chockmans6 小时前
春秋云境CVE-2022-32992(文件上传和sql注入)保姆级教学
数据库·sql·安全·网络安全·网络攻击模型·春秋云境·cve-2022-32992
muddjsv6 小时前
SQL 语句:从产生、发展到内容全景
数据库·sql
斯特凡今天也很帅6 小时前
Spring Boot+mybatis项目切换sql为传参成无参
spring boot·sql·mybatis
weelinking7 小时前
【claude】15_Claude使用经验与最佳实践
前端·人工智能·python·sql·数据挖掘·前端框架·github