1. 程式人生 > >sql查詢語句中on和where的區別

sql查詢語句中on和where的區別

運算 www span 多表 速度 分享 執行 最終 .com

  數據庫在通過連接兩張或多張表來返回記錄時,都會生成一張中間的臨時表,然後再將這張臨時表返回給用戶。

在使用left jion時,on和where條件的區別如下:

  1. on條件是在生成臨時表時使用的條件,它不管on中的條件是否為真,都會返回左邊表中的記錄。
  2. where條件是在臨時表生成好後,再對臨時表進行過濾的條件。這時已經沒有left join的含義(left join是必須返回左邊表的記錄),條件不為真的就全部過濾掉。

表一:tab1

技術分享圖片

表二:tab2

技術分享圖片

兩條SQL:

  1. select * form tab1 left join tab2 on (tab1.size = tab2.size) where tab2.name=’AAA’
  2. select * form tab1 left join tab2 on (tab1.size = tab2.size and tab2.name=’AAA’)

技術分享圖片

技術分享圖片

  其實以上結果的關鍵原因就是left join,right join,full join的特殊性,不管on上的條件是否為真都會返回left或right表中的記錄,full則具有left和right的特性的並集。 而inner jion沒這個特殊性,則條件放在on中和where中,返回的結果集是相同的。

on、where、having的區別

  on、where、having這三個都可以加條件的子句中,on是最先執行,where次之,having最後。有時候如果這先後順序不影響中間結果的話,那最終結果是相同的。但因為on是先把不符合條件的記錄過濾後才進行統計(可以簡化中間表)

,它就可以減少中間運算要處理的數據,按理說應該速度是最快的。

  在兩個表聯接時才用on的,所以在一個表的時候,就剩下where跟having比較了。在這單表查詢統計的情況下,如果要過濾的條件沒有涉及到要計算字段,那它們的結果是一樣的,只是where可以使用rushmore技術,而having就不能,在速度上後者要慢。

  如果要涉及到計算的字段,就表示在沒計算之前,這個字段的值是不確定的,根據上篇寫的工作流程,where的作用時間是在計算之前就完成的,而having就是在計算後才起作用的,所以在這種情況下,兩者的結果會不同。

  在多表聯接查詢時,on比where更早起作用。系統首先根據各個表之間的聯接條件,把多個表合成一個臨時表後,再由where進行過濾,然後再計算,計算完後再由having進行過濾。由此可見,要想過濾條件起到正確的作用,首先要明白這個條件應該在什麽時候起作用,然後再決定放在那裏

轉自:https://www.cnblogs.com/sky6699/p/5238584.html

sql查詢語句中on和where的區別