不同类型的子查询
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.
类似地,使用 EXISTS
和 NOT EXISTS
引入的子查询可以 return 任意数量的行和列。
然后是IN
和NOT IN
。大多数数据库要求这些 return 只有一列(但对行数没有限制)。在这种情况下,一些数据库支持多列(“元组”)。
同样——尽管不太常见——子查询可以与使用 ANY
/SOME
/ALL
的比较操作一起使用。这些也只能 return 一列(除非数据库支持元组)。
“子查询”的另一个用途值得一提。它们可用于定义常见的 table 表达式 (CTE),由 WITH
.
引入
子查询也与横向连接一起使用。
最后,一些子查询引用外部查询中的列。这些是 相关子查询 。通常,它们可以在除 FROM
子句之外的任何地方使用——尽管横向连接是一个例外。
所有这些都应该包含在您正在使用的数据库的文档中。
我正在研究子查询,但我对这个主题有一些疑问。有几种类型的子查询?我已经看到一些站点将子查询分为“单行子查询、多列子查询、多列子查询”。其他人说这些类型的子查询“子查询作为新列,从子查询中选择数据,使用多个表的子查询”。所以,我对存在的子查询类型以及每种类型的工作方式有点困惑。您知道存在哪些类型的子查询以及它们之间的区别吗?或者你有关于这个主题的任何资源吗?谢谢!
我不会称它们为不同的 类型 子查询...子查询只是另一个查询中的任何查询。这可以以各种不同的方式应用。
例如,您可能需要一个列,该列使用 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.
类似地,使用 EXISTS
和 NOT EXISTS
引入的子查询可以 return 任意数量的行和列。
然后是IN
和NOT IN
。大多数数据库要求这些 return 只有一列(但对行数没有限制)。在这种情况下,一些数据库支持多列(“元组”)。
同样——尽管不太常见——子查询可以与使用 ANY
/SOME
/ALL
的比较操作一起使用。这些也只能 return 一列(除非数据库支持元组)。
“子查询”的另一个用途值得一提。它们可用于定义常见的 table 表达式 (CTE),由 WITH
.
子查询也与横向连接一起使用。
最后,一些子查询引用外部查询中的列。这些是 相关子查询 。通常,它们可以在除 FROM
子句之外的任何地方使用——尽管横向连接是一个例外。
所有这些都应该包含在您正在使用的数据库的文档中。