SQL编码规范

SQL编码规范

2023年6月27日发(作者:)

SQL编码规范

XXX科技有限公司 SQL编码规范

变更记录

版本号

V1.0

修改点说明

创建

变更日期

变更人

审批人

修改点说明的内容有如下几种:创建、修改(+修改说明)、删除(+删除说明)

XXX科技有限公司 SQL编码规范

目 录

1 编写目的 ............................................................................. 1

2 SQL书写规范 ......................................................................... 1

3 SQL编写原则 ......................................................................... 1

XXX科技有限公司 SQL编码规范

1 编写目的

编写本文档的目的是保证在开发过程中产出高效、格式统一、易阅读、易维护的SQL代码。

2 SQL书写规范

SQL语句在程序中一般以字符串的形式出现,现对程序中的SQL书写做以下约定。

1) 代码中出现的SQL语句包括(字段名,表名,SQL关键字、保留字)均应采用大写形式;

2) 避免在代码中,使用循环语句多次执行数据库查询;

3) 用于查询/更新/删除的SQL,WHERE条件固定的,必须使用预编译方式;

4) 对SQL语句加上适当的注释,特别是对语句上出现的枚举值要标明其含义;

5) 合理使用空格和缩进,保证SQL语句结构清晰;

 在SQL内置运算符前后加上空格;

 在SQL关键字、保留字前后都要有空格;

 拼接SQL时,新一行加上空格;

6) SQL语句较长时,应把SQL语句放在一个方法内;

 在每一个子句及逻辑判断占一行;

 对子查询使用缩进,一般为4个字符;

 SQL语句应该保持在80行以内;

7) 代码中严禁使用SELECT * 代替具体的字段名。在做插入SQL时,必须列出要插入表的字段名。不允许出现类似如下SQL:

INSERT INTO TABLE_NAME1

SELECT * FROM TABLE_NAME2 WHERE ……;

8) 代码中定义的SQL,如果为定长SQL,必须定义为final static 类型。如果SQL中有特殊业务含义的值的引用,要加上注释说明如:

举例:下面是修改一个用户状态的SQL语句

// STATUS =’11’ 其中‘11’代表用户正常状态

final static String updateUserStatusSql=”UPDATE PUB_USERS SET

STATUS=’11’ WHERE USER_ID=’superadmin’”

3 SQL编写原则

1) 多表查询,要使用别名;

2) 多表关联效率优化

 大数量的表和数据量非常小的表不宜直接做关联,可以考虑通过程序或子查询的方式先处理小表,根据获取的数据,再检索大表。

 WHERE 条件顺序

XXX科技有限公司 1 SQL编码规范

SQL解析器采用自下而上的顺序解析WHERE子句,建议将表之间的连接放在其他条件之前,将可以过滤掉最大数量记录的条件放在WHERE 子句的末尾。

--低效SQL,执行时间156.3秒

SELECT *

FROM EMP E

WHERE SAL > 50000

AND JOB = 'MANAGER'

AND 25 < (SELECT COUNT(*) FROM EMP WHERE MGR = );

--高效SQL,执行时间10.6秒

SELECT *

FROM EMP E

WHERE 25 < (SELECT COUNT(*) FROM EMP WHERE MGR = )

AND SAL > 50000

AND JOB = 'MANAGER';

 FROM子句顺序(选择基础表):

SQL解析器采用自右而左的顺序解析FROM子句的表名,在FROM最后的表为基础表(DRIVING TABLE),选择基础表有如下几种情况:

➢ 如果存在交叉表,则用交叉表作为基础表。

➢ 如果存在记录上的数据量差异,记录较少的表作为基础表。

3) 不要对索引列使用函数

对索引列使用函数会使索引失效,导致查询性能比较低。

4) 对较长的SQL要进行执行计划分析,对于在系统使用比较复杂的sql,需要与有经验的人或技术经理讨论。

5) 使用IN语句时,要确保IN中的数据不能超过1000。

6) 表连接及EXISTS使用

使用表连接及EXISTS

SELECT EMP_NAME

FROM EMP WHERE(EMP_CAT, SAL_RANGE) =

(SELECT MAX(CATEGORY),MAX(SAL_RANGE)

FROM EMP_CATEGORIES) AND EMP_DEPT = 0020;

SELECT EMP_NAME

FROM EMP

WHERE EMP_CAT = (SELECT MAX(CATEGORY) FROM

EMP_CATEGORIES)

AND SAL_RANGE = (SELECT MAX(SAL_RANGE)

FROM EMP_CATEGORIES) AND EMP_DEPT = 0020;

✓ 使用EXISTS替代表连接

SELECT *

FROM DEPT D, EMP E

WHERE _NO = _NO

AND _TYPE = 'MANAGER'

AND _CAT = 'A';

SELECT *

FROM EMP E

WHERE EXISTS (SELECT 'X'

XXX科技有限公司 2 SQL编码规范

FROM DEPT

WHERE DEPT_NO = _NO

AND DEPT_CAT = 'A')

AND _TYPE = 'MANAGER';

SELECT *

FROM DEPT D, EMP E

WHERE _NO = _NO

AND (_TYPE = 'MANAGER' OR _CAT = 'A');

SELECT *

FROM EMP E

WHERE _TYPE = 'MANAGER'

OR EXISTS (SELECT 'X'

FROM DEPT

WHERE DEPT_NO = _NO

AND DEPT_CAT = 'A');

✓ 使用EXISTS代替DISTINCT语句

SELECT DISTINCT _NO, _NAME

FROM DEPT D, EMP E

WHERE _NO = _NO;

SELECT _NO, _NAME

FROM DEPT D

WHERE EXISTS (

SELECT 'X' FROM EMP E

WHERE _NO = _NO);

7) 不准使用CROSS JOIN,使用OUTER,INNER JOIN

8) 使用NOT EXISTS代替NOT IN语句

SELECT *

FROM EMP

WHERE DEPT_NO NOT IN

(SELECT DEPT_NO FROM DEPT WHERE DEPT_CAT = 'A');

SELECT *

FROM EMP E

WHERE NOT EXISTS (SELECT 'X'

FROM DEPT

WHERE DEPT_NO = _NO

AND DEPT_CAT = 'A');

9) UNION ALL 与UNION 的使用

UNION ALL 是将多个查询语句,查询列意义相同并且一一对应,在一起执行。

UNION ALL 与UNION的区别是UNION会对查询出的多个结果集做DISTINCT操作。而UNION

ALL 不会。因此在查询性能上,UNION ALL 会比UNION快很多。

因此在使用时要根据情况,看是否多个sql查询出的结果是否会有重复行,如果没有或业务上不关注重复,建议使用UNION ALL语法。

XXX科技有限公司 3

发布者:admin,转转请注明出处:http://www.yc00.com/xiaochengxu/1687817267a47718.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信