您的位置:首页 > 数据库

SQL编程规范

2016-03-25 09:11 399 查看
1.原则

首先为人编写程序,其次才是计算机,只有易读、易维护的软件代码才是有生命力的。

保持代码的简明清晰,避免过分的编程技巧,否则会降低程序的可读性。

关键字的大写或小写保持统一,字段的大写或小写也要保持统一

尽可能复用、修正老的代码,可以很大的提高效率。如查询作为一个方法,查询的条件作为方法的参数是一个重用度很高的办法。

尽量减少同样的错误出现的次数,坚持零缺陷的开发思想,良好的编程习惯。

完整的代码注释

2. SQL格式

表名与字段名大小写要统一。建议大写。 SQL在内部解析时,如果是完全一样的SQL(包括大小写、空格),不用重复解析,可提高效率。

禁止使用制表符(TAB键),必须使用空格进行缩排。缩进为4个空格。

所有关键字要另起一行开始。

运算符两侧都要留空格

3. 规则

禁止在查询中使用*(ORACLE)。 ORACLE 在解析的过程中, 会将'*' 依次转换成所有的列名, 这个工作是通过查询数据字典完成的, 这意味着将耗费更多的时间。

使用count(索引字段)代替count(1)或count(*)。 ????

涉及到多表检索时,明确地为每个字段指定表名。 一来可以减少解析时间,而来可以避免由于歧义引起的语法错误。

可以过滤掉最大数量记录的条件必须写在WHERE子句末尾(ORACLE)。 ORACLE 采用自下而上的顺序解析WHERE 子句

在进行多个表连接时,FROM中的表的顺序要按照记录数由多到少的顺序来排列(ORACLE)

去掉没有意义的GROUP BY、ORDER BY子语,如使用则必须对索引列排序, 而且排序不能建立在可以为NULL的列上

有使用IN或者EXISTS的语句吗? 使用本身是没有问题的,但是需要确认。如果这样的SQL耗时的话,能否用EXISTS代替IN,或者用IN代替EXISTS,通过改写或许可以使SQL变快,视具体情况来定

适用于T2表数据较少的情况:

SELECT * FROM T1 WHERE X IN (SELECT Y FROM T2)

适用于T2表数据较多的情况(EXISTS引起T1的全表扫描):

SELECT * FROM T1 WHERE X EXISTS (SELECT Y FROM T2)

t2数据量巨大且索引情况不好(大量重复值等),则不宜使用产生对t2的DISTINCT检索而导致系统开支巨大的IN操作,反之当t1表数据量巨大(不受索引影响)而t2表数据较少且索引良好则不宜使用引起t1全表扫描的EXISTS操作。

通常EXISTS比IN快。

EXISTS只返回TRUE和False,不返回列表的值。

EXISTS先查外表再判断内查询,IN先执行内查询再进行外表查询

EXISTS断是否有记录,IN判断一个字段是否存在于几个值的范围中

使用表连接替换EXIST或IN ***

WHERE语句中不要使用NOT IN。在子查询中,NOT IN 子句将执行一个内部的排序和合并. 无论在哪种情况下,NOT IN 都是最低效的 (因为它对子查询中的表执行了一个全表遍历). 为了避免使用NOT IN ,我们可以把它改写成外连接(Outer Joins)或NOT EXISTS.

对于索引列不要使用函数和计算式

尽可能将操作移至等号右边

索引只做成[有]的数据。调整成不执行NULL检索的SQL,或者修改表的定义。

对于索引列不要执行NULL值的检索。索引只做成[有]的数据。调整成不执行NULL检索的SQL,或者修改表的定义。

对于索引列,不要使用"NOT"、"!="、"<>"比较运算

禁止改变索引字段类型,类型转换要显示标出,不能隐式转换数据类型。 因为内部发生的类型转换, 这个索引将不会被用到。 注意当字符和数值比较时, ORACLE 会优先转换数值类型到字符类型。

尽量避免较多地使用子查询。必须用子查询的时候,在子查询里写尽量多条件,使得子查询返回的行数尽量少

减少数据库的访问次数,如需循环,在程序中处理
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: