MySQL将两个表中的记录与join和without组合在一起

时间:2011-12-02 12:35:02

标签: mysql sql join

这两个查询之间有什么区别:

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 个答案:

答案 0 :(得分:4)

WHERE返回的

JOIN子句过滤结果集,所以这是一个区别。

只要您使用INNER JOIN,就性能和执行计划都没有区别,如果任何OUTER JOIN查询会产生不同的执行计划。

还要注意MySql online doc中的内容:

  

通常,您应该对指定的条件使用ON子句   如何连接表,以及WHERE子句来限制你的行   想要在结果集中。

答案 1 :(得分:1)

一个使用ANSI连接,另一个使用pre-ansi样式连接。 MOST数据库引擎会将它们编译成相同的执行计划。

答案 2 :(得分:1)

总而言之:可读性。

运行以下代码:

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

http://data.stackexchange.com/stackoverflow/query/new中,您将获得相同的执行计划:)

唯一真正的区别inner join ANSI ,而from #threads, #posts Transact-SQL语法。

答案 3 :(得分:0)

这些查询的内部实现可能存在差异,但我对此表示怀疑。 我个人更喜欢JOIN因为它使执行计划更加明显。