一、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 ) […] ) […] | 完全兼容 |
如下查询示例,以 使用数据库实例 中的关于车辆的时序数据为例。每行代表一个车辆的信息,包括车辆的 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 是用于表示别名的标识符。SELECT mean(temperature) AS avg_temp, mean(humidity) AS avg_humid FROM weather; |