时序数据库 TDengine SQL 查询语法规则汇总,官方教程奉上!

本文涉及的产品
PolarDB Agent Express,2核4GB
RDS AI 助手,专业版
RDS DuckDB + QuickBI 企业套餐,8核32GB + QuickBI 专业版
简介: TDengine 采用 SQL 作为查询语言,本文将就部分查询细则做分析。

小 T 导读:尽管时序数据处理的特点是以写操作为主,读操作为辅,但查询需求也不容忽视。为方便用户上手,时序数据库Time Series DatabaseTDengine 采用 SQL 作为查询语言,主要查询功能包括单列及多列数据查询、数值列及聚合结果的四则运算、时间戳对齐的连接查询操作等,本文将就部分查询细则做分析。

《查询性能:TDengine 最高达到了 InfluxDB 的 37 倍、 TimescaleDB 的 28.6 倍》中,我们了解到了 TDengine 在查询方面展现出的具体实力。但想要更好地发挥出 TDengine 的查询性能,在实际操作上,也还有一些事项需要注意,部分内容汇总如下:

TDengine SQL 查询语句可以指定部分或全部列作为返回结果。数据列和标签列都可以出现在列表中。

通配符和标签列

通配符 * 可以用于代指全部列。对于普通表和子表,结果中只有普通列。对于超级表,还包含了 Tag 列。

  1. SELECT * FROM d1001;

通配符支持表名前缀,以下两个 SQL 语句均为返回全部的列:

  1. SELECT * FROM d1001;
  2. SELECT d1001.* FROM d1001;

在 JOIN 查询中,带表名前缀的*和不带前缀*返回的结果有差别, *返回全部表的所有列数据(不包含标签),而带表名前缀的通配符,则只返回该表的列数据。

  1. SELECT * FROM d1001, d1003 WHERE d1001.ts=d1003.ts;
  2. SELECT d1001.* FROM d1001,d1003 WHERE d1001.ts = d1003.ts;

上面的查询语句中,前者返回 d1001 和 d1003 的全部列,而后者仅返回 d1001 的全部列。

在使用 SQL 函数来进行查询的过程中,部分 SQL 函数支持通配符操作。其中的区别在于: count(*)函数只返回一列。firstlastlast_row函数则是返回全部列。

此外,在超级表和子表的查询中我们也可以指定标签列,且标签列的值会与普通列的数据一起返回。

  1. SELECT location, groupid, current FROM d1001 LIMIT 2;

结果去重

DISTINCT 关键字可以对结果集中的一列或多列进行去重,去除的列既可以是标签列也可以是数据列。

对标签列去重:

  1. SELECT DISTINCT tag_name [, tag_name ...] FROM stb_name;

对数据列去重:

  1. SELECT DISTINCT col_name [, col_name ...] FROM tb_name;

需要注意:

  1. cfg 文件中的配置参数 maxNumOfDistinctRes 将对 DISTINCT 能够输出的数据行数进行限制。其最小值是 100000,最大值是 100000000,默认值是 10000000。如果实际计算结果超出了这个限制,那么会仅输出这个数量范围内的部分。
  2. 由于浮点数天然的精度机制原因,在特定情况下,对 FLOAT 和 DOUBLE 列使用 DISTINCT 并不能保证输出值的完全唯一性。

特殊功能

部分特殊的查询功能可以不使用 FROM 子句执行。

下面的命令可以获取当前所在的数据库 database(),如果登录的时候没有指定默认数据库,且没有使用USE命令切换数据,则返回 NULL。

  1. SELECT DATABASE();

获取服务器和客户端版本号:

  1. SELECT CLIENT_VERSION();
  2. SELECT SERVER_VERSION();

服务器状态检测语句。如果服务器正常,返回一个数字(例如 1)。如果服务器异常,返回 error code。该 SQL 语法能兼容连接池对于 TDengine 状态的检查及第三方工具对于数据库服务器状态的检查。并可以避免出现使用了错误的心跳检测 SQL 语句导致的连接池连接丢失的问题。

  1. SELECT SERVER_STATUS();

我们可以使用SELECT NOW();来获取当前时间,使用SELECT TODAY();来获取当前日期,使用SELECT TIMEZONE();获取当前时区。

正则表达式过滤

语法

  1. WHERE (column|tbname) match/MATCH/nmatch/NMATCH _regex_

正则表达式规范

确保使用的正则表达式符合 POSIX 的规范,具体规范内容可参见Regular Expressions

使用限制

不仅能针对表名(即 tbname 筛选)、binary/nchar 类型标签值进行正则表达式过滤,也支持普通列的过滤。

正则匹配字符串长度不能超过 128 字节。可以通过参数 maxRegexStringLen 设置和调整最大允许的正则匹配字符串,该参数是客户端配置参数,需要重启才能生效。

CASE 表达式

