文档说明

子查询

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

子查询运算符

[ NOT ] EXISTS

EXISTS 运算符返回所有行,其中相关子查询对于该行产生一个或多个匹配。 NOT EXISTS 返回所有行,其中相关子查询对于该行产生零个匹配。仅支持相关子查询。

语法

[NOT] EXISTS (subquery)

[ NOT ] IN

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

语法

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

示例

使用查询查看 IN 示例

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

SELECT 子句子查询

SELECT子句子查询使用内部查询返回的值作为外部查询的SELECT列表的一部分。该SELECT子句仅支持返回单个值的scalar subqueries(标量子查询)。返回的值对于每一行可以不同。

语法

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子句子查询比较SELECT子句中返回的聚合值表达式与子查询结果,并返回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
  )

标量子查询

标量子查询返回单个值(一列的一行)。如果没有行返回,子查询返回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 v3增强功能和InfluxDB Clustered现已正式发布

新功能包括更快的查询性能和管理工具,推动了InfluxDB v3产品线的发展。InfluxDB Clustered现已正式发布。

InfluxDB v3性能和功能

InfluxDB v3产品线在查询性能方面取得了显著提升,并提供了新的管理工具。这些增强包括一个操作仪表板,用于监控您的InfluxDB集群的健康状况,InfluxDB Cloud Dedicated中的单点登录(SSO)支持,以及针对令牌和数据库的新管理API。

了解新的v3增强功能


InfluxDB Clustered正式发布

InfluxDB Clustered现已正式发布,并在您自行管理的堆栈中提供InfluxDB v3的功能。

与我们谈论InfluxDB Clustered