Select 查询
into_clause
子句用于将数据写入指定的测量(measurement)中,当前不支持。timezone_clause
子句用于在查询结果中将时间戳转换为指定时区的本地时间,当前已支持。sql_order_by_clause
为时序数据库 InfluxDB 版新增的子句,它允许您使用 SQL 风格的表达式对查询结果进行排序。开源 InfluxDB | 时序数据库 CTSDB 3.0版 |
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 ) [...] ) [...] | 完全兼容 |
查询数据类别 | 查询语句 |
查询全部数据 | 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 ")" ) . | 支持 | 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. | | |
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 是用于表示别名的标识符。 |