手機版
你好,游客 登錄 注冊
背景:
閱讀新聞

SQL語句規范參考

[日期:2019-11-25] 來源:cnblogs.com/yanggb  作者: 楊冠標 [字體: ]

公司有SQL語句規范的參考,這里特別做個筆記。

書寫風格

1. 語句關鍵字應全部使用小寫。

2. 引用字符時應使用單引號。如:update testable set idcol=’abcd’。

3. 連接符或運算符or、in、and、=、<=、>=, +,- 等前后宜加上一個空格。否則容易導致以下類似問題。例如在語句select a–b from table中,a,b均為變量,拼寫該語句時,如果a = 6,b = -3,則語句變為select 6--3 from table。--被視為SQL的注釋,結果語句報錯。

4. 不得使用“select * from …”語法,必須標明字段名。即select col1, col2,… from tablea where …

5. 嚴禁使用“insert into table_name values (?,?,……)”語法,統一使用“insert into table_name (col1,col2,……) values (?,?,…...)”。

6. SQL語句包含多表連接時,必須加上表的別名,對每個字段的使用都要帶上表別名。即 select a.col1, a.col2, b.col3 from tablea a, tableb b where a.col4=b.col5

7. 應避免顯式或隱含的類型轉換。例如在where子句中numeric型和int型的列的比較。

8. 在子查詢中前后必須加上括號。select col1, col2 from tablea where col3 in ( select col4 from tableb where col4>0)

9. 執行SQL時一次應只執行一條,如果多條語句則應分開執行,但必須保持在一個事務中。不得一次執行通過分號等分開的多條語句,這樣處理不清晰。

10. 如果能采用or代替,則不宜使用in 語句。in語句中的元素不得超過500個,如果超過,則應拆分為多條SQL語句。嚴禁使用xx in(‘’,’’….) or xx in(‘’,’’,’’)。

11. or連接條件不得超過 500,超過時應拆分為多條語句。

性能優化

1. 查詢時應盡量減少多余數據的讀取,通過使用where子句來減少返回的記錄數。

2. 如果在語句中有not in(in)操作,應盡量用not exists(exists)來代替。特別對大數據量的兩者檢索速度有很明顯的區別。

3. 不宜使用外連接。外連接效率低。

4. 一條SQL語句中不宜使用3層以上的嵌套查詢。如果超過,則應在Java等應用服務器程序中處理。

5. 一條SQL語句中不得從4個及以上表中同時取數。僅作關聯或過濾條件而不涉及取數的表不參與表個數計算;如果必須關聯4個或4個以上表,應在Java等應用服務器程序中處理。

6. 應盡量避免使用order by和group by排序操作,如必須使用排序操作,盡量建立在有索引的列上。因為大量的排序操作影響系統性能。

7. 對索引列的比較,應盡量避免使用not 或 !=,可拆分為幾個條件。因為“not”和“!=”不會使用索引。如col1 是索引列,條件col1 !=0 可以拆分為col1 >0 or col2 <0。

8. 應盡量將數據庫函數、計算表達式寫在邏輯操作符右邊。因為這些對列的操作會將導致表掃描,影響性能。

9. 在where子句中,如果有多個過濾條件,應將索引列或過濾記錄數最多的條件放在前面。

10. 能用連接方式實現的功能,不得用子查詢。例如:select name from customer where customerId in ( select customerId from order where money > 1000)。 應該用如下語句代替:select name from customer inner join order on customer.customerId = order.customerId where order.money > 100?;?select name from customer where exists ( select 1 from order where money > 1000 and customer.customerId = order.customerId) <這里需要注意:使用exists的效率依賴于匹配度,inner join效率比較穩定>

11. 多表關聯查詢時,寫法可遵循以下原則,這樣做有利于建立索引,提高查詢效率。格式如下:select sum (t1.je) from table1 t1, table2 t2, table3 t3 where (t1的等值條件(=)) and (t1的非等值條件) and (t2與t1的關聯條件) and (t2的等值條件) and (t2的非等值條件) and (t3與t2的關聯條件) and (t3的等值條件) and (t3的非等值條件)。

跨數據庫支持

1. 對于跨數據庫Java應用程序的VO映射數據庫的數據格式建議:

1) 整型字段:字段設置保存為Integer或者Long

2) 數字型字段:若需要使用小數2位以上的精確計算,讀取、插入、更新使用BigDecimal類型

3) 字符型字段:讀取為String,并保存為String,插入或者更新為String

4) 時間字段:讀取為String,插入或者更新時的時間格式使用中間件統一處理。

2. 字符串連接應使用“||”符號,而不應使用“+”。“+”是SQLServer語法,Oracle和DB2支持“||”,Hibernate轉化為SQLServer時,會自動將“||”轉為“+”。

3. 通配符不能使用‘[a-c]%’這種形式。應寫成如:select col1, col2 from table_name where col1 like ‘[a]%’ OR col1 like ‘[b]%’ OR col1 like ‘[c]%’

4. 截取字符串長度函數應使用substr,起始位置為1表示從頭開始。因為db2中substr起點為1,0會報錯;在SqlServer數據庫中使用的是substring需要進行轉換。

5. 不得通過select percent n和select top n限制查詢結果集的記錄數。

6. join 與on 必須嚴格匹配,嚴禁出現沒有on的join。

7. join…on 后面不宜使用or,如果使用則需將or的范圍用( )括起來。

8. 不得使用select into 的格式。Select into是SQL Server特有語法,因為Oracle和DB2不支持。

9. 應將Null值與空字符串(長度為零的字符串)視為不同。雖然Oracle視Null與空字符串為相同,但DB2和SQL Server卻視為不同。

linux
本文評論   查看全部評論 (0)
表情: 表情 姓名: 字數

       

評論聲明
  • 尊重網上道德,遵守中華人民共和國的各項有關法律法規
  • 承擔一切因您的行為而直接或間接導致的民事或刑事法律責任
  • 本站管理人員有權保留或刪除其管轄留言中的任意內容
  • 本站有權在網站內轉載或引用您的評論
  • 參與本評論即表明您已經閱讀并接受上述條款
海口彩票论坛