寫SQL的要注意的一些語法
- 一、left join on後面的條件與where後面的條件的區別
- 二、子查詢與JOIN&LEFT JOIN比較
- 三、count(*)、count(1)、count(id)的區別
- 四、mysql、oracle、hive中的substr()函式的區別
- 五、length()和char_length()的區別
- 六、union與union all的區別
一、left join on後面的條件與where後面的條件的區別
# 主表:A、關聯表:B、關聯條件:A.od=B.a_id、篩選條件:B.id=1
A left join B on A.id=B.a_id and B.id=1
關聯表的篩選條件:
-
如果放置在 on 後面
-
如果放置在 where 後面,那麼 A 和 B 的連線順序為:A 與 B 連線後,再從連線表中篩選,即先連線再篩選
所以,結論就是on 後面的篩選條件是針對於關聯表,where 後面的條件是對連線後的資料進行篩選
二、子查詢與JOIN&LEFT JOIN比較
我們在多數的開發過程中,會首先考慮實現過程,往往會使用多個子查詢,但子查詢雖然很靈活,但是執行效率並不高,原因:
- 執行子查詢時,MySQL需要建立臨時表,查詢完畢後再刪除這些臨時表,所以,子查詢的速度會受到一些影響,這裡多了一個建立和銷燬臨時表的過程。
三、count(*)、count(1)、count(id)的區別
-
1、count(*) 包含null值,統計所有行數;count(id) 不包含null值;
-
2、如果你的資料表沒有主鍵,那麼count(1)比count()快 ;如果有主鍵的話,那主鍵(聯合主鍵)作為count的條件也比count()要快 。
-
3、如果你的表只有一個欄位的話那count(*)就是最快的。
-
4、如果count(1)是聚索引,id,那肯定是count(1)快,但是差的很小的。因為count(),自動會優化指定到那一個欄位。所以沒必要去count(1),用count(),sql會幫你完成優化。此時count(1)和count(*)基本沒有區別!
四、mysql、oracle、hive中的substr()函式的區別
-
1、substr作為擷取字串的函式,用法是substr(欄位名(string) , 起始位置(int) , 擷取長度(int))
-
2、mysql的substr() 函式,mysql的起始位置只能從1開始,不能從0開始。
-
3、oracle的substr() 起始位置從0和從1開始都是表示從字串首位開始擷取
-
4、hive 則是從1開始
五、length()和char_length()的區別
-
1、char_length(str)
(1)計算單位:字元
(2)不管漢字還是數字或者是字母都算是一個字元 -
2、length(str)
(1)計算單位:位元組
(2)utf8編碼:一個漢字三個位元組,一個數字或字母一個位元組。
(3)gbk編碼:一個漢字兩個位元組,一個數字或字母一個位元組。
六、union與union all的區別
-
1、對重複結果的處理:UNION會去掉重複記錄,UNION ALL不會;
-
2、對排序的處理:UNION會排序,UNION ALL只是簡單地將兩個結果集合並;
-
3、效率方面的區別:因為UNION 會做去重和排序處理,因此效率比UNION ALL慢很多;