一、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 后面,那么 A 和 B 的連接順序為:B 表先按條件查詢,再與 A 表連接,即先篩選再連接;
-
如果放置在 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慢很多;