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 提供实时分析、可视化、事件管理与报警等功能。

相关推荐
测试开发Kevin1 小时前
在电商系统中,哪些数据需要放到缓存?哪些数据需要放到DB永存呢?
时序数据库·数据库架构
慧都小妮子1 小时前
ThingsBoard PE 接入物联网关 MQTT 数据配置流程:从规则链到遥测入库
物联网·mqtt·数据采集·iot·规则引擎·工业通信·thingsboard
Geeys2 小时前
淘宝新店一般要熬几个月?淘宝新店破周期提速实操方案
大数据·人工智能
G.O.G.O.G2 小时前
LeetCode SQL 从入门到精通(MySQL)05(下)
数据库·sql·oracle
麦兜和小可的舅舅2 小时前
从原理到实战:Linux 系统性能诊断核心指标全解析及生产系统故障分析复盘
大数据·linux·运维
其实防守也摸鱼2 小时前
运维--安全与数据库
网络·数据库·学习·安全·安全威胁分析·数据库架构·软件安全
Rsun045513 小时前
MySQL 中什么是回表?
数据库·mysql
阿里技术3 小时前
Agent 评测:方法论与体系设计
大数据·人工智能·算法
buligbulig3 小时前
Hadoop环境安装和集群创建
大数据·hadoop·分布式
Sylvia33.3 小时前
足球数据接口开发实战:如何用火星数据API盘活赛事应用
java·服务器·开发语言·数据库·python