您遵循什么SQL编码标准?

您遵循什么SQL编码标准?,sql,coding-style,Sql,Coding Style,有没有广泛使用的SQL编码标准?SQL与C/C++类型的编程语言略有不同。我真的不知道如何为可读性设置最佳格式。如果你在谷歌上搜索,有很多编码标准。比如说, 及 我通常每行只保留很少的内容,即: select col1, col2, col3 from some_table tabl1 where col1 = 'some' and ( col2 = 'condition' or col2 = 'other' ) 我喜欢前面的逗号: SEL

有没有广泛使用的SQL编码标准?SQL与C/C++类型的编程语言略有不同。我真的不知道如何为可读性设置最佳格式。

如果你在谷歌上搜索,有很多编码标准。比如说,


我通常每行只保留很少的内容,即:

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

我喜欢前面的逗号:

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

在我看来,它使阅读和调试变得最简单。

谷歌sql漂亮打印机或外观。我自己还没有试过,但它给了你一个好的开始。像Toad这样的大多数商业工具都有一个“格式化”选项,这也很有帮助。

玩转-我建议使用,然后在该网站上进行美化。

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

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

来自PostgreSQL上一个非常不错的博客,但这个主题通常适用于:

…我决定编写可维护查询的优先顺序是:

  • 避免无用的打字

  • 为表/视图使用别名。 总是。让他们变得明智 别名

  • 以某种方式缩进代码

  • 避免引用(是的,这就是我 仇恨(Django)

  • 使用连接语法


  • 我同意保留字和除我自己以外的所有其他标识符的大写形式。

    我个人不喜欢在存储过程名称前面加上sp_u2;-我认为这是多余的。相反,我喜欢在它们前面加上“功能单元”标识符。e、 g.我会打电话给存储过程来处理订单订单保存、订单获取ID、订单获取客户等。这会使它们在管理工作室中按逻辑进行分组,从而更难选择错误的订单。(GetOrderByProduct、GetCustomerById等)

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

    就我的2c

    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代表类别表子查询或“临时类别”
    • _在子查询中加下划线
    • 别名列名,以便在查询上下文中有意义。e、 g.“活跃成员”
    • 在新行的开头添加逗号可以更轻松地构建动态查询:

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


    我知道这很长,但请容忍我,这很重要。这个问题引起了一阵骚动。如果您不喜欢数据库块,请继续阅读

    而且,在任何人想推翻我的回应之前,请参阅下面的文章以及与之相关的关于锁定和重新编译的文章;SQL数据库中两个最具破坏性的资源命中

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

    我提出的观点非常重要!你甚至可能会对自己说,“你在开玩笑吗,这不是问题”,那么你就没有读过上面的文章,M$会把这些点作为笔记放进去,这完全是愚蠢的。对我来说,这些问题应该是大胆和尖锐的

    我还使用C#应用程序编写了大量代码来构建我的基本脚本,以加快开发速度,这些实践非常可靠(值得10年),使编写SP脚本变得更容易,尤其是更快

    不止这些,但这是我为前60%的事情所做的


    最佳实践

    • 在对象周围使用括号,这样查询引擎在看到某个字段时就可以知道该字段
    • 使用与表对象名和字段名相同的大小写
    • 从应用程序调用SP时,请使用具有正确所有者和大小写的完全限定的[dbo].[procName]。不是开玩笑!阅读上面的文章
    • 引用对象的所有者,以便明确知道安全性,并且不必计算安全性
    • 不要使用“sp_u3;”,因为它指的是系统存储的进程和开销
    • 使用SET NOCOUNT ON和SET NOCOUNT OFF可以消除额外的开销,以跟踪存储过程中更新了多少记录,除非您需要它们。通常情况下,您不需要这样做,您可以获得性能的巨大提高
    首选项

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

    挑选


    更新


    插入


    删除


    蓝色的任何内容都是大写的
    SELECT
    DELETE
    GO
    ,等等

    表名是单数的,就像容纳客户的表是客户表一样

    链接表是
    tablename\u到\u 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
    

    我感到惊讶的是,我使用了近20年的编码风格没有出现在下面的列表中:

      SELECT column1,
             column2,
             column3,
             COALESCE(column4, 'foo') AS column4
        FROM tablename
       WHERE column1 = 'bar'
    ORDER BY column1,
             column2
    
    我觉得这绝对是最具可读性的,但我承认
    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
    
    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
    
    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
            )
        )
    
      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