MySQL 相关子查询与别名

问题描述

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

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

解决方法

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

如果有一个员工的收入为 2500 但他的 job_id 为 min_salary 怎么办 会是 2000 年吗?

对于这种情况,子查询:

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

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

每行 employeesjobs 之间的链接是列 job_id

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

这个查询也可以用 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;

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...