《程序員必備:sql規(guī)范化書寫sql語句書寫規(guī)范》由會(huì)員分享,可在線閱讀,更多相關(guān)《程序員必備:sql規(guī)范化書寫sql語句書寫規(guī)范(4頁珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
1、分享SQL語句書寫規(guī)范書寫風(fēng)格1. 語句關(guān)鍵字應(yīng)全部使用小寫。2. 引用字符時(shí)應(yīng)使用單引號(hào)。如:update testable set idcol=abcd。3. 連接符或運(yùn)算符or、in、and、=, +,- 等前后宜加上一個(gè)空格。否則容易導(dǎo)致以下類似問題。例如在語句select ab from table中,a,b均為變量,拼寫該語句時(shí),如果a = 6,b = -3,則語句變?yōu)閟elect 6-3 from table。-被視為SQL的注釋,結(jié)果語句報(bào)錯(cuò)。4. 不得使用“select * from ”語法,必須標(biāo)明字段名。即select col1, col2, from tablea wh
2、ere 5. 嚴(yán)禁使用“insert into table_name values (?,?,)”語法,統(tǒng)一使用“insert into table_name (col1,col2,) values (?,?,.)”。6. SQL語句包含多表連接時(shí),必須加上表的別名,對(duì)每個(gè)字段的使用都要帶上表別名。select a.col1, a.col2, b.col3 from tablea a, tableb b where a.col4=b.col57. 應(yīng)避免顯式或隱含的類型轉(zhuǎn)換。例如在where子句中numeric型和int型的列的比較。8. 在子查詢中前后必須加上括號(hào)。select col1,
3、col2 from tablea where col3 in ( select col4 from tableb where col40)9. 執(zhí)行SQL時(shí)一次應(yīng)只執(zhí)行一條,如果多條語句則應(yīng)分開執(zhí)行,但必須保持在一個(gè)事務(wù)中。不得一次執(zhí)行通過分號(hào)等分開的多條語句,這樣處理不清晰。10. 如果能采用or代替,則不宜使用in 語句。in語句中的元素不得超過500個(gè),如果超過,則應(yīng)拆分為多條SQL語句。嚴(yán)禁使用xx in(,.) or xx in(,)。11. or連接條件不得超過 500,超過時(shí)應(yīng)拆分為多條語句。性能優(yōu)化1. 查詢時(shí)應(yīng)盡量減少多余數(shù)據(jù)的讀取,通過使用where子句來減少返回的記錄數(shù)。
4、2. 如果在語句中有not in(in)操作,應(yīng)盡量用not exists(exists)來代替。特別對(duì)大數(shù)據(jù)量的兩者檢索速度有很明顯的區(qū)別。3. 不宜使用外連接。外連接效率低。4. 一條SQL語句中不宜使用3層以上的嵌套查詢。如果超過,則應(yīng)在Java等應(yīng)用服務(wù)器程序中處理。5. 一條SQL語句中不得從4個(gè)及以上表中同時(shí)取數(shù)。僅作關(guān)聯(lián)或過濾條件而不涉及取數(shù)的表不參與表個(gè)數(shù)計(jì)算;如果必須關(guān)聯(lián)4個(gè)或4個(gè)以上表,應(yīng)在Java等應(yīng)用服務(wù)器程序中處理。6. 應(yīng)盡量避免使用order by和group by排序操作,如必須使用排序操作,盡量建立在有索引的列上。因?yàn)榇罅康呐判虿僮饔绊懴到y(tǒng)性能。7. 對(duì)索引列
5、的比較,應(yīng)盡量避免使用not 或 !=,可拆分為幾個(gè)條件。因?yàn)椤皀ot”和“!=”不會(huì)使用索引。如col1 是索引列,條件col1 !=0 可以拆分為col1 0 or col2 1000)。 應(yīng)該用如下語句代替: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 cu
6、stomer.customerId = order.customerId) 11. 多表關(guān)聯(lián)查詢時(shí),寫法可遵循以下原則,這樣做有利于建立索引,提高查詢效率。格式如下:select sum (t1.je) from table1 t1, table2 t2, table3 t3 where (t1的等值條件(=)) and (t1的非等值條件) and (t2與t1的關(guān)聯(lián)條件) and (t2的等值條件) and (t2的非等值條件) and (t3與t2的關(guān)聯(lián)條件) and (t3的等值條件) and (t3的非等值條件)??鐢?shù)據(jù)庫支持1. 對(duì)于跨數(shù)據(jù)庫Java應(yīng)用程序的VO映射數(shù)據(jù)庫的數(shù)據(jù)格
7、式建議:1) 整型字段:字段設(shè)置保存為Integer或者Long2) 數(shù)字型字段:若需要使用小數(shù)2位以上的精確計(jì)算,讀取、插入、更新使用BigDecimal類型3) 字符型字段:讀取為String,并保存為String,插入或者更新為String 4) 時(shí)間字段:讀取為String,插入或者更新時(shí)的時(shí)間格式使用中間件統(tǒng)一處理。2. 字符串連接應(yīng)使用“|”符號(hào),而不應(yīng)使用“+”?!?”是SQLServer語法,Oracle和DB2支持“|”,Hibernate轉(zhuǎn)化為SQLServer時(shí),會(huì)自動(dòng)將“|”轉(zhuǎn)為“+”。3. 通配符不能使用a-c%這種形式。應(yīng)寫成如:select col1, col2
8、from table_name where col1 like a% OR col1 like b% OR col1 like c%4. 截取字符串長度函數(shù)應(yīng)使用substr,起始位置為1表示從頭開始。因?yàn)閐b2中substr起點(diǎn)為1,0會(huì)報(bào)錯(cuò);在SqlServer數(shù)據(jù)庫中使用的是substring需要進(jìn)行轉(zhuǎn)換。5. 不得通過select percent n和select top n限制查詢結(jié)果集的記錄數(shù)。6. join 與on 必須嚴(yán)格匹配,嚴(yán)禁出現(xiàn)沒有on的join。7. joinon 后面不宜使用or,如果使用則需將or的范圍用( )括起來。8. 不得使用select into 的格式。Select into是SQL Server特有語法,因?yàn)镺racle和DB2不支持。9. 應(yīng)將Null值與空字符串(長度為零的字符串)視為不同。雖然Oracle視Null與空字符串為相同,但DB2和SQL Server卻視為不同。