TDengine DML SELECT — 完整查询语法参考

分类 :10.SQL 参考 | 篇章:02 DML SELECT

适用版本:TDengine v3.x(v3.3.x / v3.4.x) | 最后更新:2026-07-15

SELECT 是 TDengine 中最常用的语句。本文按子句顺序系统讲解 SELECT 完整语法、特殊子句(PARTITION BY、INTERVAL、SLIDING、FILL)、以及子查询/集合操作。

核心概念速查表

子句 作用
SELECT 投影列
FROM 数据源
WHERE 行过滤
PARTITION BY 分区
窗口 INTERVAL/SESSION/STATE/EVENT/COUNT
SLIDING 滑动步长
FILL 填充空窗口
GROUP BY 分组
HAVING 分组过滤
ORDER BY 排序
LIMIT/OFFSET 限制

详细解析

1. 完整语法

sql 复制代码
SELECT [DISTINCT] select_list 
FROM { table_reference | (subquery) }
[WHERE conditions]
[PARTITION BY columns]
[WINDOW window_clause]
[SLIDING (duration)]
[FILL (fill_mode [, ...])]
[GROUP BY columns]
[HAVING conditions]
[ORDER BY columns]
[LIMIT count [OFFSET offset]]
[SLIMIT count [SOFFSET offset]];

window_clause ::= 
    INTERVAL (duration [, offset])
  | SESSION (ts_column, gap)
  | STATE_WINDOW (state_column)
  | EVENT_WINDOW START WITH expr END WITH expr
  | COUNT_WINDOW (count [, sliding_count])

2. select_list

sql 复制代码
-- 列选择
SELECT ts, current FROM meters;

-- 所有列
SELECT * FROM meters;

-- 表达式
SELECT ts, current * voltage AS power FROM meters;

-- 别名
SELECT current AS amp FROM meters;

-- 聚合函数
SELECT AVG(current), MAX(current) FROM meters;

-- 时间窗口元数据
SELECT _wstart, _wend, _wduration, AVG(current) 
FROM meters INTERVAL(1h);

-- 子表名/Tag
SELECT tbname, location, AVG(current) 
FROM meters GROUP BY tbname, location;

-- CASE WHEN
SELECT ts, 
  CASE 
    WHEN current > 100 THEN 'HIGH'
    WHEN current > 50 THEN 'MID'
    ELSE 'LOW' 
  END AS level 
FROM meters;

3. FROM 子句

sql 复制代码
-- 单表
SELECT * FROM d001;

-- 超级表(自动跨子表)
SELECT * FROM meters;

-- 多表(JOIN)
SELECT * FROM t1 JOIN t2 ON t1.ts = t2.ts;

-- 子查询
SELECT MAX(avg_c) FROM (
  SELECT AVG(current) AS avg_c FROM meters 
  PARTITION BY tbname INTERVAL(1h)
) sub;

-- VIEW(视图)
SELECT * FROM v_meters;

-- 系统表
SELECT * FROM information_schema.ins_databases;

4. WHERE 子句

sql 复制代码
-- 基本比较
WHERE current > 100
WHERE ts > '2026-06-01'
WHERE location = 'Beijing'

-- 范围
WHERE ts BETWEEN '2026-06-01' AND '2026-06-30'
WHERE current BETWEEN 50 AND 100

-- 集合
WHERE location IN ('Beijing', 'Shanghai')
WHERE tbname LIKE 'd0%'

-- 模糊
WHERE description LIKE '%error%'
WHERE description MATCH 'regex'

-- 复合
WHERE (location='Beijing' OR location='Shanghai') 
  AND ts > now-1h

-- NULL
WHERE current IS NULL
WHERE phase IS NOT NULL

-- 时间表达式
WHERE ts > now-1h
WHERE ts > today() - 1d

5. PARTITION BY

sql 复制代码
-- 按子表分组聚合
SELECT tbname, AVG(current) 
FROM meters 
PARTITION BY tbname;

-- 多列分区
SELECT location, groupid, MAX(current) 
FROM meters 
PARTITION BY location, groupid;

-- PARTITION BY + 窗口(最常见)
SELECT tbname, _wstart, AVG(current) 
FROM meters 
PARTITION BY tbname 
INTERVAL(1h);

6. 窗口子句

sql 复制代码
-- INTERVAL
INTERVAL(1h)
INTERVAL(1h, 30m)    -- 偏移
INTERVAL(1h) SLIDING(30m)  -- 滑动

-- SESSION
SESSION(ts, 30m)

-- STATE
STATE_WINDOW(status)

-- EVENT
EVENT_WINDOW START WITH t > 80 END WITH t < 60

-- COUNT
COUNT_WINDOW(100)
COUNT_WINDOW(100, 50)  -- 滑动


