1. 程式人生 > >(三)SQL語句

(三)SQL語句

1:不要使用count(列名)或count(常量)來替代count(*),count(*)是SQL92定義的標準統計行數的語法,跟資料庫無關,根null和非null無關。說明:count(*)會統計值為null的行,而count(列名)不會統計此列為null的值。

2:count(distinct col)計算該列除null之外不重複的行數,注意count(distinct col1, col2),如果其中一列全為null,那麼即使另一列有不同的值,也返回0。

3:當某一列的值全為null,count(col)的返回結果為0,但sum(col)的返回結果為null,因此使用sum()時需要注意NPE問題。正例:可以使用如下方式來避免sum的NPE問題,SELECT IF(ISNULL(SUM(g)), 0, SUM(g)) FROM table;

4:使用ISNULL()來判斷是否為NULL值。說明:NULL與任何值的直接比較都為null。

    1:NULL<>NULL的返回結果是NULL,而不是false。

    2:NULL=NULL的返回結果是NULL,而不是true。

    3:NULL<>1的返回結果是NULL,而不是true。

5:在程式碼中使用分頁查詢邏輯時,若count為0時應該直接返回,避免執行後面的分頁語句。

6:不得使用外來鍵與級聯,一切外來鍵概念必須在應用層解決。

    說明:以學生和成績為例,學生表中的student_id是主鍵,那麼成績表中的student_id則為外來鍵。如果更新學生表中的student_id,同時觸發成績表中的student_id更新,即為級聯更新。外來鍵與級聯更新適用於單機低併發,不適合於分散式,高併發叢集;級聯更新是強阻塞,存在資料庫更新風暴的風險;外來鍵影響資料庫的插入速度。

7:進位制使用儲存過程,儲存過程難易除錯和擴充套件,更沒有移植性。

8:資料訂正時,刪除和修改記錄時,要先select,避免出現誤刪除,確認無誤才能執行更新語句。

9:in操作能避免就避免,若實在避免不了,需要仔細評估in後邊的集合元素數量,控制在1000個以內。

10:如果有全球化需要,所有的字元和儲存表示,均已 utf-8編碼。

11:TRUNCATE TABLE比DELETE速度快,且實用的系統和事物日誌資源較少,但TRUNCATE無事物且不觸發trigger,有可能造成事故,故不建議在程式碼中使用此語句。TRUNCATE TABLE與不帶where字句的delete功能相同。