TDengine SQL 完全指南:语法约定、数据类型、建库建表与查询体系全景解析

TDengine SQL 完全指南:语法约定、数据类型、建库建表与查询体系全景解析 TDengine SQL 完全指南语法约定、数据类型、建库建表与查询体系全景解析【免费下载链接】TDengineHigh-performance, scalable time-series database designed for Industrial IoT (IIoT) scenarios项目地址: https://gitcode.com/GitHub_Trending/tde/TDengine本文围绕 TDengine 3.x 的核心交互语言 TDengine SQL 展开系统讲解其语法书写约定、内置数据类型与时间精度体系、建库CREATE DATABASE与建表CREATE TABLE的关键参数、命名规则与系统限制以及从 2.x 迁移到 3.x 时必须了解的语法变化。读者读完本文后将掌握 TDengine SQL 的基本书写规则能独立完成数据库与超级表的设计建模并具备进一步深入写入、查询、流式计算等高级特性的知识地图。TDengine SQL 概述面向时序数据的扩展 SQLTDengine SQL 是 TDengine 中读写数据的核心工具。它基于标准 SQL同时为时序数据和业务需求扩展了大量语法特性与函数覆盖语法规则、数据类型、数据定义DDL、数据写入、数据查询、函数以及常见限制等完整链路。使用它之前读者应具备基础的 SQL 知识若正在从 2.x 迁移到 3.x建议同时查阅文档 3.0 语法变化其中列出了被废弃的语法及其替代方案。TDengine SQL 有以下两个值得注意的全局特性语句长度上限可配置默认情况下单条 TDengine SQL 语句的最大长度为 4 MB可通过客户端参数maxSQLLength配置取值范围为 1 MB 到 64 MB。不支持关键字缩写例如DELETE不能缩写为DEL必须书写完整关键字。SQL 语法书写约定TDengine SQL 文档中的语法描述遵循以下统一约定理解这些约定是正确阅读和使用官方语法图的前提约定含义大写字母表示关键字Keyword但 SQL 本身对关键字和标识符不区分大小写小写字母表示需要用户自行填写的内容方括号[ ]表示可选内容但输入时不能键入[]本身|表示多选一从中选择一项但输入时不能键入|本身...表示前一项可以重复多次例如CREATE DATABASE [IF NOT EXISTS] db_name表示IF NOT EXISTS是可选的而db_name是必须由用户提供的库名。仓库中的 SQL 词法与语法解析实现位于 source/libs/parser包含.y语法文件解析器生成器 lemon 位于 contrib/lemon读者可结合源码理解上述约定在实现层面的落地。贯穿全章的示例数据集智能电表建模为了便于说明 SQL 语法规则与特性TDengine SQL 文档全章节统一采用智能电表作为示例数据集假设每只智能电表采集三项指标——电流current、电压voltage和相位phase。其建模结构如下taos DESCRIBE meters; Field | Type | Length | Note | ts | TIMESTAMP | 8 | | current | FLOAT | 4 | | voltage | INT | 4 | | phase | FLOAT | 4 | | location | BINARY | 64 | TAG | groupid | INT | 4 | TAG |该数据集包含 4 只智能电表的数据。按照 TDengine 建模规则它们对应 4 张子表分别命名为d1001、d1002、d1003和d1004后续示例统一使用groupid作为分组标签tag名。这一超级表STABLE 子表的建模范式是 TDengine 区别于普通关系数据库的核心所在详细语法见 超级表文档。数据类型与时间精度体系TDengine 普通表、子表和超级表可使用的数据类型如下表所示部分类型对使用位置有特殊限制如JSON只能用于标签列。类型存储说明TIMESTAMP8 字节时间戳。默认精度为毫秒可在建库时设置为微秒或纳秒BOOL1 字节布尔型TINYINT1 字节有符号单字节整数范围[-128, 127]TINYINT UNSIGNED1 字节无符号单字节整数范围[0, 255]SMALLINT2 字节有符号短整数范围[-32768, 32767]SMALLINT UNSIGNED2 字节无符号短整数范围[0, 65535]INT4 字节有符号整数范围[-2^31, 2^31-1]INT UNSIGNED4 字节无符号整数范围[0, 2^32-1]BIGINT8 字节有符号长整数范围[-2^63, 2^63-1]BIGINT UNSIGNED8 字节无符号长整数范围[0, 2^64-1]FLOAT4 字节单精度浮点数约 6–7 位有效数字范围约[-3.4E38, 3.4E38]DOUBLE8 字节双精度浮点数约 15–16 位有效数字范围约[-1.7E308, 1.7E308]BINARY自定义单字节字符串建议仅存 ASCII 可打印字符VARCHAR自定义BINARY的别名NCHAR自定义多字节字符串适合中文等多字节字符VARBINARY自定义变长二进制数据GEOMETRY自定义几何类型支持二维POINT、LINESTRING、POLYGONDECIMAL8 或 16 字节高精度数值类型范围取决于precision与scaleBLOB最大 4 MB大对象二进制数据JSON自定义JSON 标签类型只能用于标签列主要通用限制包括单行数据最大 48 KB3.0.5.0 起为 64 KB且每个BINARY/NCHAR/GEOMETRY/VARBINARY列额外占用 2 字节存储BINARY、VARBINARY、GEOMETRY数据列最大长度 65,517 字节、标签列最大 16,382 字节JSON标签一旦使用则只能有一个标签列DECIMAL目前仅支持普通列。时间单位凡是 TDengine SQL 需要时间长度的地方时间运算、INTERVAL、EVERY、SLIDING等使用单个字符后缀表示单位单位含义说明b纳秒最小精度单位仅当数据库精度为纳秒时有意义u微秒仅当数据库精度为微秒或纳秒时有意义a毫秒数据库默认精度s秒m分钟h小时d天w周固定为 7 天n自然月日历单位仅允许在INTERVAL窗口中使用q自然季度日历单位等于 3 个自然月仅允许在INTERVAL窗口中使用y自然年日历单位仅允许在INTERVAL窗口中使用单位字母不区分大小写例如1S与1s等价。完整时区与自然单位语义参见 时区与自然时间单位。时间戳时间戳是时序数据的主键。建表、写数据、查历史数据通常都要指定时间戳时间字符串格式为YYYY-MM-DD HH:mm:ss.MS默认分辨率为毫秒如2017-08-12 18:25:58.128。NOW表示客户端当前时间写入时若时间戳为NOW则使用提交客户端的当前时间。时间戳也可以是自 UTC1970-01-01 00:00:00以来的长整数其单位跟随数据库精度毫秒/微秒/纳秒。时间表达式支持加减运算如NOW - 2h表示两小时前。默认时间戳精度为毫秒建库时可通过PRECISION设置为微秒或纳秒CREATE DATABASE db_name PRECISION ns;DECIMAL、BLOB 与 JSON 标签DECIMAL定义语法为DECIMAL(18, 2)、DECIMAL(38, 10)等形式其中precision为最大有效数字位数范围[1, 38]scale为最大小数位数范围[0, precision]缺省为 0。precision ≤ 18时占用 8 字节DECIMAL64(18, 38]时占用 16 字节。例如类型DECIMAL(10, 2)写入10.987会存储为10.99超出最大值报DECIMAL_OVERFLOW。DECIMAL 支持 SQL 与 STMT2 写入暂不支持 schemaless 写入。BLOB最大长度 4,194,304 字节可通过 SQL 或 STMT2 写入或以\x开头的字符串形式写入shell 查询时以\x开头的十六进制字符串展示。BLOB 只能出现在普通数据列中且至多一列不支持条件过滤也不支持虚拟表、流计算等特性。JSON 标签只能用于标签列且全表只能有一个。支持-取值操作符与CONTAINS键存在性判断例如CREATE STABLE s1 (ts TIMESTAMP, v1 INT) TAGS (info JSON); CREATE TABLE s1_1 USING s1 TAGS ({k1: v1}); SELECT * FROM s1 WHERE info-k1 v1; SELECT * FROM s1 WHERE info CONTAINS k2;常量形式TDengine 支持整数如123、-123类型BIGINT、浮点数如123.45类型DOUBLE、科学计数法如1.2E3、字符串如abc内部单引号用\转义、时间戳字面量TIMESTAMP 2017-08-12 18:25:58.128、布尔TRUE/FALSE以及空值空串、制表符、空格或NULL等常量形式。注意溢出陷阱9999999999999999999会溢出长整数上界而9999999999999999999.0是合法的浮点数。完整数据类型说明见 数据类型与精度。建库 DDLCREATE DATABASE 关键参数CREATE DATABASE用于创建数据库其完整语法如下仅列出主要选项CREATE DATABASE [IF NOT EXISTS] db_name [database_options] database_option: { VGROUPS value | PRECISION {ms | us | ns} | REPLICA value | REPLICAS value | BUFFER value | PAGES value | PAGESIZE value | CACHEMODEL {none | last_row | last_value | both} | CACHESIZE value | COMP {0 | 1 | 2} | DURATION value | MAXROWS value | MINROWS value | KEEP value | SCHEMALESS {0 | 1} | STT_TRIGGER value | SINGLE_STABLE {0 | 1} | WAL_LEVEL {1 | 2} | WAL_FSYNC_PERIOD value | ... }以下为核心参数的语义、默认值与取值范围参数默认值范围说明VGROUPS——数据库初始 vgroup 数量PRECISIONmsms/us/ns时间戳精度REPLICA11/2/3副本数集群中须 ≤ DNODE 数量REPLICAS是其别名2 副本仅企业版 3.3.0.0 起可用BUFFER256[3, 16384]VNODE 写入内存池大小单位 MBPAGES256≥ 64VNODE 元数据存储引擎缓存页数PAGESIZE4[1, 16384]元数据存储引擎页大小单位 KBCACHEMODELnone见左是否缓存子表最新数据last_row显著提升LAST_ROW性能last_value提升LAST性能both同时开启CACHESIZE1[1, 65536]每个 vnode 缓存子表最新数据的内存单位 MBCOMP2[0, 2]压缩级别0 不压缩、1 一级压缩、2 两级压缩DURATION10d[60m, 3650d]数据文件存储时间跨度支持 m/h/d 单位MAXROWS4096—文件块最大记录数MINROWS100—文件块最小记录数KEEP3650[1, 365000]数据文件保留天数须 ≥ 3 倍DURATION支持带单位写法SCHEMALESS—0/1是否允许 schemaless 写入WAL_LEVEL11/21 写 WAL 但不 fsync2 写 WAL 并 fsyncWAL_FSYNC_PERIOD3000[0, 180000]WAL_LEVEL2时的落盘周期单位毫秒0 表示每次写入立即落盘需要特别说明的几个参数KEEP 与多级存储KEEP可带单位KEEP 100h、KEEP 10d也可不带单位默认天。企业版支持多级存储可设置最多 3 个保留时间如KEEP 100h,100d,3650d满足 keep0 ≤ keep1 ≤ keep2社区版不支持多级存储即使配置多个保留时间也仅按最长保留时间生效。KEEP_TIME_OFFSET3.2.0.0 起用于延迟执行超过KEEP的数据删除/迁移避免业务高峰期默认 0 小时。CACHESHARDBITSlast-value LRU 缓存的 shard 位数控制并发缓存访问的锁粒度默认 -1自动计算范围 [-1, 19]。实际 shard 数等于2^CACHESHARDBITS自动计算时每个 shard 至少 512 KBshard 位数上限为 6。修改该参数会立即失效该库所有 vnode 的 last-value 缓存条目后续查询需从磁盘重新加载可能短暂增加查询延迟。WAL 相关WAL_RETENTION_PERIOD默认 3600 秒与WAL_RETENTION_SIZE默认 0即不设上限用于数据订阅场景下 WAL 日志的额外保留策略。创建数据库的完整示例create database if not exists db vgroups 10 buffer 10上述语句创建名为db的数据库包含 10 个 vgroup每个 vnode 分配 10 MB 写缓冲。使用/切换当前库用USE db_name;该语句在 REST 连接下无效。删除数据库使用DROP DATABASE [IF EXISTS] db_name注意该操作会连带删除库内所有表并销毁所有 vgroup。ALTER DATABASE可动态修改部分参数如CACHEMODEL、BUFFER、KEEP、WAL_LEVEL等。修改副本数时还可指定PARALLEL控制并发度ALTER DATABASE db_name REPLICA 3 [PARALLEL parallel_value]其中parallel_value为 0 表示不限并发最快、1 表示串行最省资源、N 表示最多 N 个 vgroup 并发。PARALLEL仅适用于修改REPLICA不能与其他 ALTER 选项共用。完整参数列表见 数据库 DDL 文档。建表 DDLCREATE TABLE、超级表与子表CREATE TABLE用于创建普通表、以超级表为模板创建子表以及通过TAGS子句创建超级表或带自有标签的普通表CREATE TABLE [IF NOT EXISTS] [db_name.]tb_name (create_definition [, create_definition] ...) [table_options] CREATE TABLE [IF NOT EXISTS] [db_name.]tb_name (create_definition [, create_definition] ...) [TAGS (tag_def [, tag_def] ...)] [table_options] create_subtable_clause: { create_subtable_clause [create_subtable_clause] ... | [IF NOT EXISTS] [db_name.]tb_name USING [db_name.]stb_name [(tag_name [, tag_name] ...)] TAGS (tag_value [, tag_value] ...) }建表要点表名最长 192 字符命名规则见 命名规则。表的第一列必须是TIMESTAMP系统自动将其设为主键。除时间戳主键外可用COMPOSITE KEY关键字将第二列指定为复合主键列该列必须是INT、BIGINT、INT UNSIGNED、BIGINT UNSIGNED或VARCHAR、BINARY等类型。TAGS子句的语义取决于标签是否带值所有标签均无值时创建超级表每个标签都带显式 const_value时创建带自有标签的普通表 NULL也是合法的显式值混用带值与不带值的标签会被拒绝。普通表自有标签仅支持字面量值且DECIMAL类型不支持作为标签。-- 带自有标签的普通表 CREATE TABLE ntb (ts TIMESTAMP, v INT) TAGS (loc INT 5, dept VARCHAR(16) rd);表级选项包括COMMENT表注释最长 1024 字节可用于超级表、子表和普通表。SMASmall Materialized Aggregates基于数据块的预计算以加速聚合查询预计算类型包括 MAX、MIN、SUM。默认系统会为大多数列创建块级 SMA若在建表时指定SMA(col_name, ...)则仅为所列列创建。TTL表生命周期单位天范围 [0, 2147483647]默认 0 表示不限。超过 TTL 后系统会自动近似地删除该表。注意 TTL 与数据库KEEP参数无关若KEEP小于TTL数据可能先于表被删除。CREATE TABLE详细语法与ALTER TABLE维护操作见 表 DDL 文档。命名规则与系统限制命名规则数据库、表、列、标签名只能包含英文字母、数字和下划线可以字母或下划线开头不能以数字开头不区分大小写且不能是保留关键字。TDengine 还提供反引号转义以支持更自由的命名转义后名称保留用户指定的大小写aBc与abc是不同的名字、可包含字母数字下划线以外的字符但不能含.、可以数字开头如1970、也可以使用保留关键字如select。密码字符集合法字符集为[a-zA-Z0-9!?$%^*()_-{[}]:;~#|,.?/]禁止单引号、双引号、反引号、反斜杠和空格。常用系统限制详见 命名与限制数据库名最长 64 字节表名最长 192 字节不含库名前缀与分隔符列名、标签名最长 64 字节。每行数据最长 48 KB3.0.5.0 起 64 KB最多 4096 列、最少 2 列首列必须是时间戳最多 128 个标签、至少 1 个标签表内标签值总长不超过 16 KB。SQL 语句默认最大 4,194,304 字符可通过maxSQLLength配置最大值 64 MBSELECT 结果最多返回 4096 列。数据库、超级表、普通表的数量不受系统限制只受系统资源约束单个数据库最多 1024 个 vgroup。从 2.x 迁移到 3.x关键语法变化若从 2.x 升级需重点关注以下变化完整对照表见 3.0 语法变化基础元素新增VARCHAR作为BINARY别名TIMESTAMP字面量语法_ROWTS伪列时间戳主键别名、_IROWTS伪列INFORMATION_SCHEMA与PERFORMANCE_SCHEMA系统库GEOMETRY类型连续查询Continuous Query被废弃由更通用的流式计算替代。建库参数调整2.x 的DAYS被DURATION取代并支持带单位BLOCKS/CACHE被BUFFER取代CACHELAST被CACHEMODEL取代FSYNC被WAL_FSYNC_PERIOD取代WAL被WAL_LEVEL取代QUORUM在 3.0 中默认强一致新增VGROUPS、PAGES、PAGESIZE、RETENTIONS、SINGLE_STABLE等参数3.0 所有数据库均支持部分列更新UPDATE参数被移除。语句层面新增CREATE STREAM、CREATE TOPIC、CREATE INDEXSMA 索引、GRANT/REVOKE、EXPLAIN、DROP CONSUMER GROUP等语句ALTER TABLE/ALTER STABLE中CHANGE tag改为RENAME tag并新增COMMENT、TTL等选项SHOW DATABASES/SHOW TABLES/SHOW STABLES在 3.0 只显示名称。SELECT 增强关闭隐式结果列输出列必须由 SELECT 子句显式指定DISTINCT功能全面支持JOIN、子查询嵌套层数不限、GROUP BY支持任意标量表达式、ORDER BY支持NULLS FIRST/LAST均显著增强新增PARTITION BY语法取代原来的GROUP BY tags无PARTITION BY时超级表数据合并为一条时间线SESSION、STATE_WINDOW及TWA、IRATE、DIFF、CSUM、MAVG等函数均可直接用于超级表。TDengine SQL 能力地图从写入到查询的完整知识体系在掌握语法基础与建模能力后可按以下模块继续深入均为docs/en/05-tdengine-sql/下的对应文档数据写入INSERT 语法、DELETE含安全删除、列级压缩ENCODE/COMPRESS03-data-write数据查询SELECT 基本查询、操作符、函数体系、去重DISTINCT、JOIN、窗口函数、UDF、缓存查询Cache Query、EXPLAIN 执行计划04-data-query物化聚合TSMA时间序列物化聚合与 RSMA降采样存储05-materialized-agg索引与视图标签索引、视图06-index-and-view用户与权限用户管理、GRANT/REVOKE 授权体系07-user-and-privilege集群管理DNODE/MNODE/QNODE、XNODE、挂载、恢复08-cluster-management系统信息元数据、性能信息、SHOW 命令族09-system-info时间语义时区与夏令时10-time附录转义规则、命名与限制、保留关键字、3.0 语法变化11-appendix。以上模块共同构成 TDengine SQL 的完整能力体系以本文的语法约定、数据类型与建模 DDL 为基础向上可延伸至写入、查询、流式计算与集群管理向下可深入源码解析器位于 source/libs/parser、执行器位于 source/libs/executor理解其实现原理。【免费下载链接】TDengineHigh-performance, scalable time-series database designed for Industrial IoT (IIoT) scenarios项目地址: https://gitcode.com/GitHub_Trending/tde/TDengine创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考