1. 程式人生 > 其它 >寫SQL的要注意的一些語法

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

作者:落花桂     出處:https://www.cnblogs.com/nthforsth/     本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段宣告,且在文章頁面明顯位置給出原文連線,否則保留追究法律責任的權利。