语法

  1. CASE value WHEN compare_value THEN result [WHEN compare_value THEN result ...][ELSE result]END
  2. CASE WHEN condition THEN result [WHEN condition THEN result ...][ELSE result]END

说明

TDengine 通过 CASE 表达式让用户可以在 SQL 语句中使用 IF … THEN … ELSE 逻辑。

第一种 CASE 语法返回第一个 value 等于 compare_value 的 result,如果没有 compare_value 符合,则返回 ELSE 之后的 result,如果没有 ELSE 部分,则返回 NULL。

第二种语法返回第一个 condition 为真的 result。 如果没有 condition 符合,则返回 ELSE 之后的 result,如果没有 ELSE 部分,则返回 NULL。

CASE 表达式的返回类型为第一个 WHEN THEN 部分的 result 类型,其余 WHEN THEN 部分和 ELSE 部分,result 类型都需要可以向其转换,否则 TDengine 会报错。

示例

某设备有三个状态码,显示其状态,语句如下:

  1. SELECT CASE dev_status WHEN 1 THEN 'Running' WHEN 2 THEN 'Warning' WHEN 3 THEN 'Downtime' ELSE 'Unknown'END FROM dev_table;

统计智能电表的电压平均值,当电压小于 200 或大于 250 时认为是统计有误,修正其值为 220,语句如下:

  1. SELECT AVG(CASE WHEN voltage <200or voltage >250 THEN 220 ELSE voltage END) FROM meters;

JOIN 子句

TDengine 支持基于时间戳主键的内连接,即 JOIN 条件必须包含时间戳主键。只要满足基于时间戳主键这个要求,普通表、子表、超级表和子查询之间可以随意的进行内连接,且对表个数没有限制。

普通表与普通表之间的 JOIN 操作:

  1. SELECT *
  2. FROM temp_tb_1 t1, pressure_tb_1 t2
  3. WHERE t1.ts = t2.ts

超级表与超级表之间的 JOIN 操作:

  1. SELECT *
  2. FROM temp_stable t1, temp_stable t2
  3. WHERE t1.ts = t2.ts AND t1.deviceid = t2.deviceid AND t1.status=0;

子表与超级表之间的 JOIN 操作:

  1. SELECT *
  2. FROM temp_ctable t1, temp_stable t2
  3. WHERE t1.ts = t2.ts AND t1.deviceid = t2.deviceid AND t1.status=0;

类似地,也可以对多个子查询的查询结果进行 JOIN 操作。

嵌套查询

“嵌套查询”又称为“子查询”,也即在一条 SQL 语句中,“内层查询”的计算结果可以作为“外层查询”的计算对象来使用。

从 2.2.0.0 版本开始,TDengine 的查询引擎开始支持在 FROM 子句中使用非关联子查询(“非关联”的意思是,子查询不会用到父查询中的参数)。也即在普通 SELECT 语句的 tb_name_list 位置,用一个独立的 SELECT 语句来代替(这一 SELECT 语句被包含在英文圆括号内),于是完整的嵌套查询 SQL 语句形如:

  1. SELECT ... FROM (SELECT ... FROM ...)...;

需要注意:

  • 内层查询的返回结果将作为“虚拟表”供外层查询使用,此虚拟表建议起别名,以便于外层查询中方便引用。
  • 在内层和外层查询中,都支持普通的表间/超级表间 JOIN。内层查询的计算结果也可以再参与数据子表的 JOIN 操作。
  • 内层查询支持的功能特性与非嵌套的查询语句能力是一致的。
  • 内层查询的 ORDER BY 子句一般没有意义,建议避免这样的写法以免无谓的资源消耗。
  • 与非嵌套的查询语句相比,外层查询所能支持的功能特性存在如下限制(计算函数部分):
  • 如果内层查询的结果数据未提供时间戳,那么计算过程隐式依赖时间戳的函数在外层会无法正常工作。例如:INTERP, DERIVATIVE, IRATE, LAST_ROW, FIRST, LAST, TWA, STATEDURATION, TAIL, UNIQUE。
  • 如果内层查询的结果数据不是按时间戳有序,那么计算过程依赖数据按时间有序的函数在外层会无法正常工作。例如:LEASTSQUARES, ELAPSED, INTERP, DERIVATIVE, IRATE, TWA, DIFF, STATECOUNT, STATEDURATION, CSUM, MAVG, TAIL, UNIQUE。
  • 计算过程需要两遍扫描的函数,在外层查询中无法正常工作。例如:此类函数包括:PERCENTILE。

写在最后

受篇幅所限,本文仅阐述了在进行 SQL 查询时部分细则及注意事项,关于结果集列名、伪列、查询对象、GROUP BY等子句的使用规则以及相关语法示例,大家可以进入官网文档——https://docs.taosdata.com/taos-sql/select/#group-by 进行查阅。在使用 TDengine 执行 SQL 查询时,以上实操手册会帮助你解决一系列基础问题。但如果你遇到的问题迟迟未能解决,也不要着急,可以联系我们,向 TDengine 技术人员寻求帮助。

