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, IN
NOT
AND, &&
XOR
OR
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。