所以我有以下练习
在SQL中编写查询以显示职位名称,员工的全名(名字和姓氏)以及该职位的最高薪水和该员工的薪水之间的差额。
自然加入
SELECT js.job_title,e.first_name || ' ' || e.last_name AS Employee_name,
js.max_salary-e.salary AS salary_difference
FROM employees e
NATURAL JOIN jobs js;
或具有内部联接
SELECT js.job_title, e.first_name , e.last_name AS Employee_name,
js.max_salary-e.salary AS salary_difference
FROM employees e
Inner JOIN jobs js
on e.job_id=js.job_id;
两个查询的输出都相同,问题是使用女巫连接更好吗?
答案 0 :(得分:0)
尝试像这样的子查询
SELECT js.job_title, e.first_name , e.last_name AS Employee_name, e.Salary
(Select Max(salary) from Jobs j where j.jobid = e.JobID )-e.salary AS salary_difference
FROM employees e
这将达到每条记录
答案 1 :(得分:0)
选择自然连接,更具表现力。这是您 需要的唯一联接。
它的优点是不生成重复的列-但仍可以生成重复的行,因此您需要指定SELECT DISTINCT
。内部联接版本可能需要您的范围变量e
和js
,但它们在自然联接中毫无用处。
因此:
SELECT DISTINCT job_title,
first_name || ' ' || last_name AS Employee_name,
max_salary - salary AS salary_difference
FROM employees
NATURAL JOIN jobs;
现在,您有时会听到人们说自然连接可能具有意外行为。如果您的employees
表中包含一个job_title
列(不太容易获取),那么您将获得截然不同的结果。因此,以下是超安全版本,它限制了所使用的列并针对添加到基础表中的列进行“防御性”编码:
WITH e AS ( SELECT first_name, last_name FROM employees ),
js AS ( SELECT job_title, max_salary FROM jobs )
SELECT DISTINCT job_title,
first_name || ' ' || last_name AS Employee_name,
max_salary - salary AS salary_difference
FROM e NATURAL JOIN js;