2011-11-16 34 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