繁体   English   中英

结合使用WHERE子句和NATURAL JOIN SQL?

[英]Using the WHERE clause in conjunction with NATURAL JOIN SQL?

我正在阅读一本有关SQL的书,并且停留在一个与数据库架构相关的示例上,如下图所示。 数据库架构

下面的示例解决了本书中所述的查询:

假设我们希望回答查询“列出教师的姓名以及他们所教课程的标题。”查询可以用SQL编写,如下所示:

select name , title
from instructor natural join teaches , course
where teaches.course id = course.course id;

现在这本书说

“请注意,where子句中的teaching.course id指的是自然联接结果的课程ID字段,因为该字段又来自于teaches关系。”

本书再次以粗体指出:

“不可能使用包含原始关系名称的属性名称(例如,instructionor.name或teaches.course ID)来引用自然联接结果中的属性;但是,我们可以使用名称和课程ID等属性名称,没有关联名称。”

(请参阅上面的查询)如果不可能,那么作者怎么能够将查询写为

teaches.course id = course.course id

“如何教”课程指的是自然连接属性“课程”,作者如此模糊地提出了自己的观点。请向我解释作者的观点。

忽略书中关于NATURAL JOIN看法。 只是避免它。 NATURAL JOIN是一个等待发生的错误。 为什么? 只需通过在表中的列上命名约定即可定义连接键-使用任何碰巧具有相同名称的列。 实际上, NATURAL JOIN 忽略正确定义的FOREIGN KEY关系。 并且它们隐藏了实际用于匹配的键。

因此,应明确使用ONUSING子句。 这些明确说明了所使用的键,并且代码更易于理解和维护。

然后,遵循一个简单的规则: 永远不要FROM子句中使用逗号; 始终使用显式JOIN语法。

因此,编写查询的一种好方法是这样的:

select i.name, c.title
from instructor i inner join
     teaches t
     on t.instructor_id = i.instructor_id inner join
     course c
     on t.course_id = i.course_id;

请注意,没有where子句,并且所有列都是合格的,这意味着它们指定了它们所来自的表。

另外,我在示teaches表中看不到“ instructor_id列,因此,这只是合理代码的示例。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM