編碼規約之SQL語句

2021-09-13 14:49:19 字數 1880 閱讀 4058

目錄

一、強制

1.count(*)作為標準統計行數的語法

2.count(distinct col) 計算該列除 null 之外的不重複行數

3.當某一列的值全是 null 時count(col)的返回結果為 0

4.使用 isnull()來判斷是否為 null 值 

5.在**中寫分頁查詢邏輯時若 count 為 0 應直接返回

6.不得使用外來鍵與級聯

7.禁止使用儲存過程

8.資料訂正(特別是刪除、修改記錄操作)時先 select

二、推薦

1.in 操作能避免則避免

三、參考

1.如果有國際化需要所有的字元儲存與表示,均以 utf-8 編碼

2.truncate table 比 delete 速度快

不要使用 count(列名)或 count(常量)來替代 count(*),count(*)是 sql92 定義的 標準統計行數的語法,跟資料庫無關,跟 null 和非 null 無關。

說明:count(*)會統計值為 null 的行,而 count(列名)不會統計此列為 null 值的行。

注意 count(distinct col1, col2) 如果其中一列全為 null,那麼即使另一列有不同的值,也返回為 0。

但 sum(col)的返回結果為 null,因此使用 sum()時需注意npe問題。

正例:可以使用如下方式來避免 sum 的 npe 問題:select if(isnull(sum(g)),0,sum(g)) from table;

說明:null 與任何值的直接比較都為 null

1)null<>null的返回結果是 null,而不是 false。

2)null=null的返回結果是 null,而不是 true。

3)null<>1的返回結果是 null,而不是 true。

避免執行後面的分頁語句

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

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

儲存過程難以除錯和擴充套件,更沒有移植性。

資料訂正(特別是刪除、修改記錄操作)時,要先 select,避免出現誤刪除,確認無誤才能執行更新語句。

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

如果有國際化需要,所有的字元儲存與表示,均以 utf-8 編碼,注意字元統計函式的區別。

說明:

select length("輕鬆工作"); 返回為 12

select character_length("輕鬆工作"); 返回為 4

如果需要儲存表情,那麼選擇utf8mb4來進行儲存,注意它與 utf-8 編碼的區別。 

truncate table 比 delete 速度快,且使用的系統和事務日誌資源少,但 truncate 無事務且不觸發 trigger,有可能造成事故,故不建議在開發**中使用此語句。

說明:truncate table 在功能上與不帶 where 子句的 delete 語句相同。

編碼規約之索引規約

目錄 一 強制 1.業務上具有唯一特性的字段,即使是多個欄位的組合,也必須建成唯一索引 2.超過三個表禁止 join 3.在 varchar 欄位上建立索引時注意項 4.頁面搜尋嚴禁左模糊或者全模糊 二 推薦 1.如果有 order by 的場景注意索引的有序性 2.利用覆蓋索引來進行查詢操作,避免...

編碼規約之ORM對映

目錄 一 強制 1.在表查詢中一律不要使用 作為查詢的字段列表 2.pojo 類的布林屬性不能加 is而資料庫字段必須加 is 3.不要用 resultclass 當返回引數 4.sql.xml 配置引數使用 或 param 5.ibatis自帶的queryforlist不要使用 6.不允許直接拿 ...

編碼規約之應用分層

目錄 一 推薦 1.分層規約 二 參考 1.分層異常處理規約 2.分層領域模型規約 下圖中預設上層依賴於下層,箭頭關係表示可直接依賴。如 開放介面層可以依賴於 web 層,也可以直接依賴於 service 層,依此類推 開放介面層 可直接封裝 service 方法暴露成 rpc 介面 通過 web ...