1

全部,

我正在查看一些基本的 MySQLJOIN教程。杰夫阿特伍德在他的博客上给出了一个例子,如下所示:

SELECT * FROM TableA
LEFT OUTER JOIN TableB
ON TableA.name = TableB.name

在我看来,从语义的角度来看,查询不需要TableB第二行的提及。我理解正确吗?在我看来,所有信息都已在第 3 行中可用。

我并不是想对 SQL 语言的效率提出任何类型的麻烦,我只是想了解TableB在这种情况下还是在其他情况下,提到这一点是否会带来任何新信息。

4

2 回答 2

2

TableB仅出现在第三行,因为您要加入的列不是唯一命名的。

例如,假设您想在列和上加入TableA和,其中只有一个名为 ciolum的列,并且只有一个名为 的列。然后你可以这样写:TableBFooBarTableAFooTableBBar

SELECT * FROM TableA 
  LEFT OUTER JOIN TableB 
  ON Foo = Bar
于 2012-04-11T22:53:34.630 回答
2

它不会带来新信息,但确实会带来精确度和为表命名的能力:

SELECT a.* FROM TableA a
LEFT OUTER JOIN TableBWhichHasAReallyLongUnweildyName b
ON a.name = b.name

请注意,在这个公式中,我既可以明确要求 a 中的数据,也可以在第 3 行中更容易地计算出连接。但是,编译器不会有非任意的指导来获取关于使用哪个表的信息除非我明确声明。考虑一下这是否是 SQL 的工作方式:

SELECT b.* FROM TableA a
LEFT OUTER JOIN 
ON TableA.name = TableB.name b
WHERE TableB.value v > 1

我是说 tableB 别名为“b”,还是 TableB.name 别名为“b”?这只是令人困惑;最好是明确和权威的。

于 2012-04-11T22:53:58.633 回答