9

我一直认为 SQL 中的 Join 是两个表之间的某种链接。

例如,

select e.name, d.name from employees e, departments d 
  where employees.deptID = departments.deptID

在这种情况下,它链接两个表,以显示每个员工的部门名称而不是部门 ID。有点像“联动”或“联合”。

但是,在了解了inner join vs outer join之后,发现Join(Inner join)其实是一个交集。

例如,当一张表的 ID 为 1、2、7、8,而另一张表的 ID 为 7 和 8 时,我们得到交集的方式是:

select * from t1, t2 where t1.ID = t2.ID

得到“7和8”两条记录。所以它实际上是一个交叉点。

所以我们有两个表的“交集”。将此与 2 个表上的“联合”操作进行比较。可以将 Join 视为“交叉点”吗?但是它的“链接”或“横向联合”方面呢?

4

4 回答 4

6

你在正确的轨道上;an 返回的行INNER JOIN是那些满足连接条件的行。但这就像一个交集,只是因为您在连接条件中使用了相等,适用于每个表中的列。

另请注意,这INTERSECTION已经是一个 SQL 操作,它还有另一个含义——它与JOIN.

SQLJOIN可以生成一种新类型的行,其中包含两个连接表中的所有列。例如:col4、col5 和 col6 不存在于表 A 中,但它们确实存在于与表 B 的连接结果中:

SELECT a.col1, a.col2, a.col3, b.col4, b.col5, b.col6
FROM A INNER JOIN B ON a.col2=b.col5;

SQLINTERSECTION返回两个单独的表共有的行,这两个表必须已经具有相同的列。

SELECT col1, col2, col3 FROM A
INTERSECT
SELECT col1, col2, col3 FROM B;

这恰好产生与以下连接相同的结果:

SELECT a.col1, a.col2, a.col3
FROM A INNER JOIN B ON a.col1=b.col1 AND a.col2=b.col2 AND a.col3=b.col3;

不是每个品牌的数据库都支持INTERSECTION运营商。

于 2010-04-24T21:03:08.990 回答
2

连接“链接”或 erm... 连接两个表中的行。我认为这就是您所说的“横向联合”的意思,尽管我个人认为这是一种糟糕的表达方式。但是有不同类型的连接做的事情略有不同:

  • 内连接确实是一个交集。
  • 全外连接是联合。

Jeff Atwood 博客上的这个页面描述了其他可能性。

于 2010-04-24T20:49:42.847 回答
0

外部连接 - 与联合或联合全部无关。

例如,“null”不会作为 Union 或 Union All 操作的结果出现,而是由 Outer Join 产生。

于 2015-07-04T05:31:06.210 回答
0

INNER JOIN将两个NULLs 视为两个不同的值。因此,如果您基于可为空的列进行连接,并且两个表NULL在该列中都有值,INNER JOIN则将忽略这些行。

因此,要正确检索两个表之间的所有公共行,INTERSECT应该使用。INTERSECT将两个NULLs 视为相同的值。

示例(SQLite):

创建两个具有可为空列的表:

CREATE TABLE Table1 (id INT, firstName TEXT);
CREATE TABLE Table2 (id INT, firstName TEXT);

插入NULL值:

INSERT INTO Table1 VALUES (1, NULL);
INSERT INTO Table2 VALUES (1, NULL);

使用检索公共行INNER JOIN(这显示没有输出):

SELECT * FROM Table1 INNER JOIN Table2 ON 
    Table1.id=Table2.id AND Table1.firstName=Table2.firstName;

使用检索公共行INTERSECT(这正确显示了公共行):

SELECT * FROM Table1 INTERSECT SELECT * FROM Table2;

结论:

尽管很多时候两者INTERSECTINNER JOIN都可以用来获得相同的结果,但它们并不相同,应根据情况进行选择。

于 2016-06-07T05:56:53.677 回答