sql語句書寫規範

2021-07-09 13:28:56 字數 2852 閱讀 6498

一、sql書寫規範:

1、sql語句的所有表名、欄位名全部小寫,系統保留字、內建函式名、sql保留字大寫。

2、連線子or、in、and、以及=、

<=、>=等前後加上乙個空格。

3、對較為複雜的sql語句加上注釋,說明演演算法、功能。

注釋風格:注釋單獨成行、放在語句前面。

(1)   應對不易理解的分支條件表示式加注釋;

(2)   對重要的計算應說明其功能;

(3)   過長的函式實現,應將其語句按實現的功能分段加以概括性說明;

(4)   每條sql語句均應有注釋說明(表名、欄位名)。

(5)  常量及變數注釋時,應注釋被儲存值的含義(必須),合法取值的範圍(可選) 

(6)  可採用單行/多行注釋。(-- 或 /* */ 方式)

4、sql語句的縮排風格

(1)  一行有多列,超過80個字元時,基於列對齊原則,採用下行縮排

(2)  where子句書寫時,每個條件佔一行,語句令起一行時,以保留字或者連線子開始,連線子右對齊。

5、多表連線時,使用表的別名來引用列。

6、供別的檔或函式呼叫的函式,絕不應使用全域變數交換資料;

如例(1)

二、書寫優化效能建議

1、避免巢狀連線。例如:a = b and b = c and c = d 

2、where條件中儘量減少使用常量比較,改用主機變數

3、系統可能選擇基於規則的優化器,所以將結果集返回資料量小的表作為驅動表(from後邊最後乙個表)。

4、大量的排序操作影響系統效能,所以儘量減少order by和group by排序操作。

如必須使用排序操作,請遵循如下規則:

(1)  排序盡量建立在有索引的列上。

(2)  如結果集不需唯一,使用union all代替union。

5、索引的使用。

(1)  盡量避免對索引列進行計算。如對索引列計算較多,請提請系統管理員建立函式索引。

(2)  盡量注意比較值與索引列資料型別的一致性。

(3)  對於復合索引,sql語句必須使用主索引列

(4)  索引中,盡量避免使用null。

(5)  對於索引的比較,盡量避免使用not=(!=)

(6)  查詢列和排序列與索引列次序保持一致

6、盡量避免相同語句由於書寫格式的不同,而導致多次語法分析。

7、盡量使用共用的sql語句。

8、查詢的where過濾原則,應使過濾記錄數最多的條件放在最前面。

9、任何對列的操作都將導致資料表掃瞄,它包括資料庫函式、計算表示式等等,查詢時要盡可能將操作移至等號右邊。

10、in、or子句常會使用工作表,使索引失效;如果不產生大量重複值,可以考慮把子句拆開;拆開的子句中應該包含索引。

三、其他經驗性規則

1、盡量少用巢狀查詢。如必須,請用not exist代替not in子句。如例(2)

2、用多表連線代替exists子句。如例(3)

3、少用distinct,用exists代替如例(4)

4、使用union all、minus、intersect提高效能

5、使用rowid提高檢索速度。對select得到的單行記錄,需進行delete、update操作時,使用rowid將會使效率大大提高。

6、使用優化線索機制進行訪問路徑控制。

7、使用cursor時,顯示游標優於隱式游標

本規範示例:

例一:select aka042 -- 單位繳費劃入個人帳戶比例

into prm_aaa043 

from ka01 --醫療保險單位繳費劃入個人帳戶比例分段資訊

where akc021 = rec_kc01.akc021 -- 醫療人員類別

and aka041 >= rec_kc01.akc023 -- 年齡上限

and aka040 <= rec_kc01.akc023 -- 年齡下限

and aae030 <= prm_date -- 開始時間

and ( aae031 >= prm_date or aae031 is null ); -- 終止時間

例二:x select ...... 

from emp 

where dept_no not in ( select dept_no 

from dept 

where dept_cat='a'); 

o select ...... 

from emp e 

where not exists ( select 'x' 

from dept 

where dept_no=e.dept_no 

and dept_cat='a'); 

例三:x select ...... 

from emp 

where exists ( select 'x' 

from dept 

where dept_no=e.dept_no 

and dept_cat='a'); 

o select ...... 

from emp e,dept d 

where e.dept_no=d.dept_no 

and dept_cat='a'; 

例四:x select distinct d.dept_code,d.dept_name 

from dept d ,emp e 

where e.dept_code=d.dept_code; 

o select dept_code,dept_name 

from dept d 

where exists ( select 'x' 

from emp e 

where e.dept_code=d.dept_code);

SQL書寫規範

1 語句中出現的所有表名 欄位名全部小寫,系統保留字 內建函式名 sql保留字大寫 sql不區分大小寫 2 連線符or in and 以及 等前後加上乙個空格。3 對較為複雜的sql語句加上注釋,說明演算法 功能。注釋風格 注釋單獨成行 放在語句前面。1 應對不易理解的分支條件表示式加注釋 2 對重...

if語句的書寫規範

一 bool值和零比較 bool型別是在c99標準中才引入的乙個語法特點,用的很少,一般情況下我們都使用整形變數來充當bool變數的角色 int flag if flag true if flag false 上面這個是錯誤寫法。因為在c語言中bool值的語義是 0表示假,非0表示真 define ...

ecshop除錯php語句書寫規範

在除錯中我們經常使用 var dump val die 輸出變數。但是變數多的時候有時候會顯示不全,因此,有些朋友會選擇 print r print r val die 但是,這樣內容都輸出出來了,但是不工整,格式化一下 echo print r val echo die 這樣子各個變數就都可以很好...