Doris专题31-SQL手册-基础元素

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会根据以下优先级从高到低进行计算:

  1. !
  2. + (一元正号), - (一元负号), ~ (一元位反转)
  3. *, /, %, DIV
  4. -, +
  5. &
  6. \|
  7. =, <=>, >=, >, <=, <, <>, !=, IS, LIKE, REGEXP, MATCH, IN
  8. NOT
  9. AND, &&
  10. XOR
  11. 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 的算术运算或比较的结果都是 NULLUNKNOWN
    • 必须使用 IS NULLIS 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
相关推荐
m0_617881422 小时前
如何操作 XML 数据_XMLTYPE 与 EXTRACT 函数解析节点
jvm·数据库·python
qq_334563552 小时前
golang如何实现SSTable持久化_golang SSTable持久化实现要点
jvm·数据库·python
2301_777599372 小时前
Redis怎样应对大规模集群的重启风暴_分批次重启节点并等待集群状态恢复绿灯后再继续操作
jvm·数据库·python
飞飞传输2 小时前
国产化FTP替代方案哪个好?选对平台让传输更安全高效
大数据·运维·安全
一只小白0002 小时前
Redis 常用命令总结
数据库·redis·缓存
逻辑驱动的ken2 小时前
Java高频面试考点场景题09
java·开发语言·数据库·算法·oracle·哈希算法·散列表
解救女汉子2 小时前
MySQL并发写入如何避免锁竞争_使用队列缓冲与批量插入优化
jvm·数据库·python
qq_342295822 小时前
HTML函数开发需要SSD吗_SSD对HTML函数开发效率影响【详解】
jvm·数据库·python
qq_432703662 小时前
Golang怎么用embed嵌入SQL文件_Golang如何将SQL迁移文件嵌入Go程序统一管理【技巧】
jvm·数据库·python