2012-04-04 64 views
0

可能重複:
Explicit vs implicit SQL joins
In MySQL queries, why use join instead of where?有什麼區別與加入關鍵字加入或加入=

查詢與=運算符: -

Select us.FirstName 
     ,uf.FileTitle 
     ,pq.Question 
     ,pa.Answer from 
UserMst us,UploadedFile uf,PollQuestion pq,PollAnswer pa,PollResult pr 
where us.UserId = pr.U_id 
     and uf.FileId=pr.A_id 
     and pq.Q_id=pr.Q_id 
     and pa.A_id=pr.ans_id 

查詢加入關鍵字: -

Select us.FirstName,uf.FileTitle ,pq.Question,pa.Answer from 
    PollResult pr join UserMst us on us.UserId = pr.U_id 
      join UploadedFile uf on uf.FileId = pr.A_id 
      join PollQuestion pq on pq.Q_id= pr.Q_id 
      join PollAnswer pa on pa.A_id =pr.ans_id 

哪一個執行更好?

+0

或[INNER JOIN ON vs WHERE子句](http://stackoverflow.com/questions/1018822/inner-join-on-vs-where-clause) – bhamby 2012-04-04 14:14:46

+0

隱式連接區域SQL反模式請參閱:http: //www.amazon.com/gp/product/1934356557/ref=kinw_rke_tl_1 – HLGEM 2012-04-04 15:42:22

回答

1

在SQL 2008中,它幾乎沒有區別。 (雖然我認爲前一種方法可能會被棄用?)

但是,在很多SQL實現中,如果每個連接都有一個條件,那麼隨後的連接將加入較少的值,因此速度稍快。

如果你把所有的條件都放在最後,那麼這個優化不會發生,直到最後。所以你最終會得到一大堆一行一行地被過濾掉的行,這在理論上會慢一些。

因此,例如:

如果表A中有1000行,你加入到另一個表,B,有1000行,但指定INT EH連接條件,你只B中加入該行的10 ,你有10行。如果你再加入到表C中,你只需要連接10行。

如果你加入A到B到C,然後過濾,你過濾1000行(或者,也許百萬取決於加入)

所以對於交叉執行兼容性的緣故,而且可讀性,它可能是最好的使用後者的版本。

0

我更喜歡這個連接我認爲最好的做法是始終把連接條件放在ON子句中(除非它是外部連接,而實際上你確實希望它在where子句中),因爲它任何閱讀你的查詢的人都可以更清楚地知道表的連接條件,還有助於防止WHERE子句長達幾十行。因爲它的乾淨