SET操作和JOIN操作

时间:2012-12-04 14:09:34

标签: mysql

我正在阅读Learning SQL第2版的书。 SET操作与JOIN之间是否存在任何差异。在任何情况下,您都会SET操作离开JOIN

如果我错了,请纠正我,我们可以使用JOIN使用SET完成所有操作。

2 个答案:

答案 0 :(得分:2)

设置操作为UNIONINTERSECTEXCEPT。它们用于对具有相同模式的关系进行集合操作。例如:让R1R2属于以下架构:

R1 (A,B,C)
R2 (A,B,C)
  • R1 UNION R2 = R1R2中所有行的联合。

  • R1 INTERSECT R2 = R1R2中的常见行。

  • R1 EXCEPT R2 = R1R2以外的所有行。

请注意,我们对相同的模式关系使用集合操作,但我们可以对不同的模式关系使用连接操作,结果的模式是两个模式的并集。 (通常我们使用连接操作来连接两个或多个表。)

答案 1 :(得分:1)

不,您无法使用join执行所有可以对设置操作执行的操作。但是,如果两个表具有相同的结构在每个表上都有唯一标识符,那么您可以:

union将是:

select driver.id,
       coalesce(t1.col1, t2.col1) as col1,
       . . .  -- repeat this for all columns
from (select distinct coalesce(t1.id, t2.id) as id
      from ((select id
             from t1
            ) full outer join
            (select id
             from t2
            )
           )
     ) driver left outer join
     t1
     on t1.id = driver.id left outer join
     t2
     on t2.id = driver.id

exceptintersect可以采用相同的方式进行处理,但会在驱动程序表中的full outer join上添加条件。

实际上,您可以将此想法扩展为不需要唯一ID,只需假设每个表中的行都是唯一的。在这种情况下,连接更复杂,因为您必须包括所有列,并且还要考虑列中的NULL值。

尽管如此,set操作有几个优点:

  1. 它们更具可读性。您和其他所有人可能会同意unionunion all比上述查询更具可读性。
  2. SQL引擎了解设置操作,因此它们通常会更高效。
  3. 很容易在更复杂的SQL语句中产生一个微妙的错误,从根本上改变结果。例如,将上面的驱动程序表中的“完全外部联接”更改为“内部联接”是unionintersect之间的差异。