2009-10-30 150 views
2

我总是通过join来获得某些东西的结果,然后只使用这些结果进行连接。Mysql查询。 Join和SubQuery有什么区别?

SELECT * FROM tbl AS t1 
JOIN tbl2 AS t2 ON t1.id = t2.foreignId 
JOIN tbl3 AS t3 ON t2.id = t3.foreignId 
WHERE t1.date > SOMEDATE 

从我的理解,它将运行where语句,并只获得日期范围内的结果。然后它会遍历所有的t2,并且只尝试匹配连接到t1的id(这可能会使结果更小)。然后用这个较小的潜在结果,它将为T3做同样的事情并输出最终结果。

但它似乎不是这是如何工作?而这些表格会增加而不是变小。显然,我上面描述的更像是子查询? (注意,我说LIKE,我不知道subquerys是如何工作的)

JOIN如何工作,JOIN和子查询之间有什么区别?

我同时使用MySql和SQLite。我不知道这是否相关。

+0

这不是一个MySQL的问题。它通常适用于任何SQL数据库。 (就像这个用户发布的大部分类似问题一样......) – 2012-06-22 20:49:46

回答

0

子查询示例

SELECT * 
FROM (
    SELECT * FROM tbl1 WHERE date > SOMEDATE 
) 
AS t1 
JOIN tbl2 AS t2 ON t1.id = t2.foreignId 
JOIN tbl3 AS t3 ON t2.id = t3.foreignId 

数据库引擎如何执行是真正达到了优化。尝试在查询前加上EXPLAIN来查看数据库引擎正在做什么。考虑到许多变量,包括索引,表格大小等。

1

如果子查询中使用的表格返回一个值两次,JOIN也会返回两次匹配的行,而IN或EXISTS条件只会返回它们一次。

JOIN往往具有更好的性能,但在某些情况下情况可能并非如此,特别是每个数据库(包括版本)。

参考: