全部产品
Search
文档中心

时间序列数据库 TSDB:SELECT语句

更新时间:Jun 28, 2022

SELECT语句从一个或多个measurement中查询数据。

语法

SELECT <field_key>[,<field_key>,<tag_key>] FROM <measurement_name>[,<measurement_name>]

语法描述

SELECT语句需要一个SELECT子句和一个FROM子句。

SELECT子句

SELECT子句支持多种指定数据的格式:

  • SELECT * 返回所有的field和tag。

  • SELECT "<field_key>" 返回一个特定的field。

  • SELECT "<field_key>","<field_key>" 返回多个field。

  • SELECT "<field_key>","<tag_key>" 返回一个特定的field和一个特定的tag,当SELECT子句包含tag时,它必须至少指定一个field。

  • SELECT "<field_key>"::field,"<tag_key>"::tag 返回一个特定的field和一个特定的tag。::[field | tag]语法指定了标识符的类型,使用这个语法是为了区分具有相同名字的field key和tag key。

除此之外,SELECT子句支持的功能还有:算术运算、函数、转换操作和正则表达式。

FROM子句

FROM子句支持多种指定measurement的格式:

FROM <measurement_name>从一个measurement中返回数据。如果您使用CLI查询数据,那么访问的measurement属于USE指定的数据库,并且使用的是默认保留策略。如果您使用的是HTTP API,那么measurement属于参数db指定的数据库,同样,使用的是默认(DEFAULT)的保留策略。

FROM <measurement_name>,<measurement_name>从多个measurement中返回数据。

FROM <database_name>.<retention_policy_name>.<measurement_name>从一个被完全限定的measurement中返回数据。通过明确指定measurement的数据库和保留策略来完全限定一个measurement。

FROM <database_name>..<measurement_name>从用户指定的一个数据库并使用默认保留策略的measurement中返回数据。

除此之外,FROM子句还支持的功能:正则表达式。

引号

如果标识符包含除了[A-z,0-9,_]之外的字符,或者以数字开头,又或者是InfluxQL关键字,那么它们必须使用双引号。虽然并不总是需要,但是我们建议您为标识符加上双引号。

说明

这里关于引号的语法与行协议中的不同。

示例

查询单个measurement中的所有field和tag

SELECT * FROM "h2o_feet"

name: h2o_feet
--------------
time                   level description      location       water_level
2015-08-18T00:00:00Z   below 3 feet           santa_monica   2.064
2015-08-18T00:00:00Z   between 6 and 9 feet   coyote_creek   8.12
[...]
2015-09-18T21:36:00Z   between 3 and 6 feet   santa_monica   5.066
2015-09-18T21:42:00Z   between 3 and 6 feet   santa_monica   4.938

该语句从h2o_feet这个measurement中查询所有的field和tag。

如果您使用CLI,请确保在执行上面的查询前,先输入USE NOAA_water_database,CLI将查询被USE指定的数据库并且保留策略是默认的数据。如果您使用的是HTTP API,那么请确保将参数db设为NOAA_water_database,如果没有设置参数rp,那么HTTP API将自动使用该数据库的默认保留策略。

查询单个measurement中的特定的field和tag

SELECT "level description","location","water_level" FROM "h2o_feet"

name: h2o_feet
--------------
time                   level description      location       water_level
2015-08-18T00:00:00Z   below 3 feet           santa_monica   2.064
2015-08-18T00:00:00Z   between 6 and 9 feet   coyote_creek   8.12
[...]
2015-09-18T21:36:00Z   between 3 and 6 feet   santa_monica   5.066
2015-09-18T21:42:00Z   between 3 and 6 feet   santa_monica   4.938

该查询选择了两个field:level descriptionwater_level,和一个tag:location

说明

SELECT子句包含tag时,它必须至少指定一个field。

查询单个measurement中的带标识符类型的特定的field和tag

SELECT "level description"::field,"location"::tag,"water_level"::field FROM "h2o_feet"

name: h2o_feet
--------------
time                   level description      location       water_level
2015-08-18T00:00:00Z   below 3 feet           santa_monica   2.064
2015-08-18T00:00:00Z   between 6 and 9 feet   coyote_creek   8.12
[...]
2015-09-18T21:36:00Z   between 3 and 6 feet   santa_monica   5.066
2015-09-18T21:42:00Z   between 3 and 6 feet   santa_monica   4.938

该查询选择了两个field:level descriptionwater_level,和一个tag:location::[field | tag]语法明确指出了该标识符是field还是tag。当field key和tag key的名字相同时,请使用::[field | tag]来区分它们。大多数情况下,并不需要使用该语法。

