文档文档

子查询

子查询(也称为内部查询或嵌套查询)是查询中的查询。子查询可用于 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 子句仅支持返回内查询每次执行单个值的标量子查询。返回值可以对每行是唯一的。

语法

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)

此页面是否有帮助?

感谢您的反馈!


InfluxDB 3.8 新特性

InfluxDB 3.8 和 InfluxDB 3 Explorer 1.6 的主要增强功能。

查看博客文章

InfluxDB 3.8 现已适用于 Core 和 Enterprise 版本,同时发布了 InfluxDB 3 Explorer UI 的 1.6 版本。本次发布着重于操作成熟度,以及如何更轻松地部署、管理和可靠地运行 InfluxDB。

更多信息,请查看

InfluxDB Docker 的 latest 标签将指向 InfluxDB 3 Core

在 **2026 年 2 月 3 日**,InfluxDB Docker 镜像的 latest 标签将指向 InfluxDB 3 Core。为避免意外升级,请在您的 Docker 部署中使用特定的版本标签。

如果使用 Docker 来安装和运行 InfluxDB,latest 标签将指向 InfluxDB 3 Core。为避免意外升级,请在您的 Docker 部署中使用特定的版本标签。例如,如果使用 Docker 运行 InfluxDB v2,请将 latest 版本标签替换为 Docker pull 命令中的特定版本标签 — 例如

docker pull influxdb:2