数据查询

最近更新时间:2023-07-13 09:20:21

我的收藏

Select 查询

时序数据库 InfluxDB 在使用 select 查询数据时,相比开源 InfluxDB,存在如下差异。各个子句的语义,请参见 子句及表达式
into_clause子句用于将数据写入指定的测量(measurement)中,当前不支持。
timezone_clause子句用于在查询结果中将时间戳转换为指定时区的本地时间,当前已支持。
sql_order_by_clause为时序数据库 InfluxDB 版新增的子句,它允许您使用 SQL 风格的表达式对查询结果进行排序。
开源 InfluxDB
时序数据库 InfluxDB 版
select_stmt = "SELECT" fields from_clause [into_clause] [ where_clause ] [ group_by_clause ] [ order_by_clause ] [ limit_clause ] [ offset_clause ] [ slimit_clause ] [ soffset_clause ] [ timezone_clause ]
select_stmt = "SELECT" fields from_clause [ where_clause ] [ group_by_clause ] [ order_by_clause ] [ limit_clause ] [ offset_clause ] [ slimit_clause ] [ soffset_clause ] [ sql_order_by_clause ]
SELECT_clause FROM ( SELECT_clause FROM ( SELECT_statement ) [...] ) [...]
完全兼容
如下查询示例,以 使用数据库实例 中的关于车辆的时序数据为例。每行代表一个车辆的信息,包括车辆的 id、所在城市、类型、速度和温度等。时间戳位于每行末尾,表示这些信息是在对应的时间戳时刻记录的。
查询数据类别
查询语句
查询全部数据
select * from car
分页获取部分数据
select * from car limit 3 offset 2
聚合函数作为复杂表达式的参数
select (max(speed) + max(temp) - min(speed)) * count(speed) / 20 % 5 as f1, floor(min(speed)) & ceil(max(temp)) | round(min(speed)) ^ round(max(temp)) as f2, sqrt(pow(abs(max(speed)*min(speed)), 2)) as f3 from car group by time(3s), type fill(none)
聚合计算
select count(speed), mean(speed), count(temp), percentile(temp, 50) from car group by time(3s), type fill(none) limit 1 offset 1 slimit 2 soffset 1
混合一个 Selectors 与 field,group by time intervals
select max(speed)*6, speed*10 from car where time <= 2000000000ns group by time(1s)
混合一个 Selectors 与 field,group by tag
select max(speed), pow(speed, temp/100.0) from car group by type
仅 fields,group by tag
select *, temp, sqrt(pow(abs(max(speed)), 3)) FROM car group by city

InfluxQL 子句及表达式

