我正在学习Oracle SQL,现在我仍然坚持加入章节.我无法理解Join和Natural Join之间的区别
SELECT employee_id, job_id, department_id, e.last_name, e.hire_date, j.end_date FROM employees e NATURAL JOIN job_history j;
176 SA_REP 80 Taylor 24/03/2006 31/12/2006
SELECT e.employee_id, e.job_id, e.department_id, e.last_name, e.hire_date, j.end_date FROM employees e JOIN job_history j ON (e.department_id = j.department_id) ORDER BY employee_id, last_name; 172 SA_REP 80 Bates 24/03/2007 31/12/2006 173 SA_REP 80 Kumar 21/04/2008 31/12/2007 173 SA_REP 80 Kumar 21/04/2008 31/12/2006 174 SA_REP 80 Abel 11/05/2004 31/12/2007 174 SA_REP 80 Abel 11/05/2004 31/12/2006 175 SA_REP 80 Hutton 19/03/2005 31/12/2007 175 SA_REP 80 Hutton 19/03/2005 31/12/2006 176 SA_REP 80 Taylor 24/03/2006 31/12/2007 176 SA_REP 80 Taylor 24/03/2006 31/12/2006 177 SA_REP 80 Livingston 23/04/2006 31/12/2007 177 SA_REP 80 Livingston 23/04/2006 31/12/2006
如果Join和Natural Join都具有相似的功能,我不知道为什么会收到不同的结果.
不要用natural join
.这是一个等待发生的错误.
explicit join
有一个on
子句,列出了表之间匹配的条件.在您的示例中,department_id
用于此目的(尽管其他列可能可用).
该using
条款是另一个非常有用的选择.你用它作为:
FROM employees e JOIN job_history j USING (department_id)
它department_id
在两个表中都找到并用于连接条件.
NATURAL JOIN
JOIN
为表中相同的所有列添加条件.在您的情况下,这将是department_id
加上其他列.
问题 - 正如您所遇到的 - 是您不知道使用哪些列join
.更糟糕的是,不使用显式外键引用.
因为您的查询没有指定发生了什么,所以存在很多错误和错误的余地.没有实际需要NATURAL JOIN
,所以你也可以学会使用ON
和USING
.