我正在研究子查询,但我对这个主题有一些疑问。有一些类型的子查询吗?我已经看到一些站点将子查询划分为“单行子查询、多列子查询、多列子查询”。其他人则认为这是这些类型的子查询“子查询作为一个新列,从子查询中选择数据,使用多个表进行子查询”。因此,Im对存在的子查询类型以及每种类型的工作方式有些困惑。您知道存在哪些类型的子查询以及它们之间的区别吗?或者你对这个话题有什么参考资料吗?谢谢!
发布于 2020-10-23 10:22:01
我不会叫他们不同类型的子查询..。子查询只是另一个查询中的任何查询。这可以以各种不同的方式应用。
例如,您可能需要一个列,该列使用返回单个结果的子查询显示每行的(相同)最大范围值:
SELECT ID, value
,(SELECT MAX(value) from TBL) AS MAX_VALUE
FROM TBL或者您可以加入子查询,就好像它是一个表/视图一样:
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还有无数其他的方法来使用子查询--但本质上,它只是一个较大查询中获取所需结果的任何查询。
就您的示例而言,任何查询都可以用于返回单个行、单个值或多个列,并且可以使用一个表、多个表或实际上没有表。子查询没有什么不同--它只是另一个查询的一部分。
发布于 2020-10-23 11:35:19
有不同类型的子查询。这取决于如何使用子查询和如何构造子查询。这里有一些例子。
一个非常重要的类型是标量子查询。这是一个子查询,它返回一个列,最多返回一行。标量子查询很重要,因为它可以在任何地方--或者几乎在任何地方--使用常量。因此,标量子查询可以替换常量,如1、'abc'或current_date。
(注意:一些数据库放宽了对某一列的限制。)
在FROM子句中,子查询返回派生表。返回的行或列的数目没有限制。
类似地,使用EXISTS和NOT EXISTS引入的子查询可以返回任意数量的行和列。
然后是IN和NOT IN。大多数数据库要求这些数据库只返回一个列(但不限制行数)。在这种情况下,一些数据库支持多列(“元组”)。
类似地--尽管不常见--子查询可以与使用ANY/SOME/ALL.的比较操作一起使用。它们也只能返回一个列(除非数据库支持元组)。
“子查询”的另一种用法值得一提。它们可以用于定义WITH引入的通用表表达式(CTEs)。
子查询也与横向连接一起使用。
最后,一些子查询引用外部查询中的列。这些是相关的子查询。通常,除了FROM子句之外,它们可以在任何地方使用--尽管横向联接是一个例外。
所有这些都应该在您正在使用的数据库的文档中讨论。
https://stackoverflow.com/questions/64497989
复制相似问题