我应该在此练习中使用什么联接? (自然加入或内部加入,他们给了我两个相同的答案)

时间:2018-10-22 19:22:20

标签: sql

所以我有以下练习

在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;

两个查询的输出都相同,问题是使用女巫连接更好吗?

2 个答案:

答案 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。内部联接版本可能需要您的范围变量ejs,但它们在自然联接中毫无用处。

因此:

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;