-- FILL
INTERVAL(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

sql 复制代码
-- 排序
ORDER BY ts                  -- 升序(默认)
ORDER BY ts DESC             -- 降序
ORDER BY current DESC, ts    -- 多列

-- 限制
LIMIT 10
LIMIT 10 OFFSET 100

-- 子表级 LIMIT (PARTITION 内)
SELECT * FROM meters 
PARTITION BY tbname 
LIMIT 1
SLIMIT 10;
-- SLIMIT: 限制 partition 数量
-- LIMIT: 每个 partition 的行数

8. 集合操作

sql 复制代码
-- UNION ALL (TDengine 主要支持)
SELECT ts, current FROM meters_2025 
UNION ALL 
SELECT ts, current FROM meters_2026;

-- UNION(去重)视版本支持

代码示例

综合查询示例

sql 复制代码
-- 复杂业务查询
SELECT 
  tbname,
  _wstart AS hour_start,
  AVG(current) AS avg_c,
  MAX(current) AS max_c,
  MIN(current) AS min_c,
  COUNT(*) AS sample_cnt
FROM meters 
WHERE ts >= '2026-06-01' 
  AND ts < '2026-07-01' 
  AND location IN ('Beijing', 'Shanghai')
PARTITION BY tbname 
INTERVAL(1h) 
FILL(LINEAR)
HAVING avg_c > 20 
ORDER BY hour_start DESC, max_c DESC 
LIMIT 100;

子查询应用

sql 复制代码
-- 找出 TOP 10 平均电流的设备
SELECT tbname, avg_c FROM (
  SELECT tbname, AVG(current) AS avg_c 
  FROM meters 
  WHERE ts > now-1d 
  PARTITION BY tbname
) sub 
ORDER BY avg_c DESC 
LIMIT 10;

-- 与历史均值比较
SELECT m.ts, m.current, h.avg_c 
FROM meters m 
JOIN (
  SELECT tbname, AVG(current) AS avg_c 
  FROM meters 
  WHERE ts < now-1d 
  PARTITION BY tbname
) h ON m.tbname = h.tbname AND m.ts = m.ts;

系统表查询

sql 复制代码
-- 数据库列表
SELECT name, vgroups, replica FROM information_schema.ins_databases;

-- 表数量
SELECT COUNT(*) FROM information_schema.ins_tables WHERE db_name='power';

-- 正在执行的查询
SELECT * FROM performance_schema.perf_queries ORDER BY exec_usec DESC;

性能考量

子句执行顺序

复制代码
逻辑执行顺序(与书写顺序不同):

  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 含早停 大幅加速

FAQ

Q1: PARTITION BY 和 GROUP BY 有什么区别?

  • PARTITION BY:分区后保留各分区独立窗口/计算
  • GROUP BY:聚合为每组一行
  • 通常时序数据用 PARTITION BY 配合窗口

Q2: 子查询有什么限制?

支持单层子查询。多层嵌套和复杂关联子查询支持有限。

Q3: SELECT * 和列举列有区别吗?

列举列:列裁剪生效,I/O 更少。SELECT * 在大表上低效。

Q4: 系统表怎么用?

sql 复制代码
SHOW DATABASES;     -- 简洁
SELECT * FROM information_schema.ins_databases;  -- 详细

Q5: 怎么测试 SQL 性能?

sql 复制代码
EXPLAIN SELECT ...;
EXPLAIN ANALYZE SELECT ...;

参考

系统构架篇

数据模型

存储引擎

查询引擎

数据写入

数据订阅

预聚合

索引

SQL 语句

关于 TDengine

TDengine 专为物联网IoT平台、工业大数据平台设计。其中,TDengine TSDB 是一款高性能、分布式的时序数据库(Time Series Database),同时它还带有内建的缓存、流式计算、数据订阅等系统功能;TDengine IDMP 是一款AI原生工业数据管理平台,它通过树状层次结构建立数据目录,对数据进行标准化、情景化,并通过 AI 提供实时分析、可视化、事件管理与报警等功能。

相关推荐
weidian66612 分钟前
小红书广告投放形式和小红书广告投放核心流程
大数据
可乐鸡翅yeah_34 分钟前
业务中 M3U8 水印相关坑,硬水印和动态水印区别
前端·网络·数据库·ffmpeg·m3u8在线
石头麻辣鱼1 小时前
Bamboo 调度系统 OceanBase 适配实战:存储过程迁移踩过的三个大坑
数据库
龙亘川1 小时前
数智驱动民政升级 精准守护民生保障
大数据·数据库·人工智能
念何架构之路1 小时前
zap扩展生态与总结
java·前端·数据库
晚安日记wanna2 小时前
MySQL 回表为什么这么慢?5 种优化手段逐个拆解
数据库·mysql·性能优化
第七页独白2 小时前
汽车零件厂如何通过 QMS 真正落地 IATF 16949——QMS软件系统:品质检验-内审稽核-8d客诉管理:全星质量管理软件系统
java·前端·数据库
晚安日记wanna2 小时前
索引建了却不走?7 个失效原因逐层排查
数据库·mysql·性能优化
小蒋观天下3 小时前
端侧大模型在安防摄像头部署实操(上)|行业痛点、架构选型、落地思路解析
大数据·人工智能·安全·计算机视觉·ai大模型
KID1412号3 小时前
PostgreSQL入门
数据库·postgresql