【问题标题】:What SQL coding standard do you follow? [closed]您遵循什么 SQL 编码标准? [关闭]
【发布时间】:2010-10-06 01:27:03
【问题描述】:

是否有任何广泛使用的 SQL 编码标准? SQL 与 C/C++ 类型的编程语言略有不同。真的不知道如何最好地格式化它以提高可读性。

【问题讨论】:

  • 您可以使用像 SQLinForm (www.sqlinform.com) 这样的工具进行自动格式化,该工具将您最喜欢的格式化选项存储在配置文件中,并允许它们与您的团队共享。
  • 在here 前几个小时提出了同样的问题。好吧,我真的觉得标记为骗子是不对的,我只是留下一个通知。

标签: sql coding-style


【解决方案1】:

蓝色的任何东西都是大写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

【讨论】:

    【解决方案2】:

    我很惊讶我使用了近 20 年的编码风格不在此列表中:

      SELECT column1,
             column2,
             column3,
             COALESCE(column4, 'foo') AS column4
        FROM tablename
       WHERE column1 = 'bar'
    ORDER BY column1,
             column2
    

    我觉得这绝对是最易读的,但我承认打字很乏味。如果右对齐关键字太多,我会选择左对齐:

    SELECT   column1,
             column2,
             column3,
             COALESCE(column4, 'foo') AS column4
    FROM     tablename
    WHERE    column1 = 'bar'
    ORDER BY column1,
             column2
    

    【讨论】:

    • 不是和stackoverflow.com/a/522565/470014一样吗?
    • 差不多。不过,我不同意逗号的位置,而是更喜欢通过始终使用 AS 来使别名更加明确。
    • 哦,是的。同意这两点。前面的逗号太丑了!
    • 完全不喜欢这个。如何处理子查询或复杂存储过程的缩进?
    • 欢迎提供查询,我会在上面添加一个格式化版本。但是,是的,使用这种缩进样式非常复杂。我只是觉得它看起来更好,可读性最强。
    【解决方案3】:
    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
            )
        )
    

    【讨论】:

      【解决方案4】:

      我知道这很长,但请耐心等待,这很重要。这个问题打开了一个很酷的蠕虫罐头。如果您不喜欢数据库块,请继续阅读。

      并且,在任何人考虑取消我的回复之前,请查看以下文章以及与之相关的有关锁定和重新编译的文章; SQL 数据库上的两个最具破坏性的资源。

      http://support.microsoft.com/kb/263889

      我打字很快,而且我不喜欢比下一个人打字。但是我非常关注以下几点,即使它是更多的打字。以至于我已经构建了自己的 SP 应用程序来为我做这件事。

      我提出的观点非常重要!你甚至可能对自己说,“你在开玩笑吧,这不是问题”,好吧,那你就没有读过上面的文章。 并且,M$ 将这些点作为注释放入是完全愚蠢的。这些问题对我来说应该是大胆的和尖叫的。

      我还使用 C# 应用程序构建我的基本脚本以加快开发速度,并且这些实践非常有效(10 年的价值),使脚本 SP 更容易,尤其是更快。

      还有更多,但这是我为前 60% 所做的一切。


      最佳做法

      • 在对象周围使用方括号,以便查询引擎在看到字段时明确知道该字段
      • 使用 THE SAME CASE 作为表对象名称和字段名称
      • 从应用程序调用 SP 时,使用具有正确所有者和大小写的完全限定 [dbo].[procName]。不开玩笑!阅读以上文章!
      • 引用对象的所有者,以便明确了解安全性并且不必弄清楚
      • 不要使用“sp_”,因为它指的是系统存储的过程和开销
      • 使用 SET NOCOUNT ON 和 SET NOCOUNT OFF 来消除额外的开销来跟踪存储过程中更新了多少记录,除非您需要它们。通常情况下,您不会这样做,但您可以获得巨大的性能提升。

      首选项

      • 为存储的过程添加前缀 proc
      • 为每个存储过程添加 SEL、UPD、DEL、INS(或 SELECT、UPDATE、DELETE、INSERT)后缀
      • 保留字大写
      • 新行上的主要关键字(脚本)
      • 在列前使用逗号(脚本)
      • 以 vw 为视图添加前缀
      • 不要给表格加前缀
      • 表名单数
      • 为标准名称添加后缀,例如“_ByPK”、“_OrderByLastName”或“_Top15Orders”,以表示股票 SP 的变体

      选择

      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
      

      【讨论】:

        【解决方案5】:
        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
        

        这对我们很有效。

        这个实际的查询没有多大意义,因为我试图快速构建它作为一个例子......但这不是重点。

        • t_c 代表类别表子查询或“临时类别”。
        • _underscoring 子查询中的内容。
        • 别名列名称在查询上下文中有意义。例如“活跃成员”
        • 将逗号放在新行的开头可以更轻松地构建动态查询:

          $sql .= ", c.another_column"
          
        • 其他一切都很简单。

        【讨论】:

          【解决方案6】:

          不会称之为编码标准 - 更像是编码风格

          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_”)
          • 不要给表格加前缀
          • 表名单数

          【讨论】:

          • 请确保您没有在“sp”之后添加下划线:sqlmag.com/Articles/ArticleID/23011/23011.html?Ad=1。我相信你已经知道了……这主要是针对那些可能会调整你的风格的人。
          • 就我个人而言,我不喜欢在对象名称前加上前缀。我认为它在没有前缀的情况下阅读起来更容易和更清晰,当我使用一个对象时,我应该已经知道它是什么类型的对象(任何人都应该阅读我的代码)。
          • 嗨,有关 SQL 编码标准的更多详细信息 go throw .. selectinsql.blogspot.in/2012/08/…
          【解决方案7】:

          我个人不喜欢在存储过程名称前加上 sp_ ——这是多余的,IMO。相反,我喜欢在它们前面加上一个“功能单元”标识符。例如我将调用 sprocs 来处理订单 order_Save、order_GetById、order_GetByCustomer 等。它使它们在管理工作室中按逻辑分组,并且更难选择错误的订单。 (GetOrderByProduct、GetCustomerById 等...)

          当然,这是个人喜好,其他人可能更喜欢将所有 Get sprocs 放在一起,所有 Save sprocs 等等。

          只是我的 2c。

          【讨论】:

          • 可以使用“sp_”作为前缀,但实际上是违反数据库编码标准的,因为它用于将存储过程声明为系统存储过程,因此会产生额外的开销。
          • 我关于前缀的观点是 sp_ 或 usp_ 或其他多余的,因为我已经知道这些是存储过程。例如,我不调用表 tab_Orders,那么为什么要使用 sprocs 呢?
          【解决方案8】:

          来自一个非常好的关于 PostgreSQL 的博客,但是这个主题是普遍适用的:

          Maintainable queries - my point of view (depesz.com)

          ...我决定编写可维护查询的优先级:

          1. 避免无用的打字。

          2. 为表/视图使用别名。 总是。让他们变得理智 别名。

          3. 以某种方式缩进代码。

          4. 避免引用(是的,这就是为什么我 讨厌 Django)

          5. 使用连接语法

          我同意保留字和所有其他标识符的大写,除了我自己的。

          【讨论】:

          • 总体+1,尽管我发现很多人认为#1 太过分了。如果这意味着使我的代码更具可读性,我更喜欢一些额外的击键。例如,研究表明,下划线(相对于骆驼符号)极大地提高了可读性,但每个人都抱怨这些额外的键。
          • 对。下划线是提高标识符可读性的好方法,但与往常一样,这是一个平衡问题。
          • 同意除别名之外的所有内容。 SqlServer 2008 现在有 Intellisense,我不想在 JOIN 子句上犯错,因为有人有一个 Lookup AS L1,其中 14 个必须寻找 L12 是什么。我更喜欢类似的东西:Lookup AS Lookup_Foo.
          【解决方案9】:

          使用www.sqlinform.com - 我建议使用ANSI-92 standard,然后使用该网站进行美化。

          【讨论】:

            【解决方案10】:

            Google for sql 漂亮的打印机或查看here。我自己没有尝试过,但它给了你一个好的开始。大多数商业工具(如 Toad)都有一个“格式化”选项,这也很有帮助。

            【讨论】:

              【解决方案11】:

              我喜欢逗号前面的方式:

              SELECT
                    column1
                  , column2
                  , column3
                  , COALESCE(column4,'foo') column4
              FROM
                  tablename
              WHERE
                  column1 = 'bar'
              ORDER BY 
                    column1
                  , column2
              

              在我看来,它使它最容易阅读和调试。

              【讨论】:

              • 我觉得这种风格很烦人,但我想这是个人喜好。
              • 这也可以让你评论单行而不必担心逗号。
              • 除非你需要注释第一行。最后用逗号做它可以让你评论任何行,除了最后一行。是一样的。
              • 您注意到逗号前面的更大区别是,如果您缺少逗号,则很明显。它脱颖而出。
              • 只有在选择列表中没有表达式必须分成多行时才会突出显示前面的逗号,例如案例陈述。
              【解决方案12】:

              我通常每行保留很少,即:

              select
                  col1,
                  col2,
                  col3
              from
                  some_table tabl1
              where
                  col1 = 'some'
              and 
              (
                  col2 = 'condition'
              or  col2 = 'other'
              )
              

              【讨论】:

              • 在 col1='some' 的同一列缩进 and 块不是更好吗?
              【解决方案13】:

              如果你用谷歌搜索,那里有很多编码标准。例如,

              Database Coding Standard and Guideline

              和

              SQL SERVER Database Coding Standards and Guidelines Complete List

              【讨论】:

              • 谷歌把我带到这里...
              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-08-04
              • 1970-01-01
              • 2013-01-04
              • 2021-06-05
              • 1970-01-01
              • 2013-02-10
              相关资源
              最近更新 更多