2011-12-02 9 views
6

なし:彼らの両方が同じデータを返すMySQLが参加し、これらの2つのクエリの違いは何

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

1つはANSI結合を使用し、もう1つは事前ansi形式の結合を使用します。 MOST DBエンジンは、それらを同じ実行計画にコンパイルします。

+0

私がSQLで始まった70年代、第2のものが唯一の結合でした。その後、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 joinANSIであるということであるとfrom #threads, #postsがありますTransact-SQL構文

関連する問題