“LEFT JOIN TableB ON TableA.name = TableB.name”中“TableB”的任何值?

时间:2012-04-11 22:48:16

标签: mysql sql

所有

我正在审核一些基本的MySQL JOIN教程。 Jeff Atwood gives an example在他的博客上就是这样的:

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

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

我不是要试图引发任何关于SQL语言效率的麻烦,我只是想了解这个提及TableB是否会带来任何新信息,在这种情况下或其他方面。

2 个答案:

答案 0 :(得分:2)

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

例如,假设您想加入TableATableBFooBar,其中TableA只有Foo的ciolumn只有TableB有一个名为Bar的列。然后你可以这样写:

SELECT * FROM TableA 
  LEFT OUTER JOIN TableB 
  ON Foo = Bar

答案 1 :(得分: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'?这只是令人困惑;更好的是明确和权威。