【问题标题】:MySQL correlated subqueries with aliasesMySQL 将子查询与别名相关联
【发布时间】:2021-04-17 04:48:43
【问题描述】:

您好,我不明白相关子查询是如何工作的。我有两个表,如果第一个表中的某个值等于第二个表中的值,我想检查两个值是否相等。 我的代码是:

SELECT first_name, last_name, salary 
FROM employees 
WHERE employees.salary = (SELECT min_salary
FROM jobs
WHERE employees.job_id = jobs.job_id);

在比较外部查询中的薪水时,它如何知道 job_id 对于员工对象是否正确? 它是否遍历每个值并将值传递给 alias.Object?

假设内部查询的值为 2500。如果有员工的收入为 2500,但他的 job_id 的 min_salary 为 2000,该怎么办?此查询如何知道何时正确?

如果有人需要更多详细信息,那么这里的一切都会得到更好的解释: https://www.w3resource.com/mysql-exercises/subquery-exercises/find-the-names-salary-of-the-employees-whose-salary-is-equal-to-the-minimum-salary-for-their-job-grade.php

【问题讨论】:

    标签: mysql correlated-subquery


    【解决方案1】:

    WHERE 子句对employees 表中的每一行执行一次。

    如果有员工挣 2500 但他的 job_id 的 min_salary 怎么办 会是 2000 年吗?

    对于这种情况,子查询:

    SELECT min_salary FROM jobs WHERE employees.job_id = jobs.job_id 
    

    将返回2000WHERE 子句中的布尔表达式将为FALSE,因为2500 <> 2000 并且该员工将从结果中被过滤掉。

    employeesjobs 的每一行之间的链接是job_id 列。

    对于employees 中的每个job_id,表jobs 被一次又一次地扫描以获取相应的min_salary 和这个值(它必须是唯一的,我假设它在名为jobs 的表中是唯一的) 与employeessalary 列进行比较。

    这个查询也可以通过INNER 连接来实现,我相信它更清楚发生了什么:

    SELECT e.first_name, e.last_name, e.salary 
    FROM employees e INNER JOIN jobs j
    ON j.job_id = e.job_id AND j.min_salary = e.salary;
    

    由于您在问题中提到了别名,因此请使用它们来限定所有列,即使您知道对于某些列没有其他同名的列。还可以使用短别名来使代码更短、更易读。

    【讨论】:

    • 所以它在为每个值执行时正确设置值?我的意思是我们显然没有看到,但是查询就像 2500 = (SELECT...) 然后它在子查询中搜索该记录的相应值,该记录的薪水已经设置为 WHERE 语句的第一部分?所以就像你说的 2500 = 2000 这是错误的。我说得对吗?
    • @jokonoo 是的。这就是它的工作原理,适用于每一行员工。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-20
    • 1970-01-01
    • 2020-06-06
    • 2019-03-09
    • 1970-01-01
    • 1970-01-01
    • 2021-03-24
    相关资源
    最近更新 更多