Documentation

子查询

子查询(也称为内部查询或嵌套查询)是在查询内部的查询。子查询可以用于 SELECTFROMWHEREHAVING 子句。

子查询运算符

[ NOT ] EXISTS

EXISTS 操作符返回所有行,其中 相关子查询 为该行生成一个或多个匹配项。 NOT EXISTS 返回所有行,其中 相关子查询 为该行生成零个匹配项。仅支持 相关子查询

语法

[NOT] EXISTS (subquery)

[ NOT ] 在

IN 运算符返回所有行,其中给定表达式的值可以在 相关子查询 的结果中找到。NOT IN 返回所有行,其中给定表达式的值不能在子查询或值列表的结果中找到。

语法

expression [NOT] IN (subquery|list-literal)

示例

使用查询查看 IN 示例

使用列表字面量查看 IN 示例

选择子查询

SELECT 子查询使用来自内层查询的返回值作为外层查询的 SELECT 列表的一部分。 SELECT 子句仅支持 标量子查询,这些子查询在每次执行内层查询时返回单个值。 返回的值可以在每一行中是唯一的。

语法

SELECT [expression1[, expression2, ..., expressionN],] (<subquery>)

SELECT 子查询可作为 JOIN 操作的替代。

示例

SELECT 子句与相关子查询

FROM 子句子查询

FROM 子查询返回一组结果,然后由外部查询进行查询和操作。

语法

SELECT expression1[, expression2, ..., expressionN] FROM (<subquery>)

示例

查看 FROM 子查询示例

WHERE 子查询

WHERE 子查询 比较一个表达式与子查询的结果,并返回 truefalse。评估为 false 或 NULL 的行会被过滤掉。WHERE 子句支持相关和不相关的子查询,以及标量和非标量的子查询(取决于谓词表达式中使用的操作符)。

语法

SELECT
  expression1[, expression2, ..., expressionN]
FROM
  <measurement>
WHERE
  expression operator (<subquery>)

WHERE 子查询可以作为 JOIN 操作的替代方案。

示例

WHERE 子句与标量子查询

WHERE 子句与非标量子查询

WHERE 子句与相关子查询

HAVING 子句子查询

HAVING 子查询 比较一个使用聚合函数返回的聚合值的表达式 与子查询的结果,并返回 truefalse。 评估为 false 或 NULL 的行从结果中过滤。 HAVING 子句支持相关和非相关子查询 以及标量和非标量子查询(这取决于谓词表达式中使用的操作符)。

语法

SELECT
  aggregate_expression1[, aggregate_expression2, ..., aggregate_expressionN]
FROM
  <measurement>
WHERE
  <conditional_expression>
GROUP BY
  column_expression1[, column_expression2, ..., column_expressionN]
HAVING
  expression operator (<subquery>)

示例

HAVING 子句与标量子查询

HAVING 子句与非标量子查询

HAVING 子句与相关子查询

子查询类别

SQL 子查询可以根据子查询的行为分为以下一种或多种:

相关子查询

在一个相关子查询中,内部查询依赖于当前正在处理的行的值。

在下面的查询中,内查询 (SELECT temp_avg FROM weather WHERE location = home.room) 依赖于外查询 (SELECT time, room, temp FROM home) 的数据 (home.room),因此是一个 相关 子查询。

SELECT
  time,
  room,
  temp
FROM
  home
WHERE
  temp = (
    SELECT
      temp_avg
    FROM
      weather
    WHERE
      location = home.room
  )

相关子查询性能

因为相关子查询依赖于外部查询,并通常必须为外部查询返回的每一行执行,所以相关子查询的性能较低于非相关子查询。

非相关子查询

在一个非相关子查询中,内部查询依赖于外部查询,并独立执行。 内部查询先执行,然后将结果传递给外部查询。

在下面的查询中,内查询 (SELECT MIN(temp_avg) FROM weather) 可以独立于外查询 (SELECT time, temp FROM home) 运行,因此是一个 非相关 子查询。

SELECT
  time,
  temp
FROM
  home
WHERE
  temp < (
    SELECT
      MIN(temp_avg)
    FROM
      weather
  )

标量子查询

A 标量 子查询返回单个值(一行的一列)。如果没有返回任何行,子查询返回 NULL。

下面的示例子查询返回指定列的平均值。 这个值是一个单一的标量值。

SELECT * FROM home WHERE co > (SELECT avg(co) FROM home)

非标量子查询

一个 非标量 子查询返回 0、1 或多个行,每行可能包含 1 或多个列。对于每一列,如果没有值可返回,子查询返回 NULL。如果没有行符合条件将被返回,子查询返回 0 行。

下面的示例子查询返回列中的所有不同值。返回多个值。

SELECT * FROM home WHERE room IN (SELECT DISTINCT room FROM home_actions)


Flux的未来

Flux 正在进入维护模式。您可以像现在一样继续使用它,而无需对您的代码进行任何更改。

阅读更多

InfluxDB 3 开源版本现已公开Alpha测试

InfluxDB 3 Open Source is now available for alpha testing, licensed under MIT or Apache 2 licensing.

我们将发布两个产品作为测试版的一部分。

InfluxDB 3 核心,是我们新的开源产品。 它是一个用于时间序列和事件数据的实时数据引擎。 InfluxDB 3 企业版是建立在核心基础之上的商业版本,增加了历史查询能力、读取副本、高可用性、可扩展性和细粒度安全性。

有关如何开始的更多信息,请查看: