【MySQL】SQL语句书写规范,让代码更优雅

为了便于快速查看SQL书写规范,建议直接浏览书写规范总结

SQL编写总规范

  1. SQL语句应正确、规范、高效和最优;
  2. 同一项目的SQL书写格式应该统一;
  3. 应避免写非常复杂的SQL语句;
  4. SQL语句不应在客户端组织,而应在服务器端组织;
  5. SQL语句的语法应与所使用的数据库相适应;
  6. 应确保变量和参数的类型和大小与数据库中表数据列相匹配;
  7. 使用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;
  1. 使用INSERT语句时,应指定插入的字段名,不应不指定字段名直接插入VALUES;
  2. 如果 SQL 语句连接多表时,应使用表的别名来引用列;
  3. SQL语句应避免对大表的全表扫描操作,对大表的操作应尽量使用索引;
  4. SQL语句应避免不必要的排序;
  5. SQL语句应避免删除全表的操作;
  6. 应使用变量绑定实现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;
  1. 在含有子查询的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;
  1. SQL语句尽可能避免多表联合复杂查询;
  2. 应将SQL语句中的数据库函数、计算表达式等放置在等号右边;
  3. 应按照业务需要使用事务,同时应保持事务简短,避免大事务;
  4. 在事务完整性的基础上,SQL语句应在程序中显式使用 COMMIT,ROLLBACK,尽快提交事务,释放系统资源;
  5. SQL语句应避免频繁引起数据库事务回滚。

书写规范总结