目录
相关文章
|
9月前
|
关系型数据库 MySQL 数据库
阿里云数据库RDS费用价格:MySQL、SQL Server、PostgreSQL和MariaDB引擎收费标准
阿里云RDS数据库支持MySQL、SQL Server、PostgreSQL、MariaDB,多种引擎优惠上线!MySQL倚天版88元/年,SQL Server 2核4G仅299元/年,PostgreSQL 227元/年起。高可用、可弹性伸缩,安全稳定。详情见官网活动页。
1431 152
|
9月前
|
关系型数据库 MySQL 数据库
阿里云数据库RDS支持MySQL、SQL Server、PostgreSQL和MariaDB引擎
阿里云数据库RDS支持MySQL、SQL Server、PostgreSQL和MariaDB引擎,提供高性价比、稳定安全的云数据库服务,适用于多种行业与业务场景。
1045 156
|
9月前
|
SQL 人工智能 Linux
SQL Server 2025 RC1 发布 - 从本地到云端的 AI 就绪企业数据库
SQL Server 2025 RC1 发布 - 从本地到云端的 AI 就绪企业数据库
717 5
SQL Server 2025 RC1 发布 - 从本地到云端的 AI 就绪企业数据库
|
8月前
|
SQL 存储 监控
SQL日志优化策略:提升数据库日志记录效率
通过以上方法结合起来运行调整方案, 可以显著地提升SQL环境下面向各种搜索引擎服务平台所需要满足标准条件下之数据库登记作业流程综合表现; 同时还能确保系统稳健运行并满越用户体验预期目标.
408 6
|
9月前
|
关系型数据库 分布式数据库 数据库
阿里云数据库收费价格:MySQL、PostgreSQL、SQL Server和MariaDB引擎费用整理
阿里云数据库提供多种类型,包括关系型与NoSQL,主流如PolarDB、RDS MySQL/PostgreSQL、Redis等。价格低至21元/月起,支持按需付费与优惠套餐,适用于各类应用场景。
|
9月前
|
缓存 Java 应用服务中间件
Spring Boot配置优化:Tomcat+数据库+缓存+日志,全场景教程
本文详解Spring Boot十大核心配置优化技巧,涵盖Tomcat连接池、数据库连接池、Jackson时区、日志管理、缓存策略、异步线程池等关键配置,结合代码示例与通俗解释,助你轻松掌握高并发场景下的性能调优方法,适用于实际项目落地。
1586 5
|
9月前
|
SQL Oracle 关系型数据库
Oracle数据库创建表空间和索引的SQL语法示例
以上SQL语法提供了一种标准方式去组织Oracle数据库内部结构,并且通过合理使用可以显著改善查询速度及整体性能。需要注意,在实际应用过程当中应该根据具体业务需求、系统资源状况以及预期目标去合理规划并调整参数设置以达到最佳效果。
598 8
|
SQL 存储 运维
从建模到运维:联犀如何完美融入时序数据库 TDengine 实现物联网数据流畅管理
本篇文章是“2024,我想和 TDengine 谈谈”征文活动的三等奖作品。文章从一个具体的业务场景出发,分析了企业在面对海量时序数据时的挑战,并提出了利用 TDengine 高效处理和存储数据的方法,帮助企业解决在数据采集、存储、分析等方面的痛点。通过这篇文章,作者不仅展示了自己对数据处理技术的理解,还进一步阐释了时序数据库在行业中的潜力与应用价值,为读者提供了很多实际的操作思路和技术选型的参考。
536 1
|
存储 SQL 多模数据库
多模数据库Lindorm再升级:对接Dataphin,打通数据治理“最后一公里”
Lindorm通过与Dataphin的深度整合,进一步解决了数据集成和数据治理的问题,为企业提供更加高效和更具性价比的方案。
多模数据库Lindorm再升级:对接Dataphin,打通数据治理“最后一公里”
|
数据采集 安全 API
DataphinV4.1大升级: 支持Lindorm开启高性价比数据治理,迎来“公共云半托管”云上自助新模式
Dataphin 是阿里巴巴旗下的一个智能数据建设与治理平台,旨在帮助企业构建高效、可靠、安全的数据资产。在V4.1版本升级中,Dataphin 引入了Lindorm等多项新功能,并开启公共云半托管模式,优化代码搜索,为用户提供更加高效、灵活、安全的数据管理和运营环境,提升用户体验,促进企业数据资产的建设和价值挖掘。
2235 3
DataphinV4.1大升级: 支持Lindorm开启高性价比数据治理,迎来“公共云半托管”云上自助新模式