2012-07-30 83 views
47

只是玩弄查询和示例,以更好地理解连接。我注意到,在SQL Server 2008中,以下两个查询得到同样的结果:全外连接与全连接

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

SELECT * FROM TableA 
FULL JOIN TableB 
ON TableA.name = TableB.name 

难道这些执行完全相同的动作,以产生相同的结果,否则我就碰上不同的结果在一个更复杂的例子?这只是可互换的术语吗?

+0

是的,这两个查询在SQL Server 2008 R2中给出了相同的结果。 – CptSupermrkt 2012-07-30 03:05:07

回答

56

其实它们是一样的。 LEFT OUTER JOINLEFT JOIN相同,而RIGHT OUTER JOINRIGHT JOIN相同。这是比较从INNER Join更多信息的方式。

有关详细信息,请参阅此Wikipedia article

+2

完美,谢谢。我遇到的很多教程都是根据自己的风格使用这些教程,但没有注意到它们是相同的。 – CptSupermrkt 2012-07-30 03:11:29

+1

我认为你应该改正这一点。几乎所有的DBMS都理解'OUTER'关键字。至少Postgres,Oracle,MySQL,SQLite,DB2甚至Access。其实我知道没有不接受它的DBMS。 – 2013-05-11 16:46:20

+1

连接的可视化表示:http://www.codeproject.com/Articles/33052/Visual-Representation-of-SQL-Joins – 2013-11-12 00:30:47

20

微软的SQL Server™2000使用这些SQL-92关键字外连接在指定FROM子句 :

  • LEFT OUTER JOIN或LEFT JOIN

  • RIGHT OUTER JOIN或RIGHT JOIN

  • FULL OUTER JOIN或FULL JOIN

MSDN

full outer joinfull join返回两个表中的所有行,匹配了地方匹配就可以制备和在没有匹配的行存在的地方放置NULL S中的行。

5

确实有些数据库识别出OUTER关键字。有些不。 确认后,通常是可选关键字。 几乎总是,FULL JOIN和FULL OUTER JOIN完全一样。 (我想不出一个他们没有的例子,其他人可以想到一个吗?)

这可能会让你想知道,“如果它没有意义,它甚至会成为一个关键字?”答案归结为编程风格。

在过去,程序员努力使自己的代码尽可能紧凑。每个角色意味着更长的处理时间我们使用了1,2和3个字母变量。我们用了2位数的年份。我们消除了所有不必要的空白。有些人仍然这样编程。这不再是处理时间。这更多的是关于快速编码。

现代程序员正在学习使用更多的描述性变量,并将更多的注释和文档放入其代码中。使用额外的单词如OUTER,确保阅读代码的其他人可以更容易地理解它。将会有更少的歧义。这种风格对于将来必须维护代码的人来说更具可读性和友善性。