查询单个measurement中的所有field

SELECT *::field FROM "h2o_feet"

name: h2o_feet
--------------
time                   level description      water_level
2015-08-18T00:00:00Z   below 3 feet           2.064
2015-08-18T00:00:00Z   between 6 and 9 feet   8.12
[...]
2015-09-18T21:36:00Z   between 3 and 6 feet   5.066
2015-09-18T21:42:00Z   between 3 and 6 feet   4.938

该查询从h2o_feet中选择了所有的field。SELECT子句支持将*::这两个语法结合使用。

查询单个measurement中的特定的field并进行基本运算

SELECT ("water_level"*2)+4 from "h2o_feet"

name: h2o_feet
--------------
time                   water_level
2015-08-18T00:00:00Z20.24
2015-08-18T00:00:00Z8.128
[...]
2015-09-18T21:36:00Z14.132
2015-09-18T21:42:00Z13.876

查询多个measurement中的所有数据

SELECT * FROM "h2o_feet","h2o_pH"

name: h2o_feet
--------------
time                   level description      location       pH   water_level
2015-08-18T00:00:00Z   below 3 feet           santa_monica        2.064
2015-08-18T00:00:00Z   between 6 and 9 feet   coyote_creek        8.12
[...]
2015-09-18T21:36:00Z   between 3 and 6 feet   santa_monica        5.066
2015-09-18T21:42:00Z   between 3 and 6 feet   santa_monica        4.938

name: h2o_pH
------------
time                   level description   location       pH   water_level
2015-08-18T00:00:00Z                       santa_monica   6
2015-08-18T00:00:00Z                       coyote_creek   7
[...]
2015-09-18T21:36:00Z                       santa_monica   8
2015-09-18T21:42:00Z                       santa_monica   7

该查询从两个measurement(h2o_feeth2o_pH)中选择所有的field和tag,多个measurement之间用逗号(,)隔开。

查询完全限定的measurement中的所有数据

SELECT * FROM "NOAA_water_database"."autogen"."h2o_feet"

name: h2o_feet
--------------
time                   level description      location       water_level
2015-08-18T00:00:00Z   below 3 feet           santa_monica   2.064
2015-08-18T00:00:00Z   between 6 and 9 feet   coyote_creek   8.12
[...]
2015-09-18T21:36:00Z   between 3 and 6 feet   santa_monica   5.066
2015-09-18T21:42:00Z   between 3 and 6 feet   santa_monica   4.938

该查询从h2o_feet中选择了所有数据,h2o_feet是属于数据库NOAA_water_database和保留策略autogen的measurement。

如果使用CLI,可以用这种完全限定measurement的方式来代替USE指定的数据库和指定DEFAULT之外的保留策略。如果使用HTTP API,可以通过完全限定measurement的方式,代替设置参数dbrp

查询特定数据库的measurement中的所有数据

SELECT * FROM "NOAA_water_database".."h2o_feet"

name: h2o_feet
--------------
time                   level description      location       water_level
2015-08-18T00:00:00Z   below 3 feet           santa_monica   2.064
2015-08-18T00:00:00Z   between 6 and 9 feet   coyote_creek   8.12
[...]
2015-09-18T21:36:00Z   between 3 and 6 feet   santa_monica   5.066
2015-09-18T21:42:00Z   between 3 and 6 feet   santa_monica   4.938

该查询从h2o_feet中选择了所有数据,h2o_feet是属于数据库NOAA_water_database和默认(DEFAULT)保留策略的measurement。..表示指定数据库的默认保留策略。

如果使用CLI,可以这种指定数据库的方式来代替USE指定的数据库。如果使用HTTP API,同样可以通过指定数据库,代替设置参数db

SELECT语句的常见问题

在SELECT子句中查询tag key

一个查询在SELECT子句中必须至少包含一个field key才能返回结果。如果SELECT子句中只包含一个或多个tag key,那么该查询会返回一个空的结果。这种返回结果的要求是系统存储数据的方式导致的。

示例

下面的查询不返回任何数据,因为它在SELECT子句中只给定了一个tag key(location):

SELECT "location" FROM "h2o_feet"

想要返回跟tag key location相关的数据,查询中的SELECT子句必须至少包含一个field key(water_level):

SELECT "water_level","location" FROM "h2o_feet" LIMIT 3
name: h2o_feet
time                   water_level  location
-----------------------
2015-08-18T00:00:00Z8.12         coyote_creek
2015-08-18T00:00:00Z2.064        santa_monica
[...]
2015-09-18T21:36:00Z5.066        santa_monica
2015-09-18T21:42:00Z4.938        santa_monica