2011-10-18 65 views
5

我一直在寻找无远弗届,但我无法找到答案,可能是因为我无法找出正确的方式来问这个问题。所以在这里:是否有任何理由更喜欢这两个查询中的任何一个?JOIN的VS选择从多个表中

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

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

这个问题从我试图优化一个更复杂的查询梗,但我认为这两个查询包含了问题的实质,并希望通过要求在此方式对其他人更有用。提前致谢。

+0

第一个查询是否工作?如果是这样,我认为它默默地进行某种形式的连接,但我不知道是什么类型。 – eykanal

+0

它确实有效,我在发布之前对它进行了测试。 ;) – Sophivorus

回答

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条款。对于较大的查询,它使得查询更具可读性,并且使跳过连接谓词更加困难。

另外请注意,我会倾向于读第一种形式为:采取两个表的笛卡尔积,并且只保留有它在SQL表示为SELECT * FROM table1 CROSS JOIN table2 WHERE table1.id = table2.id;两个表相等IDS行。

5

其实这两个查询是一样的,只是两种不同的写它的方式。我个人认为后者为用户提供了更多的可读性。

+0

更不用说我相信前者是[被弃用](http://blogs.technet.com/b/wardpond/archive/2008/09/13/deprecation-of-old-style-join-syntax-仅-A-局部thing.aspx)。 –

2

what I gather他们都是相同的。一个是另一个语法糖。

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

+0

+1表示“显式”与“隐式”。 – Benoit

2

它们是相同的。

大部分在基本格式看到的差异经常是不同的数据库,例如Oracle和MySQL之间。传统上,甲骨文联接仅仅使用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

给出了大量的详细信息和历史记录并解释各种内部和外部连接的非常好。