1. Apache Doris 数据类型分类
Apache Doris 提供了丰富的数据类型,主要分为以下几大类:
| 序号 | 数据类型 | 类别 | 描述 |
|---|---|---|---|
| 1 | TINYINT | 数值类型 | 1字节有符号整数,范围[-128, 127]。 |
| 2 | SMALLINT | 数值类型 | 2字节有符号整数,范围[-32768, 32767]。 |
| 3 | INT | 数值类型 | 4字节有符号整数,范围[-2^31, 2^31-1]。 |
| 4 | BIGINT | 数值类型 | 8字节有符号整数,范围[-2^64, 2^64-1]。 |
| 5 | LARGEINT | 数值类型 | 16字节有符号整数,范围极大。 |
| 6 | FLOAT | 数值类型 | 4字节浮点数。 |
| 7 | DOUBLE | 数值类型 | 8字节双精度浮点数。 |
| 8 | DECIMAL(P,S) | 数值类型 | 高精度定点数,P为总位数,S为小数位数。 |
| 9 | BOOLEAN | 数值类型 | 布尔值,0代表false,1代表true。 |
| 10 | DATE | 日期类型 | 格式'yyyy-MM-dd',范围['0000-01-01', '9999-12-31']。 |
| 11 | DATETIME([P]) | 日期类型 | 日期时间类型,可选参数P表示时间精度(0-6)。 |
| 12 | TIME | 日期类型 | 时间类型。 |
| 13 | CHAR(M) | 字符串类型 | 定长字符串,M为字节长度,范围1-255。 |
| 14 | VARCHAR(M) | 字符串类型 | 变长字符串,M为最大字节长度。 |
| 15 | STRING | 字符串类型 | 变长字符串,默认支持1MB,最大可调至2GB。 |
| 16 | IPV4 | IP类型 | IPv4地址类型。 |
| 17 | IPV6 | IP类型 | IPv6地址类型。 |
| 18 | ARRAY | 半结构化类型 | 由T类型元素组成的数组。 |
| 19 | MAP | 半结构化类型 | 由K(键)和V(值)类型元素组成的映射。 |
| 20 | STRUCT<...> | 半结构化类型 | 由多个Field组成的结构体。 |
| 21 | JSON | 半结构化类型 | 以二进制格式高效存储JSON数据。 |
| 22 | VARIANT | 半结构化类型 | 存储半结构化JSON数据,支持自动子列列式提取。 |
| 23 | BITMAP | 聚合类型 | 用于高效处理精确去重(Count Distinct)场景。 |
| 24 | HLL | 聚合类型 | 用于模糊去重,性能优于Count Distinct,误差通常在1%左右。 |
| 25 | QUANTILE_STATE | 聚合类型 | 用于计算近似百分位数(Percentile)。 |
| 26 | AGG_STATE | 聚合类型 | 存储聚合函数的中间状态,用于物化视图等高级场景。 |
2. 各种数据类型的详细说明、使用场景和特点
数值类型
| 数据类型 | 详细说明与特点 | 使用场景 |
|---|---|---|
| TINYINT | 最小的整数类型,占用空间少。 | 用户性别、订单状态标志。 |
| SMALLINT | 比TINYINT范围更大,但比INT更节省空间。 | 年份、月份、较小的计数器。 |
| INT | 最常用的整数类型,平衡了范围和性能。 | 主键ID、普通计数器、索引。 |
| BIGINT | 大整数类型,适用于超大ID或高精度计数。 | 分布式系统生成的唯一ID、大额交易金额。 |
| LARGEINT | 超大整数类型,范围极大。 | 特定科学计算或天文数字的存储。 |
| FLOAT/DOUBLE | 浮点数类型,遵循IEEE 754标准,存在精度损失风险。 | 科学计算、非精确的度量数据(如温度)。 |
| DECIMAL(P,S) | 高精度定点数,无精度损失,是金融、财务领域的首选。 | 货币金额、账务结算、精确计算场景。 |
日期类型
| 数据类型 | 详细说明与特点 | 使用场景 |
|---|---|---|
| DATE | 仅包含年月日,不包含时区信息。 | 记录事件发生的日期,如生日。 |
| DATETIME([P]) | 包含完整的日期和时间,支持微秒级精度§。存储时不包含时区信息。 | 记录事件发生的具体时刻,如登录时间。 |
| TIME | 仅表示一天中的时间。 | 记录定时任务的执行时间。 |
字符串类型
| 数据类型 | 详细说明与特点 | 使用场景 |
|---|---|---|
| CHAR(M) | 定长字符串。如果存储的值不足M字节,会用空格填充。 | 固定长度的编码,如国家代码。 |
| VARCHAR(M) | 变长字符串,只占用实际所需的空间。 | 大多数文本字段,如用户名。 |
| STRING | 更大的变长字符串,最大可达2GB。只能用于Value列。 | 存储长文本,如文章内容、日志详情。 |
IP类型
| 数据类型 | 详细说明与特点 | 使用场景 |
|---|---|---|
| IPV4 | 以整数形式存储IPv4地址,节约空间且便于计算。 | 存储用户的访问IP地址。 |
| IPV6 | 以UInt128的形式存储在16个字节中。 | 存储用户的访问IP地址(支持IPv6)。 |
3. 操作符分类
数学操作符
| 操作符 | 名称 | 作用 | 示例 |
|---|---|---|---|
| + | 加法 | 将两个表达式相加。 | SELECT 5 + 3; |
| - | 减法 | 将第一个表达式减去第二个表达式。 | SELECT 5 - 3; |
| * | 乘法 | 将两个表达式相乘。 | SELECT 5 * 3; |
| / | 除法 | 将第一个表达式除以第二个表达式。若除数为0,返回NULL。 | SELECT 5 / 3; |
| DIV | 整数除法 | 返回两个表达式相除后的整数部分。 | SELECT 5 DIV 3; |
| % 或 MOD | 取余 | 返回两个表达式相除后的余数。 | SELECT 5 % 3; |
逻辑操作符
| 操作符 | 名称 | 作用 |
|---|---|---|
| NOT | 非 | 对一个布尔表达式的结果进行取反。 |
| AND | 与 | 当两个组成部分都为TRUE时,结果才为TRUE。 |
| OR | 或 | 当任一组成部分为TRUE时,结果就为TRUE。 |
比较操作符
| 操作符 | 名称 | 作用 | 示例 |
|---|---|---|---|
| = | 等于 | 判断两个表达式是否相等。 | SELECT 1 = 1; |
| != 或 <> | 不等于 | 判断两个表达式是否不相等。 | SELECT 1 != 2; |
| > | 大于 | 判断第一个表达式是否大于第二个。 | SELECT 2 > 1; |
| >= | 大于等于 | 判断第一个表达式是否大于或等于第二个。 | SELECT 2 >= 2; |
| < | 小于 | 判断第一个表达式是否小于第二个。 | SELECT 1 < 2; |
| <= | 小于等于 | 判断第一个表达式是否小于或等于第二个。 | SELECT 1 <= 1; |
| <=> | NULL-safe 等于 | 与=类似,但当两个操作数都为NULL时,结果为TRUE。 | SELECT NULL <=> NULL; |
位操作符
| 操作符 | 名称 | 作用 | 示例 |
|---|---|---|---|
| & | 按位与 | 对应的二进制位都为1时,结果位才为1。 | SELECT 1 & 2; |
| | | 按位或 | 对应的二进制位任意一个为1时,结果位就为1。 | `SELECT 1 |
| ^ | 按位异或 | 对应的二进制位不同时,结果位为1。 | SELECT 1 ^ 2; |
| ~ | 按位取反 | 将操作数的每一位取反。 | SELECT ~1; |
模式匹配操作符
| 操作符 | 名称 | 作用 | 示例 |
|---|---|---|---|
| [NOT] LIKE | 简单模式匹配 | % 匹配零个或多个字符,_ 匹配任意单个字符。 |
SELECT 'ABCD' LIKE '%C_'; |
| [NOT] REGEXP [RLIKE] | 正则表达式匹配 | 使用正则表达式进行复杂模式匹配。 | SELECT 'ABCD' REGEXP 'A.*D'; |
全文检索操作符
| 操作符 | 名称 | 作用 |
|---|---|---|
| MATCH ANY | 匹配任意词 | 如果左操作数包含右操作数中分词后的任意一个词,则返回TRUE。 |
| MATCH ALL | 匹配所有词 | 如果左操作数包含右操作数分词后的每一个词,则返回TRUE。 |
| MATCH PHRASE | 匹配短语 | 如果左操作数包含右操作数分词后形成的连续短语,则返回TRUE。 |
| MATCH PHRASE PREFIX | 短语前缀匹配 | 是MATCH PHRASE的扩展,允许最后一个词只匹配前缀。 |
条件操作符
| 操作符 | 名称 | 作用 |
|---|---|---|
| EXISTS | 存在性测试 | 如果子查询返回至少一行数据,则返回TRUE。 |
| IN | 成员测试 | 测试一个值是否存在于一个值列表或子查询结果中。 |
| IS [NOT] NULL | NULL值检测 | 专门用于判断一个表达式是否为NULL。 |
赋值操作符
| 操作符 | 名称 | 作用 |
|---|---|---|
| := 或 = | 赋值 | 在SET语句中为变量赋值。 |
操作符优先级
当表达式中包含多个操作符时,Doris会根据以下优先级从高到低进行计算:
!+(一元正号),-(一元负号),~(一元位反转)*,/,%,DIV-,+&\|=,<=>,>=,>,<=,<,<>,!=,IS,LIKE,REGEXP,MATCH,INNOTAND,&&XOROR
4. SQL基础元素
注释
- 单行注释 : 以
--开始,到行尾结束。 - 多行注释 : 以
/*开始,以*/结束,可以跨越多行。
变量
- 系统变量 :
- 类型 : 只读变量(如
version)和可修改变量(如exec_mem_limit)。 - 作用域 :
GLOBAL(影响所有会话)和SESSION(仅影响当前会话)。 - 查看 :
SHOW VARIABLES [LIKE 'pattern']; - 设置 :
SET GLOBAL var_name = value;或SET SESSION var_name = value;
- 类型 : 只读变量(如
- 用户自定义变量 :
- 命名 : 以
@符号开头,如@my_var。 - 作用域: 仅在当前会话中有效。
- 赋值 :
SET @var_name = value_or_expression;
- 命名 : 以
字面量
- 数值字面量 : 整数(如
1)、定点/浮点数(如3.14)。优先解析为DECIMAL,超出范围则解析为DOUBLE。 - 字符串字面量 : 用单引号
'或双引号"括起来。支持转义字符。
对象标识符
指代数据库对象(表、列、索引等)的名称。若标识符包含特殊字符或为保留关键字,必须用反引号 (`````) 包围。
5. 半结构化数据类型的特点和使用
| 类型 | 特点与使用 |
|---|---|
| ARRAY | 有序的同类型元素集合。通过方括号 [] 创建,如 [1, 2, 3]。 |
| MAP | 键值对的无序集合。通过花括号 {} 创建,如 {'a': 1, 'b': 2}。 |
| STRUCT<...> | 类似于一个匿名的内联表,由多个具名的Field组成。 |
| JSON | 以二进制格式(JSONB)高效存储JSON数据。写入时会校验格式。 |
| VARIANT | 核心优势 : 在存储JSON的同时,对高频访问的路径进行子列列式提取 ,使其像普通列一样享受列存性能。最佳实践 : 避免对整个VARIANT列进行 SELECT *,应指定具体路径投影查询。 |
6. 聚合类型的作用和应用场景
| 类型 | 作用与应用场景 |
|---|---|
| BITMAP | 精确去重: 将一组值压缩成位图,通过位运算快速计算基数。适用于DAU/MAU统计。 |
| HLL | 模糊去重: 概率算法,用极小内存估算海量数据基数,误差约1-2%。适用于大数据量下的UV统计。 |
| QUANTILE_STATE | 近似百分位数: 存储计算百分位所需的中间状态,可合并。适用于监控系统响应时间分布分析。 |
| AGG_STATE | 通用聚合中间态: 存储任意聚合函数的中间状态,用于构建高级物化视图。 |
7. 重要的使用注意事项和最佳实践
-
NULL值处理:
NULL表示未知或缺失的值,不等同于0或空字符串。- 任何涉及
NULL的算术运算或比较的结果都是NULL或UNKNOWN。 - 必须使用
IS NULL或IS NOT NULL来检测NULL值。
-
VARIANT类型最佳实践:
- 避免
SELECT *: 对超宽的VARIANT列执行全列查询成本极高,应始终使用具体路径进行投影。 - 显式CAST : 查询时务必使用
CAST(v['id'] AS INT)进行显式类型转换。 - 善用Schema Template: 为业务关键路径定义Schema Template,锁定数据类型,防止被提升为JSONB。
- 避免
-
DECIMAL精度管理:
DECIMAL的运算有复杂的精度推演规则。- 如需更高精度,可通过
SET enable_decimal256 = true开启最高76位精度。
-
聚合类型选择:
- 精确去重 : 选择
BITMAP。 - 近似去重 : 数据量极大时选择
HLL。 - 近似百分位 : 选择
QUANTILE_STATE。 - 高级预聚合 : 选择
AGG_STATE。
- 精确去重 : 选择