《锋利的SQL(第2版)》——1.9 SQL书写规范

简介:

本节书摘来自异步社区出版社《锋利的SQL(第2版)》一书中的第1章,第1.9节,作者:张洪举 王晓文,更多章节内容可以访问云栖社区“异步社区”公众号查看。

1.9 SQL书写规范

锋利的SQL(第2版)
书写规范与语法规范是两个完全不同的概念,违反语法规范会导致程序执行错误,而违反书写规范虽然不会导致错误,但是会导致阅读困难和代码的通用性。这些书写规范是根据大多数人阅读代码时的习惯而提出的,并不是必须完全遵守的。

1.9.1 大小写规范

1.在名称中仅使用字母、数字和下划线
之所以要在名称中仅使用字母、数字和下划线,因为这些字符可以被移植到任何其他编程语言中。在应用程序的数据库和宿主语言中能够使用相同的名称,会非常方便。

但是,也存在一些特殊情况。例如,在SQL Server中临时表名称需要以“#”开头,而它在其他编程语言中具有特殊含义。如果必须使用临时表,则只能使用“#”。此外,参数名称也存在这种情况,它需要以“@”开头。但是,无论怎样,在名称中尽量避免使用特殊符号是一个非常正确的选择。

不要将下划线作为名称的第一个或最后一个字母,因为这看上去像少了一部分一样。

2.列名、参数和变量等标量小写
通常情况下,小写单词比大写容易阅读。曾经做过测试,阅读小写文本的速度比大写的速度快5%~10%。当名称由两个单词组合而成时,为便于阅读,应当采用大小写混合的写法。例如,下面按由易至难的方式列出了存放修改日期列的三种书写方法:

ModifiedDate   -- 比较容易阅读
modifieddate   -- 阅读难度增加
MODIFIEDDATE   -- 阅读最困难

但是,也有一种观点认为大小写混合的写法阅读起来比全部小写要难一些,原因是在全部小写的情况下,会把modifieddate看作一个单词,而ModifiedDate这种形式会被看作两个单词,分散注意力。总之,在列名、参数和变量中全部使用大写字母是一个非常糟糕的选择。

3.模式对象名首字母大写
模式对象包括表、视图和存储过程等,在创建这些名称时,应当将首字母大写,表示为专有名词。

4.保留关键字大写
保留关键字是Transact-SQL语言语法的一部分,用于定义、操作和访问数据库。将保留关键字大写后,会起到一种突出效果,使整个语句重点突出、结构清晰。看一下下面的语句:

select a, b, c from MyTable where id = 1;
对比一下:

SELECT a, b, c FROM MyTable WHERE id = 1;

阅读上面的两个语句,看一下能否快速找出每个子句,而下面的书写格式则阅读起来会更清晰。

SELECT a, b, c 
FROM MyTable 
WHERE id = 1;

下面列出了SQL Server的保留关键字:

ADD | ALL | ALTER | AND | ANY | AS | ASC | AUTHORIZATION
BACKUP | BEGIN | BETWEEN | BREAK | BROWSE | BULK | BY
CASCADE | CASE | CHECK | CHECKPOINT | CLOSE | CLUSTERED | COALESCE
COLLATE | COLUMN | COMMIT | COMPUTE | CONSTRAINT | CONTAINS
CONTAINSTABLE | CONTINUE | CONVERT | CREATE | CROSS | CURRENT
CURRENT_DATE | CURRENT_TIME | CURRENT_TIMESTAMP | CURRENT_USER
CURSOR
DATABASE | DBCC | DEALLOCATE | DECLARE | DEFAULT | DELETE | DENY
DESC | DISK | DISTINCT | DISTRIBUTED | DOUBLE | DROP | DUMP
ELSE | END | ERRLVL | ESCAPE | EXCEPT | EXEC | EXECUTE | EXISTS 
EXIT | EXTERNAL
FETCH | FILE | FILLFACTOR | FOR | FOREIGN | FREETEXT | FREETEXTTABLE 
FROM | FULL | FUNCTION
GOTO | GRANT | GROUP
HAVING | HOLDLOCK
IDENTITY | IDENTITY_INSERT | IDENTITYCOL | IF | IN | INDEX | INNER | INSERT
INTERSECT | INTO | IS
JOIN
KEY | KILL
LEFT | LIKE | LINENO | LOAD
MERGE | 
NATIONAL | NOCHECK | NONCLUSTERED | NOT | NULL | NULLIF
OF | OFF | OFFSETS | ON | OPEN | OPENDATASOURCE | OPENQUERY | OPENROWSET
OPENXML | OPTION | OR | ORDER | OUTER | OVER
PERCENT | PIVOT | PLAN | PRECISION | PRIMARY | PRINT | PROC 
PROCEDURE | PUBLIC
RAISERROR | READ | READTEXT | RECONFIGURE | REFERENCES | REPLICATION
RESTORE | RESTRICT | RETURN | REVERT | REVOKE | RIGHT | ROLLBACK
ROWCOUNT | ROWGUIDCOL | RULE
SAVE | SCHEMA | SECURITYAUDIT | SELECT | SEMANTICKEYPHRASETABLE
SEMANTICSIMILARITYDETAILSTABLE | SEMANTICSIMILARITYTABLE
SESSION_USER | SET | SETUSER | SHUTDOWN | SOME | STATISTICS | SYSTEM_USER
TABLE | TABLESAMPLE | TEXTSIZE | THEN | TO | TOP | TRAN | TRANSACTION 
TRIGGER | TRUNCATE | TRY_CONVERT | TSEQUAL
UNION | UNIQUE | UNPIVOT | UPDATE | UPDATETEXT | USE | USER
VALUES | VARYING | VIEW
WAITFOR | WHEN | WHERE | WHILE | WITH | WITHIN GROUP | WRITETEXT

