在SQL中,Join实际上是一个交集?它也是一个联系或"Sideway联盟"?

nop*_*ole 9 mysql sql union join intersection

我一直认为加入SQL是两个表之间的某种联系.

例如,

select e.name, d.name from employees e, departments d 
  where employees.deptID = departments.deptID
Run Code Online (Sandbox Code Playgroud)

在这种情况下,它链接两个表,以向每个员工显示部门名称而不是部门ID.有点像"联动"或"联盟"侧面".

但是,在了解了内连接与外连接之后,它表明连接(内连接)实际上是一个交集.

例如,当一个表具有ID 1,2,7,8时,而另一个表仅具有ID 7和8,我们获得交集的方式是:

select * from t1, t2 where t1.ID = t2.ID
Run Code Online (Sandbox Code Playgroud)

获得"7和8"的两个记录.所以它实际上是一个交集.

所以我们有2个表的"交集".将其与2个表上的"Union"操作进行比较.Join可以被认为是"交叉点"吗?但是它的"连接"或"侧向联合"方面呢?

Bil*_*win 5

你走在正确的轨道上; a返回的行INNER JOIN是满足连接条件的行.但这只是一个交集,因为你在连接条件中使用相等,应用于每个表的列.

还要注意,INTERSECTION它已经是一个SQL操作,它有另一个含义 - 它与它不一样JOIN.

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

SELECT a.col1, a.col2, a.col3, b.col4, b.col5, b.col6
FROM A INNER JOIN B ON a.col2=b.col5;
Run Code Online (Sandbox Code Playgroud)

SQL INTERSECTION返回两个独立表共有的行,这些表必须已经具有相同的列.

SELECT col1, col2, col3 FROM A
INTERSECT
SELECT col1, col2, col3 FROM B;
Run Code Online (Sandbox Code Playgroud)

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

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;
Run Code Online (Sandbox Code Playgroud)

并非每个品牌的数据库都支持INTERSECTION运营商.


Mar*_*ers 2

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

  • 内连接确实是一个交集。
  • 完整外部联接是联合。

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