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 JOINs)和一些设置调整来完成。

如果您使用的是 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 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

MYSQL 查询重复数据

MYSQL 查询重复数据

主流数据库查找前几条数据的区别

SQL重复记录查询(转载)

Does Good Luck Make People Overconfident? Evidence from...

python笔记8-多线程threading之封装式