您好,欢迎访问三七文档
1SQL编写规范1范围本规范规定了SQLDQL和DML语言的编写总则,从书写格式和性能优化两方面归纳了SQL书写的具体要求,并给出SQL语句示例。本规范适用于XXXX科技有限公司所有开发人员。2规范性引用文件下列文件中的条款通过本规范的引用而成为本规范的条款。凡是注日期的引用文件,其随后所有的修改单(不包括勘误的内容)或修订版均不适用于本规范,然而,鼓励根据本规范达成协议的各方研究是否可使用这些文件的最新版本。凡是不注日期的引用文件,其最新版本适用于本规范。3术语和定义下列术语和定义适用于本规范。3.1驱动表:ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,因此FROM子句中写在最后的表将被最先处理。这个最先处理的表就是驱动表。3.2交叉表:被其他表引用的表。4SQL编写总则4.1SQL语句应正确、规范、高效和最优。4.2同一项目的SQL书写格式应该统一。4.3应避免写非常复杂的SQL语句。4.4SQL语句不应在客户端组织,而应在服务器端组织。4.5SQL语句的语法应与所使用的数据库相适应。4.6应确保变量和参数的类型和大小与数据库中表数据列相匹配。4.7使用SELECT语句时,应指出列名,不应使用列的序号或者用“*”替代所有列名。4.8使用INSERT语句时,应指定插入的字段名,不应不指定字段名直接插入VALUES。4.9如果SQL语句连接多表时,应使用表的别名来引用列。示例://正确的示例SELECTlist.manifest_no,list.bill_no,stat.list_statFROMmft_listlist,2list_statstatWHERElist.manifest_no=stat.manifest_noANDlist.bill_no=stat.list_no;4.10SQL语句应避免对大表的全表扫描操作,对大表的操作应尽量使用索引。4.11SQL语句应避免不必要的排序。4.12SQL语句应避免删除全表的操作。4.13应使用变量绑定实现SQL语句共享,避免使用硬编码。示例://红色字体表示书写错误;蓝色字体表示书写正确SELECTemp_nameFROMempWHEREemp_no=:B1;//Bindvalue:123SELECTemp_nameFROMempWHEREemp_no=:B1;//Bindvalue:987SELECTemp_nameFROMempWHEREemp_no=123;SELECTemp_nameFROMempWHEREemp_no=987;4.14在含有子查询的SQL语句中,应减少对表的查询。示例://红色字体表示书写错误;蓝色字体表示书写正确UPDATEempSETemp_cat=(SELECTMAX(category)FROMemp_categories),sal_range=(SELECTMAX(sal_range)FROMemp_categories)WHEREemp_dept=0020;UPDATEempSET(emp_cat,sal_range)=(SELECTMAX(category),MAX(sal_range)FROMemp_categories)WHEREemp_dept=0020;4.15SQL语句尽可能避免多表联合复杂查询。34.16应将SQL语句中的数据库函数、计算表达式等放置在等号右边。4.17应按照业务需要使用事务,同时应保持事务简短,避免大事务。4.18在事务完整性的基础上,SQL语句应在程序中显式使用COMMIT,ROLLBACK,尽快提交事务,释放系统资源。4.19SQL语句应避免频繁引起数据库事务回滚。5PL/SQL书写规则5.1SQL语句的大小写5.1.1SQL语句中出现的所有表名、表别名、字段名、序列等数据库对象都应小写。示例://红色字体表示书写错误;蓝色字体表示书写正确SELECTlist.manifest_no,list.bill_no,STAT.list_statFROMmft_listlist,list_statSTATWHERElist.manifest_no=STAT.manifest_noANDlist.BILL_NO=STAT.list_no;ALTERSEQUENCEMANIFEST_NOCACHE200;SELECTmanifest_no.nextvalFROMDUAL;5.1.2SQL语句中出现的系统保留字、内置函数名、SQL保留字、绑定变量等都应大写。示例://红色字体表示书写错误;蓝色字体表示书写正确SELECTlist.manifest_no,list.list_no,stat.list_statfrommft_listlist,list_statstatwherelist.manifest_no=stat.manifest_noANDlist.bill_no=stat.list_no;INSERTINTOemployees(employee_name,date,4employee_age)VALUES(employees_seq.nextval,'John',to_date(SYSDATE),30);5.2SQL语句的命名5.2.1SQL语句中出现的变量参数应采用Camel语法命名,并反映变量的实际意义。。5.2.2SQL语句中的表别名应简短明了,宜反映表名的实际意义。示例://红色字体表示书写错误;蓝色字体表示书写正确SELECTlist.manifest_no,list.list_no,s.list_statFROMmft_listlist,list_statsWHERElist.manifest_no=s.manifest_noANDlist.bill_no=s.list_no;5.3SQL语句的缩进5.3.1如果一行有多列并超过80个字符,基于列对齐原则,应采用下行缩进。5.3.2缩进应为1个Tab或者4个字符。5.3.3同层次的SQL语句缩进应保持一致(纵向对齐)。示例://存储过程SQL文书写格式的正确示例SELECTresult.dealerCode,ROUND(SUM(result.submitsubletamountdlr+result.submitpartsamountdlr+result.submitlaboramountdlr)/COUNT(*),2)asavg,DECODE(null,'x','xx','CNY')FROM(SELECTtwc.dealerCode,twc.submitsubletamountdlr,twc.submitpartsamountdlr,twc.submitlaboramountdlr5FROMsrv_twc_ftwcWHERE(twc.origsubmittime=TO_DATE('DateRange(start)','yyyy/mm/dd')ANDtwc.origsubmittime=TO_DATE('DateRange(end)','yyyy/mm/dd')ANDNVL(twc.deleteflag,'0')'1')UNIONALLSELECThistory.dealercode,history.submitsubletamountdlr,history.submitpartsamountdlr,history.submitlaboramountdlrFROMsrv_twchistory_fhistoryWHERE(history.origsubmittime=TO_DATE('DateRange(start)','yyyy/mm/dd')ANDhistory.origsubmittime=TO_DATE('DateRange(end)','yyyy/mm/dd')ANDNVL(history.deleteflag,'0')'1'))resultGROUPBYresult.dealerCodeORDERBYavgDESC;)5.4SQL语句的换行5.4.1SELECT/FROM/WHERE/ORDERBY/GROUPBY等子句应独占一行。5.4.2SELECT子句内容如果只有一项,应与SELECT同占一行。5.4.3SELECT子句内容如果多于一项,每一项都应独占一行,并在对应SELECT的基础上向右缩进2个Tab或者8个字符。5.4.4FROM子句内容如果只有一项,应与FROM同占一行。5.4.5FROM子句内容如果多于一项,每一项都应独占一行,并在对应FROM的基础上向右缩进1个Tab或者4个字符。5.4.6WHERE子句内容如果只有一项,应与WHERE同占一行。5.4.7WHERE子句的条件如果有多项,每一个条件应独占一行,并以AND开头,并在对应WHERE的基础上向右缩进1个Tab或者4个字符。示例://SELECT语句书写的正确示例SELECTbill_no,FROMmft_listWHEREmanifest_no=‘000000000000000007’;SELECTlist.manifest_no,list.list_no,stat.list_statFROMmft_listlist,list_statstatWHERE6list.manifest_no=stat.manifest_noANDstat.stat!=2;5.4.8(UPDATE)SET子句内容如果有一项,应与SET同占一行。5.4.9(UPDATE)SET子句内容如果有多项,每一项应独占一行,并在对应SET的基础上向右缩进1个Tab或者4个字符。示例://SELECT语句书写的正确示例UPDATElist_statSETlist_stat='2',parent='0'WHERElist_no='bill010';5.4.10INSERT子句左/右括号以及每个表字段应独占一行,其中括号无缩进,表字段在对应括号的基础上向右缩进1个Tab或者4个字符;5.4.11VALUES子句左/右括号以及每一项的值应独占一行,其中括号无缩进,每一项的值在对应括号的基础上向右缩进1个Tab或者4个字符;。示例://INSERT语句书写的正确示例INSERTINTOlist_stat(list_no,list_stat,parent,manifest_no,div_flag)VALUES('bill020','1','0','000000000000007807','0');5.4.12SQL文中不应出现空行。5.5SQL书写应遵循以下空格规则。5.5.1SQL语句内的算术运算符、逻辑运算符(AND、OR、NOT)、比较运算符(=、=、=、、、、BETWEENAND)、IN、LIKE等运算符前后都应加一空格。5.5.2SQL语句中逗号后应加一空格。7示例://红色字体表示书写错误;蓝色字体表示书写正确SELECTlist.manifest_no,list.list_no,stat.list_statFROMmft_listlist,list_statstatWHERElist.manifest_no=stat.manifest_noANDlist.bill_no=stat.list_no;SELECTCOUNT(DECODE(dept_no,'0020','X',NULL))d0020_count,COUNT(DECODE(dept_no,'0030','X',NULL))d0030_count,SUM(DECODE(dept_no,0020,salary,NULL))d0020_sal,SUM(DECODE(dept_no,0030,salary,NULL))d0030_salFROMempWHEREemp_nameLIKE'SMITH%';5.6不等于应统一使用符号“”。示例://红色字体表示书写错误;蓝色字体表示书写正确SELECTlist.manifest_no,list.list_no,stat.list_stat
本文标题:SQL编写规范
链接地址:https://www.777doc.com/doc-7266042 .html