2011-12-02 80 views
6

什麼是這兩個查詢之間的差額合併記錄:的MySQL從兩個表加入和不

SELECT `threads`.`id` AS `threads.id` , `posts`.`id` , `posts`.`content` 
FROM `threads` 
JOIN `posts` ON `threads`.`id` = `posts`.`thread_id` 

而且

SELECT `threads`.`id` AS `threads.id` , `posts`.`id` , `posts`.`content` 
FROM `threads` , `posts` 
WHERE `threads`.`id` = `posts`.`thread_id` 

他們都返回相同的數據。

回答

4

WHEREJOIN返回的子句過濾結果集,所以這是一個區別。

只要您使用的是INNER JOIN,沒有任何性能和執行計劃的差異,如果有任何OUTER JOIN查詢會產生不同的執行計劃。

另外要注意什麼是在MySql online doc說:

一般來說,你應該使用條件ON子句指定 如何連接表,而WHERE子句限制的行你 想在結果集中。

0

這些查詢的內部實現可能有所不同,但我對此表示懷疑。 我個人更喜歡JOIN,因爲它讓執行計劃更加明顯。

1

一個使用ANSI連接另一個使用pre-ansi樣式連接。 MOST數據庫引擎會將它們編譯成相同的執行計劃。

+0

在70年代,我開始使用SQL第二個是唯一可能的連接。然後Chris Date「發明了」其他JOINS,這就是新語法引入的地方。 – Martin

+0

Yep;兩者都很好。程序員的新麪包被告知「完成」的方法是使用ANSI。但是我發現兩者通常都可以工作,有時候預先ANSI連接實際上會更快,反之亦然。我不知道他們爲什麼會用不同的表演產生不同的執行計劃;但有時他們只是做。 – xQbert

1

總之一句話:可讀性。

運行下面的代碼:在http://data.stackexchange.com/stackoverflow/query/new

create table #threads (
id int 
) 

create table #posts (
id int, 
thread_id int, 
content varchar(10) 
) 

insert into #threads values (1) 
insert into #threads values (2) 
insert into #posts values (1, 1, 'Stack') 
insert into #posts values (2, 2, 'OverFlow') 


SELECT #threads.id AS 'threads.id' , #posts.id , #posts.content 
FROM #threads 
JOIN #posts ON #threads.id = #posts.thread_id 

SELECT #threads.id AS 'threads.id' , #posts.id , #posts.content 
FROM #threads, #posts 
WHERE #threads.id = #posts.thread_id 

drop table #threads 
drop table #posts 

你會得到相同的執行計劃:)

唯一的區別inner joinANSIfrom #threads, #postsTransact-SQL語法。