首页  >  文章  >  web前端  >  SQL中的内联视图方法和相关子查询

SQL中的内联视图方法和相关子查询

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-10-04 14:23:021013浏览

Inline View Method and the Correlated Subquery in SQL

让我们深入研究两种方法的执行流程:内联视图方法和相关子查询方法。了解这些查询的逐步执行将有助于阐明 SQL 如何处理每个场景以获得所需的结果。

  1. 内联视图方法执行流程

内联视图方法使用 FROM 子句中的子查询创建临时结果集(内联视图),然后在外部查询中对其进行处理。

查询:

选择部门 ID,MAX(薪水)作为最高薪水
来自 (
选择部门 ID、薪资
来自员工
) AS 内联视图
按部门 ID 分组;

执行步骤:

  1. 内部查询执行(内联视图):

首先执行内部查询(SELECT DepartmentId, Salary FROM Employee)。

它从 Employee 表中选择 DepartmentId 和 Salary 列。

此步骤本质上创建一个临时结果集(内联视图),其中包括 Employee 表中的所有行,但仅包含 DepartmentId 和 Salary 列。

内部查询结果示例:

  1. 外部查询执行(聚合和分组):

创建内联视图(临时结果集)后,外部查询会获取该结果集并使用 MAX(Salary) 函数进行聚合。

GROUP BY DepartmentId 确保计算每个部门的最高工资。

外部查询扫描内联视图中的行并根据 DepartmentId 对行进行分组。然后,它计算每个组的最高工资。

  1. 返回结果:

查询返回各部门的最高薪资。

最终结果:

执行流程摘要:

  1. 执行内部查询以创建内联视图。

  2. 外部查询聚合(使用 MAX)并按 DepartmentId 对结果进行分组。

  3. 返回最终结果。


  1. 相关子查询方法执行流程

在相关子查询方法中,内部子查询针对外部查询中的每一行执行,使其更加动态,但可能比内联视图方法慢。

查询:

选择部门 ID、员工 ID、薪资 AS HighestSalary
来自员工 e
工资 = (
选择最高(工资)
来自员工
WHERE DepartmentId = e.DepartmentId
);

执行步骤:

  1. 外部查询执行(逐行处理):

外部查询首先读取 Employee 表中的每一行。

对于 Employee 表中的每一行,查询都会检索 DepartmentId、EmployeeId 和 Salary。

外部查询的逐行处理示例:

  1. 内部查询执行(相关子查询):

对于外部查询中的每一行,都会执行内部查询 (SELECT MAX(Salary) FROM Employee WHERE DepartmentId = e.DepartmentId)。

子查询计算当前行DepartmentId对应的部门的最高工资。

外查询和子查询之间的关联是通过 DepartmentId 条件进行的 (WHERE DepartmentId = e.DepartmentId)。

例如:

对于 EmployeeId = 1 的行,子查询计算 DepartmentId = 101 的最高工资,即 6000。

对于 EmployeeId = 3 的行,子查询计算 DepartmentId = 102 的最高工资,即 7500。

每行子查询的执行示例:

  1. 过滤行:

计算出对应DepartmentId的最高工资后,外层查询将当前行的Salary与子查询返回的最高工资进行比较。

如果薪资与部门的最高薪资相符,则保留该行。

不匹配的行将被过滤掉。

例如:

EmployeeId = 2 的行将被保留,因为其工资 6000 与部门 101 的最高工资相匹配。

EmployeeId = 1 的行将被过滤掉,因为其薪资 5000 小于部门 101 的最高薪资。

  1. 返回结果:

外部查询返回员工工资与其部门最高工资相匹配的行。

最终结果:

执行流程摘要:

  1. 对于外部查询中的每一行,执行内部相关子查询。

  2. 子查询计算当前DepartmentId的最高工资。

  3. 将员工的工资与子查询的结果进行比较。

  4. 过滤并返回员工工资与其部门最高工资相匹配的行。


执行流程的主要差异:


性能注意事项:

当您只对每个部门的最高工资感兴趣,而不需要详细的员工信息时,内联视图方法会更有效。它在一次传递数据中执行聚合。

相关子查询方法对于大型数据集可能会较慢,因为它对外部查询中的每一行执行子查询,可能会导致许多冗余计算。但是,它允许您检索部门的最高工资和详细的员工信息(例如,EmployeeId、Name)。

以上是SQL中的内联视图方法和相关子查询的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn