開發基礎——SQL書寫規範

來源:互聯網
上載者:User
開發基礎——SQL書寫規範

  開發基礎——SQL書寫規範1、 語句中出現的所有表名、欄位名全部小寫,系統保留字、內建函數名、Sql保留字大寫。

  2、 串連符or、in、and、以及=、=等前後加上一個空格。

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

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

  (1) 應對不易理解的分支條件運算式加註釋;

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

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

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

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

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

  4、 SQL語句的縮排風格

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

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

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

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

  7、 變數令名不能超出ORACLE的限制(30個字元),令名要規範,要用英文令名,從變數上能看到變數的作用,如

  g名稱 全域變數

  m名稱 局部變數

  c名稱 游標

  p名稱 參數

  8、 尋找資料庫表或視圖時,只能取出確實需要的那些欄位,不要使用*來代替所有列名。要清楚明白地使用列名,而不能使用列的序號。

  9、 功能相似的過程和函數,盡量寫到同一個包中,加強管理。

  如例(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、盡量避免相同語句由於書寫格式的不同,而導致多次文法分析,盡量使用Bind變數。

  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時,顯示光線標優於隱式游標

  本規範樣本:

  例一: [code]

  Select aka042 -- 單位繳費劃入個人帳戶比例

  INTO prm_aaa043

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

  Where akc021 = rec_kc01.akc021 -- 醫學人員類別

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

  AND aka040 = prm_date or aae031 IS NULL ); -- 終止時間

  [/code]

  例二: [code]

  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');

  [/code]

  例三: [code]

  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';

  [/code]

  例四: [code]

  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);

  [/code]

  注釋範例

  過程注釋:

  過程都以sp_開頭,注意過程名稱要符合令名要求

  /**************************************************************************

  name:sp_Write_log

  parameter:p_textContext in varchar2 參數描述

  create date:2003-04-1

  creater:chen jiping

  desc:過程總功能描述

  ****************************************************************************/

  函數注釋

  函數以f開頭,令名符合令名標準

  /**************************************************************************

  name:f_Get_JobId

  parameter:p_Name in varchar2 參數描述

  return number:傳回值描述

  create date:2003-04-1

  creater:chen jiping

  desc:函數總功能描述

  ****************************************************************************/

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.