首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >什么是关联子查询?为什么它与不相关子查询不同?为什么我们需要Alias?

什么是关联子查询?为什么它与不相关子查询不同?为什么我们需要Alias?
EN

Stack Overflow用户
提问于 2019-07-03 14:35:19
回答 1查看 119关注 0票数 1

我的问题

关于SQL中的子查询,我有一个问题。

除其他外,我试图检查是否理解相关子查询的原理,但也了解这个别名的兴趣。

要做到这一点,我将使用一个例子,并试图解释我如何理解相关的子查询。

例句

以下列查询为例:

代码语言:javascript
复制
SELECT custid, companyname
FROM Sales.Customers AS C
WHERE EXISTS
(SELECT *
FROM Sales.Orders AS O
WHERE O.custid = C.custid
AND O.orderdate = '20070212');

从这个查询中,我分离了外部查询和内部查询:

外部查询:

代码语言:javascript
复制
SELECT custid, companyname
FROM Sales.Customers AS C
WHERE EXISTS

内部查询:

代码语言:javascript
复制
SELECT *
FROM Sales.Orders AS O
WHERE O.custid = C.custid
AND O.orderdate = '20070212'

我的理解

据我所知,这就是我们可以在本例中讨论关联子查询的原因:

在中,查询是逐行执行的。将为第1行、第2行、第3行等进行选择。

因为在我的内部查询中,我使用C.custid (即外部查询将逐行读取其值的列),并将其与O.custid (也必须逐行读取的整个列)进行比较。

这个查询需要首先检查O数组的所有行,然后再转到C数组的下一行。因此,这是一个相关的SubQuery.。

换句话说,查询将按以下方式执行:

  1. 外部查询为我的C表中的第一行找到了“Outer”和"companyname“的值。
  2. 内部查询将查看我的O表的第一行
  3. 内部查询将比较C表第一行中找到的C.custid值和O表第一行中找到的O.custid值
  4. 内部查询将在O表的第一行中找到的O.orderdate值与'20070212‘进行比较。
  5. 内部查询将位于我的O表的下一行
  6. 内部查询将对O表的下一行而不是O表的第一行重复步骤2至5,直到他到达O表的末尾
  7. 外部查询将查看下一行
  8. 步骤2-7将重复,但这次,他们将把O.custid与下一行中的C.custid值进行比较,直到C表的末尾。

我的第二个问题

现在,如果我正确理解了关联子查询的原理。我问自己的问题是:

为什么我们要使用别名?

在上面的例子中,我们可以说这是因为我们使用两个表,每个表都有一个同名的列。

但是,如果这两列都不会被命名为“of”,那么别名的效用是什么呢?

是因为"SELECT“命令以某种方式修改了表吗?

因为如果没有修改表,我就很难理解关联子查询中别名的必要性。

注意:我知道关联子查询也可以通过使用Join进行优化,但是我真的想把焦点放在关联SubQuery的基础上。

EN

回答 1

Stack Overflow用户

发布于 2019-07-04 07:19:56

所以,显然,我对相关子查询的理解是很好的。

不相关子查询中的 :

内部查询将执行一次(总计)

但是在关联子查询中,它将对外部查询的每一行执行一次.

但是,我仍然不知道为什么需要别名。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56872477

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档