这两个查询之间有什么区别:
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`
他们都返回相同的数据。
答案 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
因为它使执行计划更加明显。