0

可能重复:
INNER JOIN ON vs WHERE 子句

我有以下两个代码:

SELECT * FROM people,people_emails,members
WHERE people_emails_person=people_id
AND members_person=people_id

SELECT * FROM people
INNER JOIN people_emails ON people_id = people_emails_person
INNER JOIN members ON people_id = members_person

它们都产生相同的结果,但哪个是正确/更好的查询?

4

4 回答 4

2

就目前而言,这两个查询完全相同。第一个使用连接的“旧样式”。

使用第一种样式非常“过时”。我认为这种风格不是很清楚,当这种风格用于表达外部和右连接时就会变得很清楚。

有些人总是以第一种风格来做,我相信他们会说这样的风格更清晰。

于 2013-02-02T22:51:28.473 回答
1

它们在技术上是等效的,但是如果您要连接多个表(特别是如果它们是大表)并且您遇到查询需要很长时间才能完成,有时它有助于控制计划顺序,这可以通过显式连接(第二个,使用INNER JOINs)和一些设置调整来完成。

例如,如果您使用的是 PostgreSQL,您可以设置join_collapse_limit=1以确保查询按照您指定的确切顺序连接。这仅在使用显式连接时才有效。有时,计划会做一些奇怪的、意想不到的事情,使查询变得非常慢,但如果你知道你的方式会更快,并且想要告诉计划者按照你的方式去做,你可以指定它。阅读这篇关于 postgres 中显式连接的文章以获取更多信息。当然,这取决于您使用的 SQL。

于 2013-02-02T23:01:43.333 回答
1

第二个是两者中的佼佼者,但都留有改进的余地。通过选择 *,您会自动选择比您需要的更多的字段。在您的情况下,由于 people_emails_person、people.people_id 和 members_person.people_id 将始终具有相同的值,因此您只需要其中一个。

回到你的问题,第二个更好的原因是它可能会运行得更快。

于 2013-02-02T22:53:48.433 回答
0

都是正确的,但第一个查询应该更好,因为 WHERE 语法更面向关系模型。无论如何,隐式 JOIN ANSI 语法较旧,不​​太明显,不推荐使用。

于 2013-02-02T22:55:04.633 回答