我一直在寻找广泛,但我找不到答案,可能是因为我无法找出正确的方式来提问。所以这就是:有没有理由更喜欢这两个查询中的任何一个?
SELECT * FROM table1, table2 WHERE table1.id = table2.id;
和
SELECT * FROM table1 INNER JOIN table2 ON table1.id = table2.id;
问题源于我正在尝试优化的更复杂的查询,但我认为这两个查询包含问题的本质,并希望以这种方式询问它对其他人更有用。提前谢谢。
答案 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
同样地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
提供了更多信息和历史记录,并且很好地解释了各种内部和外部联接。