为了便于快速查看SQL书写规范,建议直接浏览书写规范总结。
SQL编写总规范
- SQL语句应正确、规范、高效和最优;
- 同一项目的SQL书写格式应该统一;
- 应避免写非常复杂的SQL语句;
- SQL语句不应在客户端组织,而应在服务器端组织;
- SQL语句的语法应与所使用的数据库相适应;
- 应确保变量和参数的类型和大小与数据库中表数据列相匹配;
- 使用SELECT语句时,应指出列名,不应使用列的序号或者用“*”替代所有列名;
示例:
//正确的示例
SELECT
list.manifest_no,
list.bill_no,
stat.list_stat
FROM mft_list list,
list_stat stat
WHERE list.manifest_no = stat.manifest_no
AND list.bill_no = stat.list_no;
- 使用INSERT语句时,应指定插入的字段名,不应不指定字段名直接插入VALUES;
- 如果 SQL 语句连接多表时,应使用表的别名来引用列;
- SQL语句应避免对大表的全表扫描操作,对大表的操作应尽量使用索引;
- SQL语句应避免不必要的排序;
- SQL语句应避免删除全表的操作;
- 应使用变量绑定实现SQL语句共享,避免使用硬编码;
SELECT emp_name
FROM emp
WHERE emp_no = :B1; //Bind value: 123
SELECT emp_name
FROM emp
WHERE emp_no = :B1; //Bind value: 987
SELECT emp_name
FROM emp
WHERE emp_no = 123;
SELECT emp_name
FROM emp
WHERE emp_no = 987;
- 在含有子查询的SQL语句中,应减少对表的查询;
UPDATE emp
SET emp_cat = (
SELECT MAX(category)
FROM emp_categories),
sal_range = (
SELECT MAX(sal_range)
FROM emp_categories)
WHERE emp_dept = 0020;
UPDATE emp
SET (emp_cat, sal_range) = (
SELECT MAX(category),
MAX(sal_range)
FROM emp_categories)
WHERE emp_dept = 0020;
- SQL语句尽可能避免多表联合复杂查询;
- 应将SQL语句中的数据库函数、计算表达式等放置在等号右边;
- 应按照业务需要使用事务,同时应保持事务简短,避免大事务;
- 在事务完整性的基础上,SQL语句应在程序中显式使用 COMMIT,ROLLBACK,尽快提交事务,释放系统资源;
- SQL语句应避免频繁引起数据库事务回滚。
书写规范总结
1.书写标准
-
缩进
(1) 一般缩进为4个空格。
(2)不要用Tab制表符来作缩进 -
换行
(1)Select/From/Where/Order by/Groupby等子句必须另起一行写。
(2)Select子句内容如果只有一项,与Select同行写。
(3) Select子句内容如果多于一项,每一项单独占一行,在对应Select的基础上向右缩进4空格。
(4) From子句内容如果只有一项,与From同行写。
(5) From子句内容如果多于一项,每一项单独占一行,在对应From的基础上向右缩进4个空格。
(6)Where子句的条件如果有多项,每一个条件占一行,以AND或者OR开头,在对应Where的基础 上向右缩进4个空格。
(7)(Update)Set子句内容每一项单独占一行,无缩进。
(8)Insert子句内容每个表字段单独占一行,无缩进;values每一项单独占一行,无缩进。
(9) SQL文中间不允许出现空行。
(10)存储过程或函数输入参数命名以in开头,如@in_Year;输出参数以out开头,如@out_money;局部变量首字母小写,第二个单词起的每个单词的首字母大写,不使用“_”,如@customerCount; -
空格
(1)连接符or、in、and、以及=、<=、>=等前后加上一个空格;
(2)逗号之后必须接一个空格;
(3)关键字、保留字和左括号之间必须有一个空格。
2.命名规则
常见命名规则有四种样式:完全大写、完全小写、Pascal 大小写和 Camel 大小写。
-
Camel 大小写
标识符的首字母小写,每个后面连接的单词的首字母大写,其余字母小写的书写约定。对于缩写的双字母单词,要求它们出现在标识符首部时全部小写,否则全部大写。
例如:applicationException id -
Pascal 大小写
组成标识符的每个单词的首字母大写,其余字母小写的书写约定。对于缩写的双字母单词,要求全部大写。
例如:ApplicationExceptionID -
匈牙利命名法
匈牙利命名法由匈牙利程序员发明,他在微软工作了多年,此命名法就是通过微软的各种产品和文档传出来。多数有经验的程序员,不管他们用的是哪门语言,都或多或少在使用它。
基本原则:变量名 = 属性 + 类型 + 对象描述
即一个变量名是由三部分信息组成,这样,程序员很容易理解变量的类型、用途,而且便于记忆。
3.注释
(1) 对较为复杂的SQL语句加上注释,说明算法、功能。注释风格:注释单独成行、放在语句前面。
(2) 应对不易理解的分支条件表达式加注释。
(3) 对重要的计算应说明其功能。
(4) 过长的函数实现,应将其语句按实现的功能分段加以概括性说明。
(5) 常量及变量注释时,应注释被保存值的含义(必须),合法取值的范围(可选)。
(6) 可采用单行/多行注释。(-- 或 /**/)
A.代码头部注释
在SQL代码块(sql文件或存储过程)的头部进行注释,标注创建人(Author)、创始日期(Create date)、修改信息(Modify [n])。
格式:
– =============================================
– Author:
– Create date:
– Description:
– Modify [n]: < Modifier,Date, Description >
– =============================================
注:日期格式使用 yyyy-MM-dd。Modify [n] n代表修改序号,从1开始,每次修改加1。
B.TRANSACTION注释
建议在每个事务的开头进行注释,说明该事务的功能。
– < Modifier,Date, Description >
BEGIN TRANSACTION;
4.书写规则补充
- SQL 语句要以分号;结尾
- SQL 语句不区分大小写
- SQL 不区分关键字的大小写。例如,不管写成 SELECT 还是 select,解释都是一样的。表名和列名也是如此。
- 虽然可以根据个人喜好选择大写还是小写(或大小写混杂),但为了理解起来更加容易,经常使用一下规则:
- 关键字大写
- 数据库名、表名和列名等小写
3. 常数的书写方式是固定的:
- SQL 语句中含有字符串的时候,需要像 ‘abc’ 这样,使用英文单引号’将字符串括起来,用来标识这是一个字符串
- SQL 语句中含有日期的时候,同样需要使用英文单引号将其括起来。日期的格式有很多种(‘26 Jan 2010’ 或者’10/01/26’ 或者 '2020-01-26’等)
- 在 SQL 语句中书写数字的时候,不需要使用任何符号标识,直接写成 1000 这样的数字即可
- PS:
列名、表名不是字符串,不能使用单引号。可以用倒引号 ` 把表名和列名括起来。
- 单词需要用半角空格或者换行来分隔:
- SQL 语句的单词之间必须使用半角空格(英文空格)或换行符来进行分隔。没有分隔的语句会发生错误,无法正常执行
- SQL 语句中的标点符号必须都是英文状态下的,即半角字;不能使用全角空格(中文空格)作为单词的分隔符,否则会发生错误,出现无法预期的结果。
SQL书写规范(详细)
- SQL语句中出现的所有表名、表别名、字段名、序列等数据库对象都应小写;
- SQL 语句中出现的系统保留字、内置函数名、SQL保留字、绑定变量等都应大写;
- SQL语句中出现的变量参数应采用Camel语法命名,并反映变量的实际意义;
- SQL语句中的表别名应简短明了,宜反映表名的实际意义;
- 如果一行有多列并超过80个字符,基于列对齐原则,应采用下行缩进;
- 缩进应为1个Tab或者4个字符;
- 同层次的SQL语句缩进应保持一致(纵向对齐);
//存储过程SQL文书写格式的正确示例
SELECT result.dealerCode,
ROUND (SUM (result.submitsubletamountdlr + result.submitpartsamountdlr
+ result.submitlaboramountdlr) / COUNT (*), 2) as avg,
DECODE (null, 'x', 'xx', 'CNY')
FROM (SELECT twc.dealerCode,
twc.submitsubletamountdlr,
twc.submitpartsamountdlr,
twc.submitlaboramountdlr
FROM srv_twc_f twc
WHERE (twc.origsubmittime >= TO_DATE ('Date Range(start)','yyyy/mm/dd')
AND twc.origsubmittime <= TO_DATE ('Date Range(end)','yyyy/mm/dd')
AND NVL (twc.deleteflag, '0') <> '1')
UNION ALL
SELECT history.dealercode,
history.submitsubletamountdlr,
history.submitpartsamountdlr,
history.submitlaboramountdlr
FROM srv_twchistory_f history
WHERE (history.origsubmittime >= TO_DATE ('Date Range(start)', 'yyyy/mm/dd')
AND history.origsubmittime <= TO_DATE ('Date Range(end)','yyyy/mm/dd')
AND NVL (history.deleteflag,'0') <> '1')) result
GROUP BY result.dealerCode
ORDER BY avg DESC);
- SELECT/FROM/WHERE/ORDER BY/GROUP BY等子句应独占一行;
- SELECT子句内容如果只有一项,应与 SELECT 同占一行;
- SELECT子句内容如果多于一项,每一项都应独占一行,并在对应 SELECT的基础上向右缩进2个Tab或者8个字符;
- FROM子句内容如果只有一项,应与 FROM同占一行;
- FROM子句内容如果多于一项,每一项都应独占一行,并在对应FROM的基础上向右缩进1个Tab或者4个字符;
- WHERE子句内容如果只有一项,应与 WHERE同占一行;
- WHERE子句的条件如果有多项,每一个条件应独占一行,并以AND开头,并在对应WHERE的基础上向右缩进1个Tab或者4个字符;
//SELECT语句书写的正确示例
SELECT bill_no,
FROM mft_list
WHERE manifest_no =‘000000000000000007’;
SELECT list.manifest_no,
list.list_no,
stat.list_stat
FROM mft_list list,
list_stat stat
WHERE list.manifest_no = stat.manifest_no
AND stat.stat != 2;
- (UPDATE)SET子句内容如果有一项,应与 SET同占一行;
- (UPDATE)SET子句内容如果有多项,每一项应独占一行,并在对应SET的基础上向右缩进1个Tab或者4个字符;
//SELECT语句书写的正确示例
UPDATE list_stat
SET list_stat = '2',
parent = '0'
WHERE list_no = 'bill010';
- INSERT 子句左/右括号以及每个表字段应独占一行,其中括号无缩进,表字段在对应括号的基础上向右缩进1个Tab或者4个字符;
- VALUES子句左/右括号以及每一项的值应独占一行,其中括号无缩进,每一项的值在对应括号的基础上向右缩进1个Tab或者4个字符;
//INSERT语句书写的正确示例
INSERT INTO list_stat
(
list_no,
list_stat,
parent,
manifest_no,
div_flag
)
VALUES
(
'bill020',
'1',
'0',
'000000000000007807',
'0'
);
- SQL 文中不应出现空行;
- SQL语句内的算术运算符、逻辑运算符(AND、OR、NOT)、 比较运算符(=、<=、>=、>、<、<>、BETWEEN AND)、IN、LIKE等运算符前后都应加一空格;
- SQL 语句中逗号后应加一空格;
- 不等于应统一使用符号“<>”;
仅为片面整理总结,欢迎补充!