我对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数组的下一行。因此,这是一个相关的子查询。
换句话说,查询将按以下方式执行:
外部查询在我的C表中找到我的第一行的“ custid”和“ companyname”的值
内部查询将查看我的O TABLE的第一行
内部查询将在我的O TABLE的下一行
内部查询将使用O TABLE的NEXT ROW(而不是O TABLE的FIRST ROW)重复步骤2至5,直到他到达O TABLE的末尾
外部查询将查看下一个ROW
将重复执行步骤2-7,但这一次,他们将O.custid与NEXT ROW中的C.custid的值进行比较,直到C TABLE结束
现在,如果我正确理解了相关子查询的原理。 我问自己的问题是:
我们为什么要使用别名?
在上面的示例中,我们可以说这是因为我们使用两个表,每个表的名称相同。
但是,如果两个列都没有被都命名为“ custid”,那么别名的用途是什么?
是因为“ SELECT”命令以某种方式修改了表吗?
因为不修改表,我很难理解相关子查询中别名的必要性。
注意: 我知道还可以通过使用Join来优化相关子查询,但是我真的想关注相关子查询的基础。 / em>
答案 0 :(得分:0)
因此,显然,我对相关子查询的理解很好。
在不相关的子查询中:
内部查询将执行一次(总计)
但是在相关子查询中,它将对我的外部查询的每一行执行一次。
但是,我仍然不知道为什么需要别名。