【问题标题】:Using the WHERE clause in conjunction with NATURAL JOIN SQL?将 WHERE 子句与 NATURAL JOIN SQL 结合使用?
【发布时间】:2016-04-30 12:12:19
【问题描述】:

我正在阅读一本关于 SQL 的书,但我被困在一个与数据库模式相关的示例上,如下图所示。

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

假设我们希望回答“列出教师姓名”的查询 以及他们教授的课程的名称。”查询可以写成 SQL如下:

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

现在这本书说

" 请注意,teacher.course id 在 where 子句中指的是自然连接结果的课程 id 字段,因为该字段又来自于teacher 关系。 "

这本书再次用粗体表示:

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

(参考上面的查询)如果不可能,那么作者怎么能把查询写成

teaches.course id = course.course id

teacher.course怎么能引用自然连接属性“Course”,作者的论点太含糊了。请解释一下作者的观点。

【问题讨论】:

  • SQL Server 不支持NATURAL JOIN,所以问题不能与那个数据库有关。
  • 这个问题是关于 sql 语言的一般问题,而不是关于 sql server。我刚刚将它用作附加标签。
  • from instructor natural join teaches , course 我想说:烧掉这本书! natural join 通常被认为是邪恶的,与旧式逗号结合起来就面目全非。

标签: mysql sql join


【解决方案1】:

忽略书中关于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 列,所以这只是合理代码的示例。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-05
    • 2021-09-29
    • 1970-01-01
    • 2017-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-16
    相关资源
    最近更新 更多