代码之家  ›  专栏  ›  技术社区  ›  froadie

如何确保我的SQL代码不是一团乱麻

  •  9
  • froadie  · 技术社区  · 14 年前

    SQL似乎是最被忽视的语言,当它涉及到良好的格式和可读性…由于SQL语句可能非常详细和复杂,因此使用它非常困难。但我发现,当我试图以最好的方式格式化我的SQL代码时,有时我不确定该怎么做。我知道Java、C、Python等的标准…但说到SQL,我没有看到太多的指导方针或可接受的实践。格式化SQL使其清晰、易读和合乎逻辑的提示/规则是什么?你能给出举例说明吗?您发现什么是格式化SQL最标准、最可接受的方式?

    4 回复  |  直到 12 年前
        1
  •  11
  •   Tom H    14 年前

    你可以试试看乔·塞尔科的书 SQL Programming Style . 我相信有很多人不同意他的风格,但这是一个好的开始。

    我自己的一些“规则”

    • SQL关键字总是大写
    • 表名是“正确”大小写,而列和变量都是小写。
    • 语句中的每个“major”子句都位于行首
    • 连接和条件出现在下面并缩进和对齐的位置
    • 嵌套项进一步缩进
    • 我对所有表和视图使用别名

    例如:

    SELECT
        column_1,
        column_2,
        CASE
            WHEN column_5 = 'Blah' THEN 1
            WHEN column_6 = 'Blah' THEN 2
            ELSE 3
        END AS column_alias
    FROM
        My_Table MT
    INNER JOIN My_Other_Table MOT ON
        MOT.column_1 = MT.column_1
    WHERE
        MT.column_2 = 'Some Value' AND
        (
            MT.column_3 = 'Some other value' OR
            MT.column_4 = 'Some other value'
        )
    
        2
  •  4
  •   froadie    12 年前

    也许这是“欺骗”)——但我刚刚发现了一个很棒的网站,能为你做到这一点!

    http://poorsql.com

    选项完全可定制

        3
  •  2
  •   John Hartsock    14 年前

    对于MSSQL服务器,我通常遵循这种类型的语法。

    选择状态菜单

    SELECT //optionally specify top or distinct
      Field1,
      Field2,
      CASE WHEN (1 = 1) THEN
          "1"
        ELSE
          "2"
      END AS Field3,
      ...
    FROM Table1 t1
    INNER JOIN Table2 t2
      ON t2.field1 = t1.field1  //I always reference the joined tables field name first
    LEFT OUTER JOIN Table3 t3
      ON (t3.field1 = t1.field1
        AND t3.field2 = t2.field2)  //I specify and with a new line and tabbed in
        OR                         // I specify or(s) on thier own line this way you can distinguish from the two conditionals that need to be met
        (t3.field1 = t2.field1
        AND t3.field2 = t1.field2)
    WHERE
       (t1.Field1 = 'foo'
       AND t1.field2 = 'bar')
       OR
       (t2.Field1 = 'foo'
       AND t1.field2 = 'bar')
    

    选择中的派生表

    Select
      Field1,
      Field2,
      ...
    FROM (Select
              Field1,
              Field2,
              Field3)
            FROM Table1
            WHERE
              Field1 = '1') t1
    

    更新语句

    UPDATE Table1
      SET
        Field1 = 1,
        Field2 = 2,
        Field3 = 3
    WHERE
      (Field1 = 2
      AND Field3 = 2)
      OR 
      (Field3 = 1)
    

    插入语句

    INSERT INTO Table1
      (Field1,
       Field2,
       Field3,
       ...)
    VALUES
      (1,
       2,
       3,
       ...)
    

    if语句

    IF (some condition) BEGIN
    END ELSE BEGIN
    END
    

    程序

    CREATE PROCEDURE Foo (
      Bar INT,
      Foo VARCHAR(20)
    ) AS
    BEGIN
      //Your Code Here
    END
    
        4
  •  0
  •   Jauzsika    14 年前

    我使用以下规则:

    • 总是使用大写的SQL保留字(select、from、where、having、and、or、distinct等)

      丑陋的:
      select height,width,age from person where width = 20
      整洁的:
      SELECT height, width, age FROM person WHERE (width = 20)
    • 小写所有表名。千万不要在表名中使用camelcase(驴子扳手)(如果用手创建查询,你会把自己射到头上)。

    • 在WHERE和HAVING子句处始终使用括号。在运算符之间使用空格。

      丑陋的:
      ... where width=20 and height>20
      整洁的:
      WHERE (width = 20) AND (height > 20)
    • 对表名使用别名。
      `从辅助扳手DW中选择*`
    • 使用可读的、与表名相关的主键字段。我总是用“id_uuu”来启动密钥和主键。
      表名:驴子扳手,主键:ID_驴子扳手
    • 标记查询的来源。在读取日志时,您可以轻松地跟踪问题发生的位置。
      /*从aumbook.php调用,第22行*/select*from aumbool wrench dw…
    • 如果查询失败
      -始终将操作员(和、或)留在行尾
      -使用括号!

    例子:

    /*Executed from xyz.php*/
    SELECT 
    p.height, p.width, p.age,
    pd.hastel, pd.hasmobile
    
    FROM 
    person p
    LEFT JOIN personaldata pd ON p.id_person = pd.id_person
    LEFT JOIN relatives r ON pd.id_person = r.id_person
    
    WHERE 
    ( p.width = 20 ) AND 
    ( (p.height > 20) AND (p.height < 15) ) AND
    ( pd.hastel)
    
    ORDER BY 
    p.age, p.height