分类 :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 ...;
参考
系统构架篇
- 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 最佳实践》
预聚合
索引
SQL 语句
关于 TDengine
TDengine 专为物联网IoT平台、工业大数据平台设计。其中,TDengine TSDB 是一款高性能、分布式的时序数据库(Time Series Database),同时它还带有内建的缓存、流式计算、数据订阅等系统功能;TDengine IDMP 是一款AI原生工业数据管理平台,它通过树状层次结构建立数据目录,对数据进行标准化、情景化,并通过 AI 提供实时分析、可视化、事件管理与报警等功能。