寫SQL的要注意的一些語法


一、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慢很多;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM