你遵循什么SQL编码标准?
那里有没有广泛使用的SQL编码标准? SQL与C / C ++types的编程语言有些不同。 真的不知道如何最好地格式化它的可读性。
不会称之为编码标准 – 更像编码风格
SELECT T1.col1, T1.col2, T2.col3 FROM table1 T1 INNER JOIN ON Table2 T2 ON T1.ID = T2.ID WHERE T1.col1 = 'xxx' AND T2.Col3 = 'yyy'
- 大写保留字
- 新行上的主要关键字
- 在列之前无法使用逗号
- 总是使用短的有意义的表别名
- 与v的前缀视图
- 前缀sp存储过程(但不要使用“sp_”保留内置的特效)
- 不要前缀表
- 表名单数
我喜欢前面的逗号:
SELECT column1 , column2 , column3 , COALESCE(column4,'foo') column4 FROM tablename WHERE column1 = 'bar' ORDER BY column1 , column2
这使得它在我看来是最简单的阅读和debugging。
我知道这很长,但是忍耐着我,这很重要。 这个问题打开了一个很酷的蠕虫jar头。 如果你不喜欢数据库块,请继续阅读。
而且,在任何人想到敲我的回应之前,请看下面的文章和连接的文章关于locking,并重新编译; 两个最具破坏性的资源在SQL数据库上。
http://support.microsoft.com/kb/263889
我可以很快打字,而且我不喜欢再打下一个人。 但是,下面的几点我非常密切,即使是更多的打字。 这么多,我已经build立了我自己的SP应用程序来为我做。
我提出的观点非常重要! 你甚至可以对自己说,“你在开玩笑,这不是问题”,那么你没有阅读上面的文章。 而且,M $会把这些注意点放在注意点上,这完全是无稽之谈。 这些问题给我的应该是大胆和尖刻。
我还做了很多编码,使用C#应用程序构build我的基本脚本,以加快开发速度,这些实践非常合理(10年),使脚本SP更简单,尤其更快。
还有比这更多的,但这是我所做的一切的第一个60%。
最佳做法
- 在对象周围使用括号,这样查询引擎在看到它的时候会明白地知道一个字段
- 使用THE SAME CASE作为表对象名称和字段名称
- 从应用程序调用SP时,使用具有正确所有者和大小写的完全限定的[dbo]。[procName]。 不开玩笑! 阅读上面的文章!
- 引用对象的所有者,以便安全性明确知道,而不必弄清楚
- 不要我们“sp_”,因为这是指系统存储过程和开销
- 使用SET NOCOUNT ON和SET NOCOUNT OFF可消除额外开销,以便跟踪存储过程中有多lesslogging被更新,除非您需要它们。 通常情况下,你不这样做,你可以获得巨大的性能提升。
优先
- 前缀存储过程与proc
- 后缀SEL,UPD,DEL,INS(或SELECT,UPDATE,DELETE,INSERT)
- 保留字大写
- 新行上的主要关键字(脚本)
- 在列(脚本)之前使用逗号
- 用vw前缀视图
- 不要在表格前加上
- 表名单数
- 为标准名称添加后缀,如“_ByPK”,“_OrderByLastName”或“_Top15Orders”
select
CREATE PROC [dbo].[procTable_SEL] AS SET NOCOUNT ON SELECT [Column1] = T1.[col1] , [Column2] = T1.[col2] , [Column3] = T2.[col3] FROM [dbo].[Table] T1 INNER JOIN ON [dbo].[Table2] T2 ON T1.ID = T2.ID WHERE T1.[col1] = 'xxx' AND T2.[Col3] = 'yyy' SET NOCOUNT OFF GO
更新
CREATE PROC [dbo].[procTable_UPD] AS SET NOCOUNT ON UPDATE t1 SET [Column1] = @Value1 , [Column2] = @Value2 , [Column3] = @Value3 FROM [dbo].[Table1] T1 INNER JOIN ON [dbo].[Table2] T2 ON T1.[ID] = T2.[ID] WHERE T1.[col1] = 'xxx' AND T2.[Col3] = 'yyy' SET NOCOUNT OFF GO
插
CREATE PROC [dbo].[procTable_INS] AS SET NOCOUNT ON INSERT INTO [Table1] ( [Column1] , [Column2] , [Column3] ) VALUES ( @Value1 , @Value2 , @Value3 ) SET NOCOUNT OFF GO
要么
CREATE PROC dbo.procTable_INS AS SET NOCOUNT ON INSERT INTO [table1] ( [Column1] , [Column2] , [Column3] ) SELECT [Column1] = T1.col1 , [Column2] = T1.col2 , [Column3] = T2.col3 FROM dbo.Table1 T1 INNER JOIN ON Table2 T2 ON T1.ID = T2.ID WHERE T1.[col1] = 'xxx' AND T2.[Col3] = 'yyy' SET NOCOUNT OFF GO
删除
CREATE PROC dbo.procTable_DEL AS SET NOCOUNT ON DELETE FROM [dbo].[Table1] T1 INNER JOIN ON [dbo].[Table2] T2 ON T1.[ID] = T2.[ID] WHERE T1.[col1] = 'xxx' AND T2.[Col3] = 'yyy' SET NOCOUNT OFF GO
如果你是谷歌,那里有很多的编码标准。 例如,
数据库编码标准和指南
和
SQL SERVER数据库编码标准和指南完整列表
从PostgreSQL的一个非常好的博客,但这个主题是适用于一般:
可维护的查询 – 我的观点(depesz.com)
…我决定,我的优先级编写可维护的查询:
避免无用的打字。
使用表/视图的别名。 总是。 并让他们明智的别名。
以某种方式缩进代码。
避免引用(是的,这就是为什么我讨厌Django)
使用连接语法
我同意大写的保留字和除了我自己以外的其他标识符。
我个人不喜欢用sp_前缀一个存储过程名称 – 它是多余的,IMO。 相反,我喜欢用“function单元”标识符作为它们的前缀。 例如,我将调用sprocs来处理订单order_Save,order_GetById,order_GetByCustomer等等。它使它们在逻辑上被分组在pipe理工作室中,并且使得更难以select错误的一个。 (GetOrderByProduct,GetCustomerById等…)
当然,这是个人偏好,其他人可能更喜欢把所有的Sprocs,所有的保存等等。
只是我的2C。
谷歌的SQL漂亮的打印机或看看这里 。 我没有尝试过,但是它给了你一个很好的开始。 大多数商业工具,如蟾蜍有一个“格式化”选项,这也有帮助。
我感到惊讶的是,我用了近20年的编码风格不在这个列表中:
SELECT column1, column2, column3, COALESCE(column4, 'foo') AS column4 FROM tablename WHERE column1 = 'bar' ORDER BY column1, column2
我觉得这绝对是最可读的,但是我承认打字很繁琐。 如果alignment关键字太多,我会select左alignment它们:
SELECT column1, column2, column3, COALESCE(column4, 'foo') AS column4 FROM tablename WHERE column1 = 'bar' ORDER BY column1, column2
我通常每行很less,即:
select col1, col2, col3 from some_table tabl1 where col1 = 'some' and ( col2 = 'condition' or col2 = 'other' )
和www.sqlinform.com一起玩 – 我推荐使用ANSI-92标准 ,然后再用这个网站。
SELECT c.id , c.name , c.folder , cs.num_users active_members , cs.num_videos FROM campaign c JOIN campaign_stats cs ON cs.campaign_id = c.id JOIN (SELECT _c.id , _c.name FROM campaign _c WHERE _c.type = 9) t_c ON t_c.id = c.id WHERE c.id IN (1,2,3) AND cs.num_videos > 10
这对我们来说很好。
这个实际的查询没有多大意义,因为我试图快速构build它作为一个例子…但这不是重点。
- t_c代表分类表子查询或“temp category”。
- 在子查询中填写内容。
- 别名列名在查询的上下文中有意义。 例如“active_members”
-
在新行的开头添加逗号使得构builddynamic查询变得更容易:
$sql .= ", c.another_column"
-
一切都很简单。
蓝色的任何东西都是大写的SELECT
, DELETE
, GO
等
表格名称与客户表格一样都是单一的
链接表是tablename_to_tablename
在表名和参数的作品之间使用_
例
BEGIN SELECT Company.ID AS Company_ID, Company.Client_Name, Company.Website, Office.Office_Name FROM Company_Office WITH(NOLOCK) INNER JOIN Company WITH(NOLOCK) ON Company_Office.Company_ID = Company.ID WHERE END
要使用的数据types:我们应该只使用以下数据types:
- INT
- BIGINT
- SMALLINT
- VARCHAR
- BIT
- 约会时间
为BIT数据types提供默认值。 它不应该是可空的表和列名称不应该是小写。 它应该描述它的目的。 避免使用简短的表格。 在创build表FK和PK的时候要仔细考虑和定义。 variables名称应以一个/两个字母开头,以小写字母表示其数据types。 例如INTvariables应该从i开始。 名字应该是描述性的,应该避免使用简短的forms。 每个单词应该以大写字母开头,后面跟着所有的小写字母。
例如
正确的方法: – iTotalCount
不正确的方法: – xyz
在存储过程中使用“WHERE”子句的表列应该被索引/键入。 这将增加数据处理的速度。 WHERE子句中的参数sorting应该正确完成。 主键/索引应位于位variables之前。 例如: – 在列的组合上创build索引(REF_ID,T_TYPE_STR,CNUMBER,TLOG_ID)
– 在'WHERE'子句中顺序使用索引键的正确方法
SELECT REF_ID,T_TYPE_STR,C_NUMBER,TLOG_ID FROM T_T_DATA_tbl WHERE REF_ID = 1 AND LOG_ID = '4042654' AND T_TYPE_STR = 'SA' AND CNUMBER = '10702' –Incorrect way SELECT REF_ID, T_TYPE_STR, CNUMBER, LOG_ID FROM T_T_DATA_tbl WHERE LOG_ID = '4042654' AND T_TYPE_STR = 'SA'
在编写一个存储过程的时候,我们应该在开始部分有描述部分,其中包含Author:
创builddate:
描述:
如果有任何sp被修改,这部分应该附加
修改者:
修改于:
描述:
ROW_INSERTION_DATE_TIME和ROW_UPDATION_DATE_TIME列应具有缺省值作为GETDATE()。
更多: http : //www.writeulearn.com/sql-database-coding-standards/
create table #tempTable ( col1 int, col2 int, col3 int ) insert into #tempTable ( col1, col2, col3 ) select col1, col2, col3 from Table3 inner join Table2 on Table1.col1 = Table2.col2 where col1 = 5 select col2, case when col1 = 3 then 'something' else 'somethingelse' end from #tempTable where col1 = 5 and ( col2 = 5 or col3 in ( select field from Table2 where somecol = 2 and othercol = 5 ) )