InfluxQL 是一种类似于 SQL 的查询语言,用于与 InfluxDB 中的数据进行交互。下表详细列出了时序数据库版 InfluxDB 版相比开源 InfluxDB 在探索数据的查询语法方面的支持程度。具体如何使用,请参见 Explore data using InfluxQL
开源 InfluxDB
时序数据库 InfluxDB 版
语义
with_tag_clause = "WITH KEY" ( "=" tag_key | "!=" tag_key | "=~" regex_lit | "IN (" tag_keys ")" ) .
支持
该查询语义通过正则表达式指定一个或多个标签键。具体信息,请参见 Regular expressions
WITH KEY 是一个关键字,用于指示后面的子句将包含一个或多个标签键和值。
=、!=、=~和 IN:这些是可用于匹配标签键和值的运算符。
=,!=和=~分别表示相等、不相等和正则表达式匹配。
IN 运算符用于指定标签键的值应该是给定列表中的一个。
tag_key:用于匹配的标签键的名称。
regex_lit:用于匹配标签键的值。
tag_keys:用于指定要匹配的多个标签键。
示例:SELECT * FROM http_requests_total WITH KEY (method != 'POST' AND method =~ 'PUT.*') | status_code IN ('200', '404')
with_measurement_clause = "WITH MEASUREMENT" ( "=" measurement | "=~" regex_lit ) .
该语义使用 WITH MEASUREMENT 子句来筛选指定的测量值(measurement),其中 regex_lit 指定了匹配的测量值。
where_clause = "WHERE" expr.
请参见 The WHERE clause
var_ref = measurement .
表示一个变量引用,将变量与测量值进行关联。
user_name = identifier .
定义一个名为 user_name 的字段,其值为 identifier。
unary_expr = "(" expr ")" | var_ref | time_lit | string_lit | int_lit | float_lit | bool_lit | duration_lit | regex_lit .
unary_expr 的表达式,它可以由以下几种子表达式组成:
(expr):表示一个由括号包围的表达式,其中 expr 是另一个表达式。
var_ref:表示一个变量引用,用于引用 InfluxDB 中的测量值、字段或标签。
time_lit:表示一个时间字面量,用于表示时间戳。
string_lit:表示一个字符串字面量,用于表示文本数据。
int_lit:表示一个整数字面量,用于表示整型数据。
float_lit:表示一个浮点数字面量,用于表示浮点型数据。
bool_lit:表示一个布尔字面量,用于表示真或假。
duration_lit:表示一个时间段字面量,用于表示持续时间。
regex_lit:表示一个正则表达式字面量,用于匹配文本数据中的模式。
to_clause = "TO" user_name .
表示在查询 InfluxDB 中的数据时,将查询结果发送到指定的用户。其中,user_name 参数是指接收查询结果的用户的名称。
timezone_clause = tz(string_lit) .
支持
用于时序数据库中的时间戳数据,以指定时间戳的时区信息。如下示例, 指定了时区信息为亚洲/上海的数据。
SELECT time, temperature FROM sensor_data WHERE time >= '2023-07-10T00:00:00.000Z' AND time < '2023-07-11T00:00:00.000Z' timezone_clause = tz('Asia/Shanghai');
tag_keys = tag_key { "," tag_key } .
支持
指定要在查询结果中返回的标签键列表。
逗号表示标签键之间的分隔符。
如下查询语句只返回标签 tag3的值等于 value3,并且时间戳在过去的一小时内的数据。标签键 tag1和 tag2,只返回这两个标签键的值。
SELECT * FROM measurement1 WHERE tag3='value3' AND time > now() - 1h TAGS tag_keys=tag1,tag2
tag_key = identifier .
表示标签键由一个标识符组成。标签是存储在 InfluxDB 中的每个时间序列的元数据,由键值对组成。您可以使用标识符来命名标签键。例如:measurement1,tag1=value1,tag2=value2 field1=1,field2=2
subscription_name = identifier .
表示订阅名称由一个标识符组成。
soffset_clause = "SOFFSET" int_lit .
soffset_clause 是用于查询 InfluxDB 中的时间序列数据时指定偏移量的语法结构。它由 SOFFSET 和一个整数字面量 int_lit 组成。例如:SELECT * FROM mymeasurement WHERE time > '2023-05-01T00:00:00Z' AND time < '2023-05-31T00:00:00Z' SOFFSET 10
slimit_clause = "SLIMIT" int_lit .
slimit_clause 是用于查询 InfluxDB 中的时间序列数据时指定返回结果数量限制的语法结构。它由 SLIMIT 和一个整数字面量 int_lit 组成,只能用于 SELECT 语句,并且必须放在查询语句的末尾。例如:SELECT * FROM mymeasurement WHERE time > '2023-05-01T00:00:00Z' AND time < '2023-05-31T00:00:00Z' SLIMIT 10
series_id = int_lit .
series_id 是用于查询 InfluxDB 中的时间序列数据时指定数据系列 ID 的语法结构。它由一个整数字面量 int_lit组成。使用 series_id,您可以查询指定 ID 的数据系列,但是只能用于 SELECT 语句,并且必须放在查询语句的末尾。例如,查询ID 为 1234 的数据系列:SELECT * FROM mymeasurement WHERE series_id = 1234
retention_policy_shard_group_duration = "SHARD DURATION" duration_lit .
不支持
-
retention_policy_replication = "REPLICATION" int_lit .
不支持
-
retention_policy_option = retention_policy_duration | retention_policy_replication | retention_policy_shard_group_duration | "DEFAULT" .
不支持
-
retention_policy_name = "NAME" identifier .
不支持
-
retention_policy_duration = "DURATION" duration_lit .
不支持
-
retention_policy = identifier .
不支持
-
query_name = identifier .
支持
query_name 是用于对查询语句进行命名的语法结构。以下使用 SELECT 语句查询名为 mymeasurement 的测量中在特定时间范围内的所有数据点,并使用 GROUP BY 对结果进行分组。然后,使用 INTO 将查询结果存储到名为 mycount 的查询中。 SELECT COUNT(*) FROM mymeasurement WHERE time > '2023-05-01T00:00:00Z' AND time < '2023-05-31T00:00:00Z' GROUP BY time(1h) INTO mycount
query_id = int_lit .
支持
query_id 是用于查询 InfluxDB 中的已命名查询的标识符。它由一个整数字面量 int_lit 组成。例如:SELECT * FROM 1234
privilege = "ALL" [ "PRIVILEGES" ] | "READ" | "WRITE" .
不支持
-
policy_name = identifier .
不支持
-
password = string_lit .
支持
password 是用于在连接 InfluxDB 时指定密码的语法结构。它由一个字符串字面量 string_lit 组成。使用 password,您可以在连接 InfluxDB 时指定密码,以便进行身份验证。例如,使用 influx 命令连接到名为 myinfluxdb.example.com 的 InfluxDB 实例,并指定用户名为 myuser,密码为 mypassword。示例如下: influx -username myuser -password 'mypassword' -host myinfluxdb.example.com -port 8086
order_by_clause = "ORDER BY" sort_fields .
sort_fields = sort_field { "," sort_field } .
sort_field = field_key [ ASC | DESC ] .
order_by_clause = ORDER BY time [ ASC | DESC ] sql_order_by_clause = SQLORDER BY {sql_order_expr [ ASC | DESC ] } [ ,...n ]  SQLLIMIT N SQLOFFSET N] sql_order_expr = {alias | expr | position}
ORDER BY 子句用于按照指定的列对查询结果进行排序。ORDER BY 子句后面必须跟一个排序字段,通常是 time,它是 InfluxDB 中所有测量的默认时间戳列。您可以选择按升序(ASC)或降序(DESC)排序。例如:SELECT * FROM mymeasurement WHERE time > '2023-05-01T00:00:00Z' AND time < '2023-05-31T00:00:00Z' ORDER BY time DESC
除了 InfluxQL 的 ORDER BY 子句外,还有一个类似的 SQL 语法的 SQLORDER BY 子句。它允许您使用 SQL 风格的表达式对查询结果进行排序,并支持 LIMIT 和 OFFSET子句。例如,以下是一个使用 SQLORDER BY子句的示例: SELECT * FROM mymeasurement SQLORDER BY value DESC, time ASC SQLLIMIT 10 SQLOFFSET 20
on_cluse = "ON" db_name .
支持
ON 子句用于指定查询操作的目标数据库。它通常用于跨数据库查询或在具有多个数据库的 InfluxDB 实例中执行查询。ON 子句后面必须跟一个数据库名称,例如:
SELECT * FROM mymeasurement ON mydatabase WHERE time > '2023-05-01T00:00:00Z' AND time < '2023-05-31T00:00:00Z'
offset_clause = "OFFSET" int_lit .
OFFSET 子句用于指定查询结果集的偏移量。它通常与 LIMIT 子句一起使用,以限制查询结果集的大小并指定从哪个偏移量开始返回结果。OFFSET 子句后面必须跟一个整数值,例如: SELECT * FROM mymeasurement WHERE time > '2023-05-01T00:00:00Z' AND time < '2023-05-31T00:00:00Z' LIMIT 10 OFFSET 20 注意:OFFSET 子句必须放在 LIMIT 子句之后。如果省略 OFFSET 子句,则默认偏移量为0。如果查询结果集的大小小于指定的偏移量,则返回空结果集。
measurements = measurement { "," measurement } .
measurements 是一个由多个测量名称组成的列表,用于指定查询操作的目标测量。它通常用于跨多个测量执行查询操作。measurements 语法结构由一个或多个 measurement 组成,每个 measurement 表示一个测量名称。例如,使用 SELECT 语句查询名为 measurement1 和 measurement2 的两个测量中在特定时间范围内的所有数据点,执行语句如下:SELECT * FROM measurement1, measurement2 WHERE time > '2023-05-01T00:00:00Z' AND time < '2023-05-31T00:00:00Z'
measurement_name = identifier | regex_lit .
measurement_name = identifier
measurement_name 表示一个测量名称,用于标识 InfluxDB 中存储的一组数据。它是一个标识符,由一个或多个字母、数字或下划线组成,且必须以字母开头。
measurement = measurement_name | ( policy_name "." measurement_name ) | ( db_name "." [ policy_name ] "." measurement_name ) .
measurement = measurement_name 
measurement 表示一个测量,它是由测量名称、字段和标签组成的数据存储单位。每个测量都包含一个或多个字段和零个或多个标签,用于描述数据的特征和属性。measurement 语法结构由一个 measurement_name 组成,表示测量的名称。
limit_clause = "LIMIT" int_lit .
支持
limit_clause 用于限制查询结果返回的数据点数量。它由关键字 LIMIT 和一个整数值组成,该整数值表示返回的数据点数量。
into_clause = "INTO" ( measurement | back_ref ).
不支持
-
host = string_lit .
支持
host 表示一个主机名,用于标识 InfluxDB 中存储的数据所属的主机。它是一个字符串,由一系列字符组成,用于唯一标识一个主机。
groupby_clause = "GROUP BY" dimensions fill(fill_option).
GROUP BY 用于将查询结果按照指定的维度进行分组。groupby_clause 语法结构由以下部分组成:
"GROUP BY":关键字。表示按照指定的维度进行分组。
dimensions:一个或多个维度,用逗号分隔。维度可以是测量中的字段或标签名。
fill(fill_option):一个可选的填充选项,用于指定如何处理缺失的数据点。
以下示例使用 SELECT 语句查询名为 my_measurement 的测量中在特定时间范围内的所有数据点,并按照 location 标签对数据点进行分组,最后计算每组数据点的平均值。 SELECT mean(value) FROM my_measurement WHERE time > '2023-05-01T00:00:00Z' AND time < '2023-05-31T00:00:00Z' GROUP BY location
from_clause = "FROM" measurements .
FROM用于指定查询的数据源,即测量名称。
fill_option = "null" | "none" | "previous" | int_lit | float_lit | "linear" .
fill_option = "none" .
fill_option 用于指定如何处理查询结果中的缺失数据点。fill_option 可以是以下三种选项之一:
fill(null):用 null 填充缺失的数据点。
fill(previous):用前一个数据点的值填充缺失的数据点。
fill(none):不对缺失的数据点进行填充,直接将其忽略。
fields = field { "," field } .
支持
fields 用于指定需要查询的字段列表,可以是一个或多个字段,用逗号分隔。如果需要查询所有字段,可以使用通配符“*”。
field:一个或多个字段名,用逗号分隔。
{ "," field }:可选的重复部分,用于指定多个字段名。
field_key = identifier .
field_key 用于指定测量中的字段名。identifier 为一个标识符,用于指定测量中的字段名。
field = expr [ alias ] .
field 用于指定查询结果中的一个字段。field 语法结构由以下部分组成:
expr:一个表达式,用于计算查询结果中的值。
[ alias ]:可选的别名,用于为查询结果中的字段指定一个名称。
expr = unary_expr { binary_op unary_expr } .
expr 用于表示一个表达式,可以是一个常量、一个标识符或一个由运算符和操作数组成的复杂表达式。expr 语法结构由以下部分组成:
unary_expr:一个一元表达式,可以是一个常量、一个标识符或一个由一元运算符和操作数组成的表达式。
{ binary_op unary_expr }:可选的重复部分,用于指定多个二元运算符和操作数。
dimensions = dimension { "," dimension } .
dimensions 用于指定查询结果中的一个或多个维度。
dimensions 语法结构由以下部分组成:
dimension:一个维度,用于指定查询结果中的一个维度。 { "," dimension }:可选的重复部分,用于指定多个维度。
以下示例,使用 SELECT 语句查询名为 my_measurement 的测量中在特定时间范围内的所有数据点,并计算 temperature 字段的平均值。我们还使用 GROUP BY子句指定了两个维度 location 和 device,这意味着查询结果将按照这两个维度进行分组。
SELECT mean(temperature) FROM my_measurement WHERE time > '2023-05-01T00:00:00Z' AND time < '2023-05-31T00:00:00Z' GROUP BY location, device
dimension = expr .
dimension 用于指定查询结果中的一个维度。expr 指一个表达式,用于计算查询结果中的值。
db_name = identifier .
db_name 用于指定测量中的数据库名。identifier 为一个标识符,用于指定测量中的字段名。
binary_op = "+" | "-" | "*" | "/" | "%" | "&" | "|" | "^" | "AND" | "OR" | "=" | "!=" | "<>" | "<" | "<=" | ">" | ">=" .
表示二元运算符。这些运算符包括加号、减号、乘号、除号、取模运算、按位与、按位或、按位异或、逻辑与、逻辑或、等于、不等于、小于等于、大于等于、小于和大于。这些运算符用于操作两个值,并返回一个结果。
back_ref = ( policy_name ".:MEASUREMENT" ) | ( db_name "." [ policy_name ] ".:MEASUREMENT" ) .
不支持
-
alias = "AS" identifier .
支持
该语义用于创建一个别名。该别名由两个部分组成:AS 和 identifier。AS 是一个关键字,后面跟着的 identifier 是用于表示别名的标识符。