1.9.2 使用空格

在语言标记之间放置一个空格,尽量地符合英语书写习惯,可以增强语句的可阅读性。

1.等号两边使用空格
在书写赋值语句时,应当在等号两边使用空格分隔,如SET @i = 1比SET @i=1更容易阅读。

2.逗号后面使用空格
应当遵循在逗号后面使用空格的原则,因为英语中逗号和句号很容易混淆。例如:

SELECT MyTable.a,MyTable1.b,MyTable2.c
FROM MyTable,MyTable1,MyTable2;
下面的形式会更容易阅读一些:

SELECT MyTable.a, MyTable1.b, MyTable2.c
FROM MyTable, MyTable1, MyTable2;

当表或列名称比较长时,下面的形式则更好一些。

SELECT EmployeeID,
 Title,
 BirthDate,
 MaritalStatus
FROM HumanResources.Employee;

1.9.3 使用缩进

必要的缩进会使语句的层次和逻辑关系更加清晰,通常是缩进2个空格。例如,在下面的语句中,AND关键词连接了两个筛选条件,缩进后会更加突出WHERE子句。

SELECT * 
FROM HumanResources.Employee
WHERE ManagerID = 16
 AND EmployeeID > 100;

下面是一个左外连接的语句,首先将HumanResources.Employee和Person.Contact表中列分别放在了单独的行中,以便进行区分;然后LEFT缩进后表示与FROM后面的表进行连接,ON再次缩进表示是LEFT的连接条件。

SELECT E.EmployeeID, E.Title, 
 P.FirstName, P.LastName, P.EmailAddress
FROM HumanResources.Employee AS E
 LEFT OUTER JOIN Person.Contact AS P
  ON E.EmployeeID = P.ContactID 
WHERE E.ManagerID = 16
 AND E.EmployeeID > 100;

1.9.4 使用垂直空白道

还有一种观点认为,在关键词与参数之间应当使用垂直空白道的方式进行分隔,会增强可阅读性。例如:

SELECT E.EmployeeID, E.Title, 
    P.FirstName, P.LastName, P.EmailAddress
 FROM HumanResources.Employee AS E
  LEFT OUTER JOIN Person.Contact AS P
   ON E.EmployeeID = P.ContactID 
 WHERE E.ManagerID = 16
  AND E.EmployeeID > 100;

又如,下面的语句使用了垂直空白道分隔,并对子查询使用了缩进。

SELECT DISTINCT CustName
 FROM Customers AS C
 WHERE NOT EXISTS
     (SELECT * 
      FROM OrderHeader 
     WHERE CustID = Customers.CustID);

1.9.5 使用分组

存在多行Transact-SQL的情况下,相关语句之间可以直接换行书写,而对于两个步骤之间的语句应当间隔一个空行。如果需要的话,也可以加入一些适当的注释语句。例如:

USE AdventureWorks2014;
GO
-- 读取 Employee 表的数据
SELECT *
FROM HumanResources.Employee;
GO

本文仅用于学习和交流目的,不代表异步社区观点。非商业转载请注明作译者、出处,并保留本文的原始链接。

相关文章
|
11月前
|
SQL 关系型数据库 大数据
大数据开发基础的数据库基础的SQL语句书写
SQL(Structured Query Language)是关系型数据库管理系统中最基础、最重要的语言,也是大数据开发中必须掌握的一项基础知识。本篇文章将为大家介绍SQL语句的基本概念、书写规则以及常用操作等知识点。
138 0
|
SQL 存储 缓存
MySQL数据库4种常用优化方式,sql语句书写优化规范
MySQL数据库4种常用优化方式,sql语句书写优化规范
173 0
MySQL数据库4种常用优化方式,sql语句书写优化规范
|
SQL 存储 Java
数据库小技能:PL/SQL中书写定义sql
触发器由数据库管理系统负责调用和执行,通过触发触发器所监听的事物来实现触发器的调用。 表级别的触发器(对于整个数据库表做监听) 行级别的触发器(对于表中的每一行做监听)
174 0
|
SQL 关系型数据库 MySQL
MySQL_02:SQL语言规范
MySQL_02:SQL语言规范
103 0
|
SQL 存储 NoSQL
MySQL数据库SQL使用规范
DML语句规范 【推荐】写完SQL先explain查看执行计划 日常开发写 SQL 的时候,尽量养成这个好习惯呀:写完 SQL 后,用 explain 分析一下,尤其注意走不走索引。
SQL查询语句的书写顺序和执行顺序
SQL查询语句的书写顺序和执行顺序
SQL查询语句的书写顺序和执行顺序
|
SQL 关系型数据库 数据库
SQL 审核:基于PG数据库插件hook的SQL规范审核工具
此议题的主题是PG数据库插件和SQL规范审核相关的内容。首先了解一下hook技术的基本原理。接下来将介绍一下SQL语句在PG数据库的分析解析和执行过程。然后结合hook和SQL执行过程介绍一下SQL规范审核这个插件,聊一聊该插件的实现原理。最后做一下展望。
2544 0
|
SQL Oracle 关系型数据库
项目中的那些SQL语句规范,你做到了几条?
公司有SQL语句规范的参考文档,这里特别做个笔记。
项目中的那些SQL语句规范,你做到了几条?
|
SQL
SQL基本语法和书写格式
SQL基本语法和书写格式
184 0