【问题标题】:What is the difference between implicit/explicit joins? [duplicate]隐式/显式连接有什么区别? [复制]
【发布时间】:2012-03-13 18:20:18
【问题描述】:

可能重复:
Explicit vs implicit SQL joins

我知道现在很多人会冲我大喊大叫。但据我了解

假设我有两张桌子

学生

student_id
firstname
surname

课程

course_id
name
student_id

所以课程表有一个外键STUDENT_ID,这意味着一个学生可以有很多课程是吗?

好的。

据我了解,如果我想选择与一个学生相关的所有课程,我可以执行以下任一操作:

SELECT * 
FROM courses AS c, students AS s 
WHERE c.student_id = s.student_id 
  AND s.student_id = 1;

SELECT * 
FROM courses AS c 
   JOIN students AS s ON c.student_id = s.student_id AND s.student_id = 1;

那么,当 JOIN 与 WHERE 基本完全相同时,JOIN 的意义何在?

我知道我的理解是错误的,但我找不到简单的答案。

请赐教!

【问题讨论】:

  • 没错,那些查询是同义词。在此处查找隐式连接与显式连接。还要更改您的问题的标题,这是不准确的。请注意,如果这是 INNER JOIN 的同义词,则不是 OUTER JOIN。
  • 我认为 OP 在联接和约束之间感到困惑,请参阅上面提到的案例了解联接和 where 子句之间的区别,并查看 Sapan 的答案以了解约束的使用。
  • @MitchWheat "鞋子有什么意义?"
  • @rrrr: 保护踩在头上的人的脚
  • @rrrr:其实我想说what's所指的名词是point而不是shoes,而point是单数而不是复数。因此,What is 应该是单数,而不是复数。 What are the purposes of shoes? 很好,但 What are the purpose of shoes? 似乎不正确。

标签: sql


【解决方案1】:

FOREIGN_KEY 在您尝试通过检查数据完整性来插入某些内容时让您的生活变得简单。从关系中检索数据时,它从来都不是为了帮助您。

例如如果您尝试在不存在此类课程的情况下插入具有course_id = 10 的学生,则外键约束将不允许您拥有这样的学生。

JOIN 与使用WHERE 完全相同。看看这个question

【讨论】:

  • 这回答了问题的标题。但是内容随后询问了使用,JOIN之间的区别。
  • @Dems 谢谢。更新了答案!
【解决方案2】:

简而言之:没有区别。

更长的解释:关系模型基于“笛卡尔积”。在查询中

SELECT a.x , b.y
FROM table_a a, table_b b
;

所有可能的行组合从 table_a 和 table_b 生成。如果 a 包含 10 行,b 包含 100 行,则您将获得 1000 行。您添加到 WHERE 子句的所有内容限制这些结果仅限于满足 WHERE 子句的行对。所以在

SELECT a.x , b.y, ...
FROM table_a a, table_b b
WHERE a.x = b.y
;

你会得到一切,除了 `NOT (a.x = b.y)' 的行

在实践中,有两种 WHERE 子句元素:一种是关联两个表的元素,另一种是比较列表达式和常量的元素。 JOIN 子句是一种指定第一种限制的方法。 存在一些细微的差异和复杂性(NULL、外连接),但目前这两种构造是等价的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-04
    • 1970-01-01
    • 1970-01-01
    • 2012-08-04
    • 2023-03-05
    • 2014-11-26
    • 2011-03-04
    相关资源
    最近更新 更多