Your Ad Here
首页 | 编程语言 | 网站建设 | 游戏天堂 | 冲浪宝典 | 网络安全 | 操作系统 | 软件时空 | 硬件指南 | 病毒相关 | IT 认证
软讯网络 > 冲浪宝典 > 网络资源 > SQL编程规范
【标  题】:SQL编程规范
【关键字】:SQL
【来  源】:http://blog.chinaunix.net/article.php?articleId=18530&blogId=4415

SQL编程规范

Your Ad Here

一、sql书写规范:

二、书写优化性能建议

三、其他经验性规则

一、sql书写规范:

1、sql语句的所有表名、字段名全部小写,系统保留字、内置函数名、sql保留字大写。

2、连接符or、in、and、以及=、<=、>=等前后加上一个空格。

3、对较为复杂的sql语句加上注释,说明算法、功能。

注释风格:注释单独成行、放在语句前面。
(1) 应对不易理解的分支条件表达式加注释;
(2) 对重要的计算应说明其功能;
(3) 过长的函数实现,应将其语句按实现的功能分段加以概括性说明;
(4) 每条SQL语句均应有注释说明(表名、字段名)。
(5) 常量及变量注释时,应注释被保存值的含义(必须),合法取值的范围(可选)
(6) 可采用单行/多行注释。(-- 或 /* */ 方式)

4、SQL语句的缩进风格

(1) 一行有多列,超过80个字符时,基于列对齐原则,采用下行缩进
(2) where子句书写时,每个条件占一行,语句令起一行时,以保留字或者连接符开始,连接符右对齐。

5、多表连接时,使用表的别名来引用列。

6、供别的文件或函数调用的函数,绝不应使用全局变量交换数据;

如例(1)


二、书写优化性能建议

1、避免嵌套连接。例如:A = B and B = C and C = D

2、where条件中尽量减少使用常量比较,改用主机变量

3、系统可能选择基于规则的优化器,所以将结果集返回数据量小的表作为驱动表(from后边最后一个表)。

4、大量的排序操作影响系统性能,所以尽量减少order by和group by排序操作。

如必须使用排序操作,请遵循如下规则:

(1) 排序尽量建立在有索引的列上。
(2) 如结果集不需唯一,使用union all代替union。

5、索引的使用。

(1) 尽量避免对索引列进行计算。如对索引列计算较多,请提请系统管理员建立函数索引。
(2) 尽量注意比较值与索引列数据类型的一致性。
(3) 对于复合索引,SQL语句必须使用主索引列
(4) 索引中,尽量避免使用NULL。
(5) 对于索引的比较,尽量避免使用NOT=(!=)
(6) 查询列和排序列与索引列次序保持一致

6、尽量避免相同语句由于书写格式的不同,而导致多次语法分析。

7、尽量使用共享的SQL语句。

8、查询的WHERE过滤原则,应使过滤记录数最多的条件放在最前面。

9、任何对列的操作都将导致表扫描,它包括数据库函数、计算表达式等等,查询时要尽可能将操作移至等号右边。

10、in、or子句常会使用工作表,使索引失效;如果不产生大量重复值,可以考虑把子句拆开;拆开的子句中应该包含索引。

三、其他经验性规则

1、尽量少用嵌套查询。如必须,请用not exist代替not in子句。如例(2)

2、用多表连接代替EXISTS子句。如例(3)

3、少用DISTINCT,用EXISTS代替 如例(4)

4、使用UNION ALL、MINUS、INTERSECT提高性能

5、使用ROWID提高检索速度。对SELECT得到的单行记录,需进行DELETE、UPDATE操作时,使用ROWID将会使效率大大提高。

6、使用优化线索机制进行访问路径控制。

7、使用cursor时,显示光标优于隐式光标

本规范示例:

例一:
SELECT aka042 -- 单位缴费划入个人帐户比例
INTO prm_aaa043
FROM ka01 --医疗保险单位缴费划入个人帐户比例分段信息
WHERE akc021 = rec_kc01.akc021 -- 医疗人员类别
AND aka041 >= rec_kc01.akc023 -- 年龄上限
AND aka040 <= rec_kc01.akc023 -- 年龄下限
AND aae030 <= prm_date -- 开始时间
AND ( aae031 >= prm_date OR aae031 IS NULL ); -- 终止时间

例二:
X SELECT ......
FROM emp
WHERE dept_no NOT IN ( SELECT dept_no
FROM dept
WHERE dept_cat='A');

O SELECT ......
FROM emp e
WHERE NOT EXISTS ( SELECT 'X'
FROM dept
WHERE dept_no=e.dept_no
AND dept_cat='A');

例三:
X SELECT ......
FROM emp
WHERE EXISTS ( SELECT 'X'
FROM dept
WHERE dept_no=e.dept_no
AND dept_cat='A');

O SELECT ......
FROM emp e,dept d
WHERE e.dept_no=d.dept_no
AND dept_cat='A';

例四:
X SELECT DISTINCT d.dept_code,d.dept_name
FROM dept d ,emp e
WHERE e.dept_code=d.dept_code;

O SELECT dept_code,dept_name
FROM dept d
WHERE EXISTS ( SELECT 'X'
FROM emp e
WHERE e.dept_code=d.dept_code);

JDBC接口技术一瞥:【上一篇】
SQLServer基本函数:【下一篇】
【相关文章】
  • mysql replication方案
  • 精妙SQL语句介绍<转>
  • 解决phpmyadmin不能登录的问题 (mysql.4.1.x)
  • 全面接触SQL语法<转>
  • 微软重新确认SQL Server 2005发布日期
  • “2005 MySQL用户大会”值得期待
  • SQL SERVER2000学习笔记
  • MySQL数据库接口的VC实现与应用
  • 使用 SQL Server 时需要经常用到的几个设置选项
  • MySQL和Red Hat“夫唱妇随”
  • 【随机文章】
  • 在这里感谢henrwy,Edea[BCG]两位大哥的帮忙使我在休息日又破了一叫ssbuilder的软件(2)
  • C语言学习零碎整理(3):sprintf函数(ZT)
  • 广州地铁局域网和城域网解决方案(14)
  • 从Google Toolbar 4.0 Beta看搜索引擎的发展
  • 现在开始可以直接注册Google Analytics
  • IP碎片重组过程分析
  • 少发牢骚,多干实事
  • AI标志实例设计初步:水滴造型
  • 完全用户自定义数据处理的探讨
  • 单 片 机 教 学
  • 【相关评论】
    没有相关评论
    【发表评论】
    姓名:
    邮件:
    随机码*
    评论*
          
    |  首 页  |  版权声明  |  联系我们   |  网站地图  |
    CopyRight © 2004-2007 bbb软讯网络 All Rigths Reserved.