您好,我不了解相关子查询在后台的工作方式。我有两个表,我想检查两个值是否相等,如果第二个表中的某个值等于第二个表中的值,则第二个表的值。 我的代码是:
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对员工是否正确 反对,它究竟是如何工作的? 它是否遍历每个值并将值传递给别名。对象?
假设内部查询的值为 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
WHERE
子句对表中的每一行执行一次employees
。
如果有员工的收入为 2500 但min_salary他的job_id怎么办 会是2000年吗?
对于这种情况,子查询:
SELECT min_salary FROM jobs WHERE employees.job_id = jobs.job_id
将返回2000
并且WHERE
子句中的布尔表达式将被FALSE
,因为2500 <> 2000
该员工将从结果中筛选出来。
每行employees
和jobs
之间的链接是列job_id
。
对于employees
中的每个job_id
,表jobs
一次又一次地扫描以获取相应的min_salary
,并且该值(必须是唯一的,我假设它在名为jobs
的表中是唯一的)与employees
的列salary
进行比较。
这个查询也可以通过一个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;
由于您在问题中提到了别名,因此请使用它们来限定所有列,即使您知道对于某些列,没有其他具有相同名称的列。还可以使用短别名使代码更短且更具可读性。