不同类型的子查询

Different types of subqueries

我正在研究子查询,但我对这个主题有一些疑问。有几种类型的子查询?我已经看到一些站点将子查询分为“单行子查询、多列子查询、多列子查询”。其他人说这些类型的子查询“子查询作为新列,从子查询中选择数据,使用多个表的子查询”。所以,我对存在的子查询类型以及每种类型的工作方式有点困惑。您知道存在哪些类型的子查询以及它们之间的区别吗?或者你有关于这个主题的任何资源吗?谢谢!

我不会称它们为不同的 类型 子查询...子查询只是另一个查询中的任何查询。这可以以各种不同的方式应用。

例如,您可能需要一个列,该列使用 return 单个结果的子查询显示每行的(相同)最大范围值:

SELECT ID, value
,(SELECT MAX(value) from TBL) AS MAX_VALUE
FROM TBL

或者您可以加入一个子查询,就好像它是一个 table/ 视图,例如:

SELECT *
FROM A
JOIN (
      SELECT B.col1, C.col2
      FROM B
      JOIN C on B.ID = C.ID
      WHERE B.col3 = 2
     ) SUB on A.col1 = SUB.col1

有无数其他方法可以使用子查询 - 但本质上它只是在更大的查询中获取所需结果的任何查询。

就您的示例而言 - 任何 查询可用于 return 单行、单值或多列 - 并且可以使用一个 table,或多个 table 或实际上没有 table。子查询没有什么不同 - 它只是构成另一个查询的一部分。

有不同类型的子查询。这些取决于子查询的使用方式以及子查询的构造方式。这里有一些例子。

一个非常重要的类型是标量子查询。这是一个 return 一列最多一行的子查询。标量子查询很重要,因为它可以用在任何地方——或几乎任何地方——可以使用常量的地方。因此,标量子查询可以替换常量,例如 1'abc'current_date.

(注:部分数据库放宽了对一列的限制。)

FROM 子句中,子查询 return 派生 table。行数或列数没有限制 returned.

类似地,使用 EXISTSNOT EXISTS 引入的子查询可以 return 任意数量的行和列。

然后是INNOT IN。大多数数据库要求这些 return 只有一列(但对行数没有限制)。在这种情况下,一些数据库支持多列(“元组”)。

同样——尽管不太常见——子查询可以与使用 ANY/SOME/ALL 的比较操作一起使用。这些也只能 return 一列(除非数据库支持元组)。

“子查询”的另一个用途值得一提。它们可用于定义常见的 table 表达式 (CTE),由 WITH.

引入

子查询也与横向连接一起使用。

最后,一些子查询引用外部查询中的列。这些是 相关子查询 。通常,它们可以在除 FROM 子句之外的任何地方使用——尽管横向连接是一个例外。

所有这些都应该包含在您正在使用的数据库的文档中。