子查询和相关子查询的区别

Posted

技术标签:

【中文标题】子查询和相关子查询的区别【英文标题】:Difference between Subquery and Correlated Subquery 【发布时间】:2013-06-20 13:38:53 【问题描述】:

以下 SQL 查询是普通查询还是相关子查询??

SELECT UserID,
       FirstName,
       LastName,
       DOB,
       GFName,
       GLName,
       LoginName,
       LoginEffectiveDate,
       LoginExpiryDate,
       Password,
       Email,
       ReportingTo,
       Mobile,
       CommunicationPreference,
       IsActive
FROM   (SELECT row_number() OVER (ORDER BY FirstName) AS Row,
               UserID,
               FirstName,
               LastName,
               DOB,
               GFName,
               GLName,
               LoginName,
               LoginEffectiveDate,
               LoginExpiryDate,
               Password,
               Email,
               ReportingTo,
               Mobile,
               CommunicationPreference,
               IsActive
        FROM   DivakarUserRegistration)  T

还有,谁能说出两者的区别

【问题讨论】:

这实际上是一个derived table。顺便说一句,您未能复制/粘贴右括号和派生表的别名。 【参考方案1】:

上面的例子不是 Co-related Sub-Query。它是派生表/内联视图,即 FROM 子句中的子查询。

一个相关的子查询应该引用它的父(主查询)表。例如通过 Co-related Sub-query 查找第 N 个最高薪水:

SELECT Salary 
FROM Employee E1
WHERE N-1 = (SELECT COUNT(*)
             FROM Employee E2
             WHERE E1.salary <E2.Salary) 

共同相关与嵌套子查询。

Normal Sub-query 和 Co-related sub-query 的技术区别是:

1.循环: main-query下的关联子查询循环;而不是嵌套的;因此,相关的子查询在主查询的每次迭代中执行。而在嵌套查询的情况下;子查询首先执行,然后外部查询接下来执行。因此,最大数量。相关子查询的执行次数为 NXM,子查询的执行次数为 N+M。

2。依赖关系(从内到外 vs 从外到内): 在关联子查询的情况下,内部查询依赖于外部查询进行处理,而在普通子查询中,外部查询依赖于内部查询。

3.性能: 使用 Co-related 子查询性能会降低,因为它执行 NXM 迭代而不是 N+M 迭代。 ¨ 关联子查询执行。

有关示例的更多信息:

http://dotnetauthorities.blogspot.in/2013/12/Microsoft-SQL-Server-Training-Online-Learning-Classes-Sql-Sub-Queries-Nested-Co-related.html

【讨论】:

@nayeemDotNetAutorities “上面的例子不是共同相关的子查询”?上面是什么?如果它与其他答案有关,请不要在回答另一个答案时使用此类相对术语。因为现在可能上面的内容可能会在以后改变。 以上示例 = OP 的查询...通常,答案指的是问题,有时指的是其他答案,但指的是拥有该答案的人... 什么是NXM?>>>>【参考方案2】:

相关子查询是使用来自外部查询的值的子查询。在这种情况下,必须为外部查询的每一行执行内部查询。

在此处查看示例http://en.wikipedia.org/wiki/Correlated_subquery

简单子查询不使用外部查询中的值,并且只计算一次:

SELECT id, first_name 
FROM student_details 
WHERE id IN (SELECT student_id
FROM student_subjects 
WHERE subject= 'Science'); 

相关子查询示例 -

查询以查找其部门工资高于平均水平的所有员工

 SELECT employee_number, name
       FROM employees emp
       WHERE salary > (
         SELECT AVG(salary)
           FROM employees
           WHERE department = emp.department);

【讨论】:

听同事说是关联子查询。但我无法理解如何,因为内部查询是独立运行的。那么,我的查询是相关子查询还是普通子查询? 那里没有相关的子查询 我在提供的示例中没有看到相关的子查询。 这是一个简单的子查询,在示例中提供,您可以在 wiki-link 之后找到相关的子查询。请原谅我的回答有点乱 "在这种情况下,必须为外部查询的每一行执行内部查询" - 请注意,这是逻辑上执行的方式.如果可能,大多数现代优化器可能会将相关的子查询重写为连接(从而避免昂贵的逐行执行子查询)【参考方案3】:

子查询是嵌入在另一个 select 语句的子句中的 select 语句。

前:

select ename, sal 
from emp  where sal > (select sal 
                       from emp where ename ='FORD');

关联子查询是对外部查询或主查询处理的每一行计算一次的子查询。根据外部查询获取的值执行内部查询,主查询返回的所有值都匹配。 INNER Query 由 OUTER Query 驱动。

例如:

select empno,sal,deptid 
from emp e 
where sal=(select avg(sal) 
           from emp where deptid=e.deptid);

区别

内部查询首先执行并找到一个值,外部查询使用来自内部查询(子查询)的值执行一次

通过外部查询获取,使用外部查询的值执行内部查询,使用内部查询产生的值来限定或取消外部查询(相关)

更多信息: http://www.oraclegeneration.com/2014/01/sql-interview-questions.html

【讨论】:

【参考方案4】:

相关子查询:针对主查询处理的每一行进行评估。根据外部查询获取的值执行内部查询。继续直到主查询返回的所有值都匹配。 INNER Query 由 OUTER Query 驱动

例如:

SELECT empno,fname,sal,deptid FROM emp e WHERE sal=(SELECT AVG(sal) FROM emp WHERE deptid=e.deptid)

Correlated 子查询专门为每个部门计算 AVG(sal)

SUBQUERY:首先运行,执行一次,返回主查询使用的值。外部查询由内部查询驱动

【讨论】:

【参考方案5】:

子查询和关联查询都有内部查询和外部查询,唯一的区别是子查询内部查询不依赖外部查询,而关联内部查询依赖外部查询。

【讨论】:

【参考方案6】:

我认为下面的解释会对你有所帮助.. 它们之间的区别: Correlated subquery 是主查询(外查询)引用的内查询,因此内查询被视为重复执行。

non-correlated subquery 是一个独立于外部查询的子查询,它可以独立执行而不依赖于主外部查询。

plain subquery不依赖外层查询,

【讨论】:

听同事说是关联子查询。但我无法理解如何,因为内部查询是独立运行的。那么,我的查询是相关子查询还是普通子查询?【参考方案7】:

在 SQL 查询中,如果内部查询针对外部查询的每一行执行。如果内层查询执行一次,结果被外层查询消费,则称为非关联查询。

Correlated sub-queries usually correspond to normal join queries, i.e. join queries that have no sub-queries, and can usually be expressed as such. It is sometimes recommended that they are translated into such join queries, because most SQL DBMSs will execute them .....

【讨论】:

以上是关于子查询和相关子查询的区别的主要内容,如果未能解决你的问题,请参考以下文章

相关子查询 与 嵌套子查询 有何区别 ?

SQL相关子查询和嵌套子查询的区别

sql子查询和连接查询的区别是啥呢?

SQL嵌套子查询和相关子查询的执行过程有啥区别

SQL嵌套子查询和相关子查询的执行过程有啥区别

子查询(嵌套子查询)