SELECT * FROM people、people_emails、members 或 INNER JOIN [重复]
Posted
技术标签:
【中文标题】SELECT * FROM people、people_emails、members 或 INNER JOIN [重复]【英文标题】:SELECT * FROM people,people_emails,members or INNER JOIN [duplicate] 【发布时间】:2013-01-18 00:12:14 【问题描述】:可能重复:INNER JOIN ON vs WHERE clause
我有以下两个代码:
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
它们都产生相同的结果,但哪个是正确/更好的查询?
【问题讨论】:
Bad habits to kick : using old-style JOINs - ANSI-92 SQL 标准 ( 20 年前!)。 请停止使用 【参考方案1】:就目前而言,这两个查询完全相同。第一个使用“旧样式”的连接。
使用第一种样式非常“过时”。我认为这种风格不是很清楚,当这种风格用于表达外连接和右连接时就会变得清晰。
有些人总是以第一种风格来做,我相信他们会说这样的风格更清晰。
【讨论】:
【参考方案2】:第二个是两者中的佼佼者,但都留有改进的空间。通过选择 *,您会自动选择比您需要的更多的字段。在您的情况下,由于 people_emails_person、people.people_id 和 members_person.people_id 始终具有相同的值,因此您只需要其中一个。
回到你的问题,第二个更好的原因是它可能会运行得更快。
【讨论】:
【参考方案3】:它们在技术上是等效的,但如果您要连接多个表(尤其是大型表)并且您遇到查询需要很长时间才能完成,有时这有助于控制计划顺序,这可以通过显式连接(第二个,使用INNER JOIN
s)和一些设置调整来完成。
如果您使用的是 PostgreSQL,例如,您可以设置 join_collapse_limit=1
以确保查询按照您指定的确切顺序连接。这仅在使用显式连接时才有效。有时计划会做一些奇怪的、意想不到的事情,使查询变得非常慢,但是如果你知道你的方式会更快,并且想要告诉计划者按照你的方式去做,你可以指定它。阅读this article about explicit joins in postgres 了解更多信息。当然,这取决于您使用的 SQL。
【讨论】:
【参考方案4】:都是正确的,但第一个查询应该更好,因为 WHERE 语法更面向关系模型。 无论如何,隐式 JOIN ANSI 语法较旧,不太明显,不推荐使用。
【讨论】:
当您说“隐式 JOIN ANSI 语法”时,您指的是第一个示例(某些读者可能不清楚)。以上是关于SELECT * FROM people、people_emails、members 或 INNER JOIN [重复]的主要内容,如果未能解决你的问题,请参考以下文章