您好,欢迎访问三七文档
一、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=BandB=CandC=D2、where条件中尽量减少使用常量比较,改用主机变量3、系统可能选择基于规则的优化器,所以将结果集返回数据量小的表作为驱动表(from后边最后一个表)。4、大量的排序操作影响系统性能,所以尽量减少orderby和groupby排序操作。如必须使用排序操作,请遵循如下规则:(1)排序尽量建立在有索引的列上。(2)如结果集不需唯一,使用unionall代替union。5、索引的使用。(1)尽量避免对索引列进行计算。如对索引列计算较多,请提请系统管理员建立函数索引。(2)尽量注意比较值与索引列数据类型的一致性。(3)对于复合索引,SQL语句必须使用主索引列(4)索引中,尽量避免使用NULL。(5)对于索引的比较,尽量避免使用NOT=(!=)(6)查询列和排序列与索引列次序保持一致6、尽量避免相同语句由于书写格式的不同,而导致多次语法分析,尽量使用Bind变量。7、尽量使用共享的SQL语句。8、查询的Where过滤原则,应使过滤记录数最多的条件放在最前面。9、任何对列的操作都将导致表扫描,它包括数据库函数、计算表达式等等,查询时要尽可能将操作移至等号右边。10、in、or子句常会使用工作表,使索引失效;如果不产生大量重复值,可以考虑把子句拆开;拆开的子句中应该包含索引。三、其他经验性规则1、尽量少用嵌套查询。如必须,请用notexist代替notin子句。如例(2)2、用多表连接代替EXISTS子句。如例(3)3、少用DISTINCT,用EXISTS代替如例(4)4、使用UNIONALL、MINUS、INTERSECT提高性能5、使用ROWID提高检索速度。对Select得到的单行记录,需进行Delete、Update操作时,使用ROWID将会使效率大大提高。6、使用优化线索机制进行访问路径控制。7、使用cursor时,显示光标优于隐式光标本规范示例:例一:Selectaka042--单位缴费划入个人帐户比例INTOprm_aaa043FROMka01--医疗保险单位缴费划入个人帐户比例分段信息Whereakc021=rec_kc01.akc021--医疗人员类别ANDaka041=rec_kc01.akc023--年龄上限ANDaka040=prm_dateoraae031ISNULL);--终止时间例二:XSelect......FROMempWheredept_noNOTIN(Selectdept_noFROMdeptWheredept_cat='A');OSelect......FROMempeWhereNOTEXISTS(Select'X'FROMdeptWheredept_no=e.dept_noANDdept_cat='A');例三:XSelect......FROMempWhereEXISTS(Select'X'FROMdeptWheredept_no=e.dept_noANDdept_cat='A');OSelect......FROMempe,deptdWheree.dept_no=d.dept_noANDdept_cat='A';例四:XSelectDISTINCTd.dept_code,d.dept_nameFROMdeptd,empeWheree.dept_code=d.dept_code;OSelectdept_code,dept_nameFROMdeptdWhereEXISTS(Select'X'FROMempeWheree.dept_code=d.dept_code);注释范例过程注释:过程都以sp_开头,注意过程名称要符合令名要求/**************************************************************************name:sp_Write_logparameter:p_textContextinvarchar2参数描述createdate:2003-04-1creater:chenjipingdesc:过程总功能描述****************************************************************************/函数注释函数以f开头,令名符合令名标准/**************************************************************************name:f_Get_JobIdparameter:p_Nameinvarchar2参数描述returnnumber:返回值描述createdate:2003-04-1creater:chenjipingdesc:函数总功能描述
本文标题:SQL书写规范
链接地址:https://www.777doc.com/doc-2860355 .html