1.书写标准

  1. 缩进
    (1) 一般缩进为4个空格。
    (2)不要用Tab制表符来作缩进

  2. 换行
    (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;

  3. 空格
    (1)连接符or、in、and、以及=、<=、>=等前后加上一个空格;
    (2)逗号之后必须接一个空格;
    (3)关键字、保留字和左括号之间必须有一个空格。

2.命名规则

常见命名规则有四种样式:完全大写、完全小写、Pascal 大小写和 Camel 大小写。

  1. Camel 大小写
    标识符的首字母小写,每个后面连接的单词的首字母大写,其余字母小写的书写约定。对于缩写的双字母单词,要求它们出现在标识符首部时全部小写,否则全部大写。
    例如:applicationException id

  2. Pascal 大小写
    组成标识符的每个单词的首字母大写,其余字母小写的书写约定。对于缩写的双字母单词,要求全部大写。
    例如:ApplicationExceptionID

  3. 匈牙利命名法
    匈牙利命名法由匈牙利程序员发明,他在微软工作了多年,此命名法就是通过微软的各种产品和文档传出来。多数有经验的程序员,不管他们用的是哪门语言,都或多或少在使用它。
    基本原则:变量名 = 属性 + 类型 + 对象描述
    即一个变量名是由三部分信息组成,这样,程序员很容易理解变量的类型、用途,而且便于记忆。

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.书写规则补充

  1. SQL 语句要以分号;结尾
  2. SQL 语句不区分大小写
    • SQL 不区分关键字的大小写。例如,不管写成 SELECT 还是 select,解释都是一样的。表名和列名也是如此。
    • 虽然可以根据个人喜好选择大写还是小写(或大小写混杂),但为了理解起来更加容易,经常使用一下规则:
      • 关键字大写
      • 数据库名、表名和列名等小写

3. 常数的书写方式是固定的:

  • SQL 语句中含有字符串的时候,需要像 ‘abc’ 这样,使用英文单引号’将字符串括起来,用来标识这是一个字符串
    • SQL 语句中含有日期的时候,同样需要使用英文单引号将其括起来。日期的格式有很多种(‘26 Jan 2010’ 或者’10/01/26’ 或者 '2020-01-26’等)
    • 在 SQL 语句中书写数字的时候,不需要使用任何符号标识,直接写成 1000 这样的数字即可
    • PS:
      列名、表名不是字符串,不能使用单引号。可以用倒引号 ` 把表名和列名括起来。
  1. 单词需要用半角空格或者换行来分隔:
  • SQL 语句的单词之间必须使用半角空格(英文空格)或换行符来进行分隔。没有分隔的语句会发生错误,无法正常执行
  • SQL 语句中的标点符号必须都是英文状态下的,即半角字;不能使用全角空格(中文空格)作为单词的分隔符,否则会发生错误,出现无法预期的结果。

SQL书写规范(详细)

  1. SQL语句中出现的所有表名、表别名、字段名、序列等数据库对象都应小写;
  2. SQL 语句中出现的系统保留字、内置函数名、SQL保留字、绑定变量等都应大写;
  3. SQL语句中出现的变量参数应采用Camel语法命名,并反映变量的实际意义;
  4. SQL语句中的表别名应简短明了,宜反映表名的实际意义;
  5. 如果一行有多列并超过80个字符,基于列对齐原则,应采用下行缩进;
  6. 缩进应为1个Tab或者4个字符;
  7. 同层次的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);
  1. SELECT/FROM/WHERE/ORDER BY/GROUP BY等子句应独占一行;
  2. SELECT子句内容如果只有一项,应与 SELECT 同占一行;
  3. SELECT子句内容如果多于一项,每一项都应独占一行,并在对应 SELECT的基础上向右缩进2个Tab或者8个字符;
  4. FROM子句内容如果只有一项,应与 FROM同占一行;
  5. FROM子句内容如果多于一项,每一项都应独占一行,并在对应FROM的基础上向右缩进1个Tab或者4个字符;
  6. WHERE子句内容如果只有一项,应与 WHERE同占一行;
  7. 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;
  1. (UPDATE)SET子句内容如果有一项,应与 SET同占一行;
  2. (UPDATE)SET子句内容如果有多项,每一项应独占一行,并在对应SET的基础上向右缩进1个Tab或者4个字符;
//SELECT语句书写的正确示例
UPDATE  list_stat
SET list_stat = '2', 
    parent = '0'
WHERE list_no = 'bill010';
  1. INSERT 子句左/右括号以及每个表字段应独占一行,其中括号无缩进,表字段在对应括号的基础上向右缩进1个Tab或者4个字符;
  2. VALUES子句左/右括号以及每一项的值应独占一行,其中括号无缩进,每一项的值在对应括号的基础上向右缩进1个Tab或者4个字符;
//INSERT语句书写的正确示例
INSERT INTO list_stat
( 
    list_no,
   list_stat,
   parent, 
   manifest_no, 
   div_flag
)
VALUES
( 
    'bill020',
    '1',
    '0',
   '000000000000007807',  
    '0'
);
  1. SQL 文中不应出现空行;
  2. SQL语句内的算术运算符、逻辑运算符(AND、OR、NOT)、 比较运算符(=、<=、>=、>、<、<>、BETWEEN AND)、IN、LIKE等运算符前后都应加一空格;
  3. SQL 语句中逗号后应加一空格;
  4. 不等于应统一使用符号“<>”;

仅为片面整理总结,欢迎补充!

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: MySQL阿里巴巴开发规范是阿里巴巴公司在使用MySQL数据库时所制定的一套规范和标准,旨在提高数据库开发的效率和可维护性,确保数据库设计和使用的一致性。 该开发规范主要包括以下几个方面: 1. 命名规范:规定了表、字段、索引等命名的统一规则,使命名规范清晰、易于理解和维护。 2. 数据类型选择:对于不同类型的数据,规范指定了应该选择的最佳数据类型,以减少存储空间、提高查询效率。 3. 索引规范规范了索引的创建和使用规则,包括何时应该创建索引、如何选择合适的索引、避免创建过多的索引等。 4. SQL语句规范:对常用的SQL语句进行了规范,包括SELECT、INSERT、UPDATE、DELETE等操作的书写格式、参数的使用等,以提高SQL语句的可读性和可维护性。 5. 安全规范:包括数据库的访问控制、权限管理,以及对敏感数据的保护等,确保数据库的安全性和可信度。 6. 性能优化规范:对于大数据量的表和复杂的查询,规范提供了一些性能优化的建议和注意事项,以提高数据库的查询速度和响应性能。 通过遵循阿里巴巴的MySQL开发规范,团队成员能够好地协同开发、维护数据库,提高数据库设计和使用的质量和效率,并减少潜在的安全隐患。这样的规范不仅适用于阿里巴巴公司内部,也可以为其他企业提供参考和借鉴。 ### 回答2: MySQL阿里巴巴开发规范是由阿里巴巴集团提出的一套用于MySQL数据库开发的规范和最佳实践。它的目的是帮助开发人员编写高质量、高效、可维护的MySQL代码,并提供一致性和标准化的开发模式。 该规范覆盖了MySQL的各个方面,涵盖了数据库设计、SQL编写、性能优化、安全性等内容。下面是一些阿里巴巴MySQL开发规范的要点: 1. 数据库设计:规范化数据库结构,确保每个表都有主键,并建立合适的索引来优化查询性能。 2. SQL编写:避免使用SELECT *,尽量减少不必要的数据库交互,使用行级锁来提高并发性能。 3. 数据类型选择:选择恰当的数据类型,避免使用字符类型存储数值数据,减少存储空间和查询时间。 4. 查询优化:合理使用索引,避免全表扫描,使用联合索引来提高查询效率。 5. 事务处理:合理划分事务范围,减少事务嵌套,避免长事务对数据库性能的影响。 6. 安全性:严格授权和鉴权,限制用户对数据库的操作权限,防止安全漏洞。 7. 性能监控:定期进行数据库性能监控和优化,保持数据库的健康运行。 遵守阿里巴巴MySQL开发规范可以提高代码的可维护性和性能,避免出现常见的数据库开发问题和安全漏洞。同时,这也有助于统一团队的开发标准,提高协作效率和代码质量。 ### 回答3: MySQL阿里巴巴开发规范是指阿里巴巴集团在MySQL数据库开发方面的规范与最佳实践。 首先,在数据库设计方面,规范要求遵循3NF(第三正则形式)范式,避免数据冗余和数据不一致。表的命名要简洁明了,采用小写字母和下划线的组合,避免使用特殊字符和关键字。字段的命名要具有可读性和一致性,使用英文单词或者简写,避免使用拼音或者缩写。 其次,在SQL语句编写方面,规范要求使用带有注释的格式SQL语句,便于维护和阅读。SQL语句要避免使用SELECT *,而是明确指定需要查询的字段,减少查询的数据量和提高查询性能。另外,要注意在使用JOIN连接表时,避免使用笛卡尔积,应使用合适的索引来优化查询。 此外,在事务处理方面,阿里巴巴开发规范要求进行合理的事务管理,避免长事务和悬挂事务的出现。在事务处理时要注意合理设置事务隔离级别,并确保事务的原子性、一致性、隔离性和持久性。 最后,在性能调优方面,规范要求合理使用索引来提高查询性能,避免创建过多的冗余索引。同时,要合理设置MySQL的参数配置,根据实际情况进行优化。并定期进行性能监控和性能调优,以确保数据库的高可用性和高性能。 总结而言,MySQL阿里巴巴开发规范着重强调数据库设计、SQL编写、事务处理和性能调优等方面的规范与最佳实践,以提高数据库的可维护性、可靠性和性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Itfuture03

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值