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条)