当有外键时提供 JOIN 条件有什么意义?

What is the point of providing a JOIN condition when there are foreign keys?

TL;DR:为什么我们必须添加 ON table1.column = table2.column


This question 粗略地问为什么我们需要外键,如果没有它们就可以正常工作。在这里,我想反问一下。给定最简单的数据库,如下所示:

CREATE TABLE class (
  class_id INT PRIMARY KEY,
  class_name VARCHAR(40)
);
CREATE TABLE student (
  student_id INT PRIMARY KEY,
  student_name VARCHAR(40),
  class_id INT,
  FOREIGN KEY(class_id) REFERENCES class(class_id) ON DELETE SET NULL
);

…和一个简单的连接,像这样:

SELECT student_id, student_name, class_name
FROM student
JOIN class
ON student.class_id = class.class_id;

…为什么我们不能省略 ON 子句?

SELECT student_id, student_name, class_name
FROM student
JOIN class;

对我来说,student 定义中的 FOREIGN KEY(class_id) REFERENCES class(class_id) … 行已经包含了 FROM student JOIN class 具有隐式 ON student.class_id = class.class_id 条件的所有必要信息;但我们仍然必须添加它。这是为什么?

  • 为此,您必须考虑 JOIN 操作。它不会检查您的两个 table 或集合是否有关系。因此,简单的无条件连接 (ON) 您将获得各种可能性的大结果。
  • ON 操作过滤以获得预期结果

JOIN条件是一个表达式,它指定了加工条件,在JOIN过程中被检查。只有在出现语法错误时才会导致失败。

FOREIGN KEY是数据一致性检查子系统的规则,在数据变化时进行检查。如果数据状态(中间 and/or 最终)与规则不匹配,将导致失败。

换句话说,它们之间没有任何共同点,完全不同,毫无关联。


I feel like I have to reiterate parts of the question. Please, give it a second read - Dima Parzhitsky

假设您的报价已被接受。我有桌子:

CREATE TABLE users (userid INT PRIMARY KEY);
CREATE TABLE messages (sender INT REFERENCES users (userid), 
                       receiver INT REFERENCES users (userid));

我写SELECT * FROM users JOIN messages.

加入条件必须使用什么参考?并证明你的假设...

重新发布 Damien_The_Unbeliever's comment 作为答案

  • 您不必加入外键;
  • 有时同一对表之间存在多个外键。

此外,SQL 是一种粗鲁的语言,对于最常见的用例没有很多捷径。