JOIN 与从许多表中选择
Posted
技术标签:
【中文标题】JOIN 与从许多表中选择【英文标题】:JOINs vs SELECTing from many tables 【发布时间】:2011-12-10 05:16:39 【问题描述】:我一直在四处寻找,但找不到答案,可能是因为我找不到提出问题的正确方法。所以这里是:有什么理由更喜欢这两个查询中的任何一个吗?
SELECT * FROM table1, table2 WHERE table1.id = table2.id;
和
SELECT * FROM table1 INNER JOIN table2 ON table1.id = table2.id;
这个问题源于我正在尝试优化的一个更复杂的查询,但我认为这两个查询包含了问题的本质,希望通过这种方式提问对其他人更有用。提前致谢。
【问题讨论】:
第一个查询是否有效?如果是这样,我认为它正在默默地进行某种形式的连接,但我不知道是什么类型。 它确实有效,我在发布之前对其进行了测试。 ;) 【参考方案1】:其实这两个查询是一样的,只有两种不同的写法。我个人认为后者为用户提供了更多的可读性。
【讨论】:
别说我相信前者是being deprecated。【参考方案2】:来自what I gather 他们都是一样的。一个只是另一个的语法糖。
它被称为显式与隐式连接表示法。
【讨论】:
【参考方案3】:它们是一样的。
在基本格式中看到的许多差异通常存在于不同的数据库之间,例如 Oracle 和 mysql。传统上,oracle 中的连接仅使用 table.foreign_id = table2.id
完成,而 mySQL 将使用 table1 join table2 on table1.foreign_key = table2.id
类似地,join
、inner join
、left inner join
和 left join
在不同的数据库实现之间会有所不同,因此最好查看当前数据库实现的手册/文档以确保其正常运行你想要什么。
最近,ANSI 标准的语法变得更加标准化,但人们使用的内容通常显示其根源! 这篇写得很好的文章-http://www.google.com/url?sa=t&source=web&cd=4&ved=0CD8QFjAD&url=http%3A%2F%2Fwww.kingtraining.com%2Fconfdownloads%2Fdownloads%2FOracle9iJoin_paper.pdf&ei=LOGdTpfiFOrV0QH4zpmECQ&usg=AFQjCNHjicW-tWmJfZcXwNi220LxjGvNhg&sig2=4tdM2lfgQ6AqiYudWWTirg
提供了更多信息和历史,并很好地解释了各种内连接和外连接。
【讨论】:
【参考方案4】:SELECT * FROM table1, table2 WHERE table1.id = table2.id;
和
SELECT * FROM table1 INNER JOIN table2 ON table1.id = table2.id;
将返回相同的结果。但是,在这种情况下,您应该更喜欢第二个。第一种形式仍然被广泛使用,因为 Oracle 很长时间不支持第二种形式。
然而,声明 INNER JOIN
带有意图并强制您编写条件,因为 INNER JOIN
需要 ON
子句。对于较大的查询,它使查询更具可读性,并且更难跳过连接谓词。
另外,请注意,我倾向于将第一种形式理解为:取两个表的笛卡尔积,并且只保留两个表中具有相同 ID 的行,在 SQL 中表示为SELECT * FROM table1 CROSS JOIN table2 WHERE table1.id = table2.id;
.
【讨论】:
以上是关于JOIN 与从许多表中选择的主要内容,如果未能解决你的问题,请参考以下文章
从表中选择*与从表中选择col1,col2,col3 [重复]