2009-10-30 149 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往往具有更好的性能,但在某些情況下情況可能並非如此,特別是每個數據庫(包括版本)。

參考: