行业资讯
📅 2026/7/16 2:49:36
TDengine DML SELECT — 完整查询语法参考
分类10.SQL 参考 |篇章02 DML SELECT适用版本TDengine v3.xv3.3.x / v3.4.x | 最后更新2026-07-15SELECT 是 TDengine 中最常用的语句。本文按子句顺序系统讲解 SELECT 完整语法、特殊子句PARTITION BY、INTERVAL、SLIDING、FILL、以及子查询/集合操作。核心概念速查表子句作用SELECT投影列FROM数据源WHERE行过滤PARTITION BY分区窗口INTERVAL/SESSION/STATE/EVENT/COUNTSLIDING滑动步长FILL填充空窗口GROUP BY分组HAVING分组过滤ORDER BY排序LIMIT/OFFSET限制详细解析1. 完整语法SELECT[DISTINCT]select_listFROM{ table_reference|(subquery)}[WHEREconditions][PARTITIONBYcolumns][WINDOW window_clause][SLIDING(duration)][FILL(fill_mode[,...])][GROUPBYcolumns][HAVINGconditions][ORDERBYcolumns][LIMITcount[OFFSEToffset]][SLIMIT count[SOFFSEToffset]];window_clause ::INTERVAL(duration[,offset])|SESSION(ts_column,gap)|STATE_WINDOW(state_column)|EVENT_WINDOWSTARTWITHexprENDWITHexpr|COUNT_WINDOW(count[,sliding_count])2. select_list-- 列选择SELECTts,currentFROMmeters;-- 所有列SELECT*FROMmeters;-- 表达式SELECTts,current*voltageASpowerFROMmeters;-- 别名SELECTcurrentASampFROMmeters;-- 聚合函数SELECTAVG(current),MAX(current)FROMmeters;-- 时间窗口元数据SELECT_wstart,_wend,_wduration,AVG(current)FROMmetersINTERVAL(1h);-- 子表名/TagSELECTtbname,location,AVG(current)FROMmetersGROUPBYtbname,location;-- CASE WHENSELECTts,CASEWHENcurrent100THENHIGHWHENcurrent50THENMIDELSELOWENDASlevelFROMmeters;3. FROM 子句-- 单表SELECT*FROMd001;-- 超级表自动跨子表SELECT*FROMmeters;-- 多表JOINSELECT*FROMt1JOINt2ONt1.tst2.ts;-- 子查询SELECTMAX(avg_c)FROM(SELECTAVG(current)ASavg_cFROMmetersPARTITIONBYtbnameINTERVAL(1h))sub;-- VIEW视图SELECT*FROMv_meters;-- 系统表SELECT*FROMinformation_schema.ins_databases;4. WHERE 子句-- 基本比较WHEREcurrent100WHEREts2026-06-01WHERElocationBeijing-- 范围WHEREtsBETWEEN2026-06-01AND2026-06-30WHEREcurrentBETWEEN50AND100-- 集合WHERElocationIN(Beijing,Shanghai)WHEREtbnameLIKEd0%-- 模糊WHEREdescriptionLIKE%error%WHEREdescriptionMATCHregex-- 复合WHERE(locationBeijingORlocationShanghai)ANDtsnow-1h-- NULLWHEREcurrentISNULLWHEREphaseISNOTNULL-- 时间表达式WHEREtsnow-1hWHEREtstoday()-1d5. PARTITION BY-- 按子表分组聚合SELECTtbname,AVG(current)FROMmetersPARTITIONBYtbname;-- 多列分区SELECTlocation,groupid,MAX(current)FROMmetersPARTITIONBYlocation,groupid;-- PARTITION BY 窗口最常见SELECTtbname,_wstart,AVG(current)FROMmetersPARTITIONBYtbnameINTERVAL(1h);6. 窗口子句-- INTERVALINTERVAL(1h)INTERVAL(1h,30m)-- 偏移INTERVAL(1h)SLIDING(30m)-- 滑动-- SESSIONSESSION(ts,30m)-- STATESTATE_WINDOW(status)-- EVENTEVENT_WINDOWSTARTWITHt80ENDWITHt60-- COUNTCOUNT_WINDOW(100)COUNT_WINDOW(100,50)-- 滑动-- FILLINTERVAL(1h)FILL(NULL)INTERVAL(1h)FILL(VALUE,0)INTERVAL(1h)FILL(PREV)INTERVAL(1h)FILL(NEXT)INTERVAL(1h)FILL(LINEAR)INTERVAL(1h)FILL(NONE)7. ORDER BY / LIMIT-- 排序ORDERBYts-- 升序默认ORDERBYtsDESC-- 降序ORDERBYcurrentDESC,ts-- 多列-- 限制LIMIT10LIMIT10OFFSET100-- 子表级 LIMIT (PARTITION 内)SELECT*FROMmetersPARTITIONBYtbnameLIMIT1SLIMIT10;-- SLIMIT: 限制 partition 数量-- LIMIT: 每个 partition 的行数8. 集合操作-- UNION ALL (TDengine 主要支持)SELECTts,currentFROMmeters_2025UNIONALLSELECTts,currentFROMmeters_2026;-- UNION去重视版本支持代码示例综合查询示例-- 复杂业务查询SELECTtbname,_wstartAShour_start,AVG(current)ASavg_c,MAX(current)ASmax_c,MIN(current)ASmin_c,COUNT(*)ASsample_cntFROMmetersWHEREts2026-06-01ANDts2026-07-01ANDlocationIN(Beijing,Shanghai)PARTITIONBYtbnameINTERVAL(1h)FILL(LINEAR)HAVINGavg_c20ORDERBYhour_startDESC,max_cDESCLIMIT100;子查询应用-- 找出 TOP 10 平均电流的设备SELECTtbname,avg_cFROM(SELECTtbname,AVG(current)ASavg_cFROMmetersWHEREtsnow-1dPARTITIONBYtbname)subORDERBYavg_cDESCLIMIT10;-- 与历史均值比较SELECTm.ts,m.current,h.avg_cFROMmeters mJOIN(SELECTtbname,AVG(current)ASavg_cFROMmetersWHEREtsnow-1dPARTITIONBYtbname)hONm.tbnameh.tbnameANDm.tsm.ts;系统表查询-- 数据库列表SELECTname,vgroups,replicaFROMinformation_schema.ins_databases;-- 表数量SELECTCOUNT(*)FROMinformation_schema.ins_tablesWHEREdb_namepower;-- 正在执行的查询SELECT*FROMperformance_schema.perf_queriesORDERBYexec_usecDESC;性能考量子句执行顺序逻辑执行顺序与书写顺序不同 1. FROM (定位表) 2. WHERE (行过滤) 3. PARTITION BY (分区) 4. WINDOW (窗口划分) 5. GROUP BY (分组) 6. HAVING (分组后过滤) 7. SELECT (投影) 8. DISTINCT (去重) 9. ORDER BY (排序) 10. LIMIT (限制)性能要点项影响WHERE 含时间决定扫描量WHERE 含 Tag子表筛选PARTITION BY 基数内存与并发排序非 ts 列需实际排序LIMIT 含早停大幅加速FAQQ1: PARTITION BY 和 GROUP BY 有什么区别PARTITION BY分区后保留各分区独立窗口/计算GROUP BY聚合为每组一行通常时序数据用 PARTITION BY 配合窗口Q2: 子查询有什么限制支持单层子查询。多层嵌套和复杂关联子查询支持有限。Q3: SELECT * 和列举列有区别吗列举列列裁剪生效I/O 更少。SELECT * 在大表上低效。Q4: 系统表怎么用SHOWDATABASES;-- 简洁SELECT*FROMinformation_schema.ins_databases;-- 详细Q5: 怎么测试 SQL 性能EXPLAINSELECT...;EXPLAINANALYZESELECT...;参考系统构架篇01-《TDengine 整体架构全景》02-《集群拓扑深度解析》03-《MNode 内部机制深度解析》04-《RPC 通信层深度解析》05-《VNode 生命周期》06-《RAFT 共识协议》07-《端到端的消息流》数据模型01-《数据库创建与参数详解》02-《超级表/子表/普通表》03-《支持数据类型深度解析》04-《TDengine Tag 设计哲学与 Schema 变更机制》05-《TDengine 虚拟表实现原理》存储引擎01-《TDengine 存储引擎概览》02-《TDengine MemTable 深度解析》03-《TDengine WAL 预写日志机制》04-《TDengine 数据文件格式》05-《TDengine Commit 与 Flush 机制 》06-《TDengine Compaction 合并策略 》07-《TDengine 数据保留与 TTL》08-《TDengine 压缩编码机制》09-《TDengine Cache 与 Last 查询加速》10-《TDengine 逻辑计划生成》查询引擎01-《TDengine 查询引擎概览》02-《TDengine SQL 解析与词法分析》03-《TDengine 语义分析与 AST 重写》04-《TDengine 逻辑计划生成》05-《TDengine 物理计划生成》06-《TDengine 扫描算子》07-《TDengine 聚合算子》08-《TDengine 聚合算子》09-《TDengine 连接算子》10-《TDengine 排序、填充与投影》11-《TDengine 分布式查询执行》12-《TDengine EXPLAIN 与查询优化》数据写入01-《TDengine SQL INSERT》02-《TDengine 无模式写入》03-《TDengine STMT 写入》04-《TDengine 写入内部流程》05-《TDengine 数据更新删除》数据订阅01-《TDengine 数据订阅》02-《TDengine 订阅 vs Kafka》03-《TDengine TMQ 消费流程》04-《TDengine 内部机制》05-《TDengine TMQ 最佳实践》预聚合01-《TDengine RSMA》02-《TDengine TSMA — 时间维度的物化聚合视图》03-《TDengine SMA 内部实现》索引01-《TDengine Tag 索引》02-《TDengine SMA 索引》SQL 语句01-《TDengine DDL》关于 TDengineTDengine 专为物联网IoT平台、工业大数据平台设计。其中TDengine TSDB 是一款高性能、分布式的时序数据库Time Series Database同时它还带有内建的缓存、流式计算、数据订阅等系统功能TDengine IDMP 是一款AI原生工业数据管理平台它通过树状层次结构建立数据目录对数据进行标准化、情景化并通过 AI 提供实时分析、可视化、事件管理与报警等功能。