什么是相关子查询?为什么不相关的子查询有什么不同?为什么我们需要别名?

时间:2019-07-03 14:35:19

标签: sql correlated-subquery

我的问题

我对SQL中的子查询有疑问。

除其他外,我尝试检查是否了解相关子查询的原理,但还要了解别名在此查询中的用途。

为此,我将使用一个示例并尝试解释如何理解相关的子查询。


示例

以以下查询为例:

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');

从此查询中,我将外部查询和内部查询分开:

外部查询:

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'

我的理解

据我了解,这就是我们在这种情况下可以谈论相关子查询的原因:

在SQL中,查询是逐行完成的。他将为第1行选择,然后为第2行,然后选择第3行,依此类推。

由于在内部查询中,我使用C.custid(即,其值将由“我的外部查询”逐行读取的列),并将其与O.custid(整个列也必须是逐行读取)。

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

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

  1. 外部查询在我的C表中找到我的第一行的“ custid”和“ companyname”的值

  2. 内部查询将查看我的O TABLE的第一行

  3. 内部查询将比较C TABLE的第一行中的C.custid的值与O TABLE的第一行中的O.custid的值
  4. 内部查询将O TABLE的FIRST ROW中找到的O.orderdate的值与“ 20070212”进行比较。
  5. 内部查询将在我的O TABLE的下一行

  6. 内部查询将使用O TABLE的NEXT ROW(而不是O TABLE的FIRST ROW)重复步骤2至5,直到他到达O TABLE的末尾

  7. 外部查询将查看下一个ROW

  8. 将重复执行步骤2-7,但这一次,他们将O.custid与NEXT ROW中的C.custid的值进行比较,直到C TABLE结束


我的第二个问题

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

我们为什么要使用别名?

在上面的示例中,我们可以说这是因为我们使用两个表,每个表的名称相同。
但是,如果两个列都没有被都命名为“ custid”,那么别名的用途是什么?

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

因为不修改表,我很难理解相关子查询中别名的必要性。

注意: 我知道还可以通过使用Join来优化相关子查询,但是我真的想关注相关子查询的基础。 / em>


1 个答案:

答案 0 :(得分:0)

因此,显然,我对相关子查询的理解很好。

在不相关的子查询中:
内部查询将执行一次(总计)
但是在相关子查询中,它将对我的外部查询的每一行执行一次。

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