2011-11-16 56 views
0
SELECT * FROM left_table OUTER JOIN right_table on left_table.name = righ 
t_table.name; 

SELECT * FROM left_table FULL OUTER JOIN right_table on left_table.name = 
right_table.name; 

这2个语句给出了下面的错误。它们不是有效的mysql语句吗?Mysql加入澄清

ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that 
corresponds to your MySQL server version for the right syntax to use near 'OUTER 
JOIN right_table on left_table.name = right_table.name' at line 1 


mysql> SELECT * FROM left_table RIGHT OUTER JOIN right_table on left_table.name 
= right_table.name; 

mysql> SELECT * FROM left_table RIGHT JOIN right_table on left_table.name 
= right_table.name; 

给予同样的结果。那么添加OUTER语句的基本用法是什么?

我想知道它是什么特殊的目的,通过添加OUTER语句中,而不添加它也返回相同的输出。

---- ----更新

好吧,我把我的表结构

mysql> select * from left_table; 
+----+---------+ 
| id | name | 
+----+---------+ 
| 1 | Pirate | 
| 2 | money | 
| 5 | Ninja | 
| 6 | pradeep | 
+----+---------+ 

mysql> select * from right_table; 
+----+-------------+ 
| id | name  | 
+----+-------------+ 
| 1 | Rutabaga | 
| 2 | Pirate  | 
| 3 | Darth Vader | 
| 4 | Ninja  | 
+----+-------------+ 

我跑了之类的语句

mysql> SELECT * FROM left_table LEFT JOIN right_table on left_table.name = right 
_table.name where right_table.id is NULL; 
+----+---------+------+------+ 
| id | name | id | name | 
+----+---------+------+------+ 
| 2 | money | NULL | NULL | 
| 6 | pradeep | NULL | NULL | 
+----+---------+------+------+ 

mysql> SELECT * FROM left_table LEFT OUTER JOIN right_table on left_table.name = 
right_table.name where right_table.id is NULL; 
+----+---------+------+------+ 
| id | name | id | name | 
+----+---------+------+------+ 
| 2 | money | NULL | NULL | 
| 6 | pradeep | NULL | NULL | 
+----+---------+------+------+ 

它们仍然产生相同的输出。如果有的话1可以显示一些结果会有所不同的声明。我将能够理解它。

+2

[SQL Server中的左连接和左外连接]的可能重复(http://stackoverflow.com/questions/406294/left-join-and-left-outer-join-in-sql-server) – Niels

+4

This不是重复的。这是一个MySQL特有的问题。 –

+0

也许这会帮助你http://www.xaprb.com/blog/2006/05/26/how-to-write-full-outer-join-in-mysql/ – AllisonC

回答

1

他们可能会在特定的测试情况下,产生相同的结果。但是,他们并不总是。

即使辅助表中没有对应的行,外部联接(而不是内部联接)仍表示仍然显示主表的结果(取决于您是使用左外还是右外连接)。

如果主表中有一行匹配WHERE条件但没有可以在辅助表中加入的行,则内部连接根本不会显示结果。

如果你的表,你在测试中加入对每一个相匹配的结果行​​(即left_table每一行有right_table一排在name领域相同的值),那么你将不会看到任何区别。

如果在一张表或每张表中有一行没有在另一张表中有一行,会有什么不同。

为: select * from left_table left outer join right_table on...where...并有在right_table一些行符合(在哪里)的条件语句,但没有一个行中的left_table,他们也不会显示。但是,如果left_table中有符合right_table中没有加入行的条件的行,它们仍会显示。

对于RIGHT OUTER JOIN也是相反的。

编辑:

LEFT JOINLEFT OUTER JOIN是彼此的别名。他们是一样的东西。如果你愿意,我只会用OUTER来澄清。我更喜欢总是使用OUTERINNER,这样我就可以快速查看并查看我做了什么。

+0

你的意思是说添加where子句会产生变化。你能用简单的话来告诉我吗?我们应该在我的陈述中添加OUTER关键字。 – Hacker

+0

左外连接是一个专门的外连接。像内连接一样,外连接组合(连接)存储在两个不同表中的匹配行。另外,外连接还会将参考表中不匹配的行添加到结果集中。在左外连接的情况下,这意味着当左表中有一行不能与右表中的任何行组合时(根据连接条件),MySQL ... – user182630

+1

'left join'和'left外连接“是彼此的别名。他们是一样的东西。如果你愿意,我会使用'OUTER'来为你澄清。我更喜欢总是使用'OUTER'或'INNER',这样我就可以快速查看,看看我做了什么。 –

3

我不知道你使用的是哪个版本的MySQL,但外连接与左或右的组合使用,这里是语法

table_reference NATURAL [{LEFT|RIGHT} [OUTER]] JOIN table_factor 

所以外部联接本身没有任何意义,除非它伴随着左或者正确。

你会发现这个参考得心应手

http://dev.mysql.com/doc/refman/5.0/en/join.html

+0

这个问题在其中一个例子中说明OP使用它的方向为'... left_table RIGHT OUTER JOIN right_tabl ...' –

+0

OP已经写了这个SELECT * FROM left_table OUTER JOIN right_table on left_table.name = righ t_table.name;这是一个没有方向的外连接我在想什么 – user182630

+0

@ user182630 - 我想知道它通过在语句中添加OUTER来实现什么特殊目的,因为不添加它也会返回相同的输出。 – Hacker