JOINs与许多表中的SELECT

时间:2011-10-18 15:27:06

标签: mysql join inner-join

我一直在寻找广泛,但我找不到答案,可能是因为我无法找出正确的方式来提问。所以这就是:有没有理由更喜欢这两个查询中的任何一个?

SELECT * FROM table1, table2 WHERE table1.id = table2.id;

SELECT * FROM table1 INNER JOIN table2 ON table1.id = table2.id;

问题源于我正在尝试优化的更复杂的查询,但我认为这两个查询包含问题的本质,并希望以这种方式询问它对其他人更有用。提前谢谢。

4 个答案:

答案 0 :(得分:6)

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;

答案 1 :(得分:5)

实际上两个查询是相同的,只有两种不同的方式来编写它。就个人而言,我认为后者为用户提供了更多的可读性。

答案 2 :(得分:2)

来自what I gather他们都是一样的。一个是另一个的语法糖。

它被称为显式与隐式连接符号。

答案 3 :(得分:2)

他们是一样的。

在基本格式中看到的许多差异通常发生在不同的数据库之间,例如Oracle和mySQL。传统上在oracle连接中只使用table.foreign_id = table2.id完成,而mySQL将使用table1 join table2 on table1.foreign_key = table2.id

同样地joininner joinleft inner joinleft 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

提供了更多信息和历史记录,并且很好地解释了各种内部和外部联接。