当前位置:  开发笔记 > 前端 > 正文

SQL语句缩进的好习惯

如何解决《SQL语句缩进的好习惯》经验,为你挑选了13个好方法。

缩进SQL语句的公认惯例是什么?例如,请考虑以下SQL语句:

SELECT column1, column2
FROM table1
WHERE column3 IN
(
SELECT TOP(1) column4
FROM table2
INNER JOIN table3
ON table2.column1 = table3.column1
)

这应该如何缩进?非常感谢.



1> Patrick Desj..:
SELECT column1
     , column2
FROM table1
WHERE column3 IN
(
    SELECT TOP(1) column4
    FROM table2
    INNER JOIN table3
    ON table2.column1 = table3.column1
)

我喜欢在前面加上所有","这样我从不在SQL编辑器第X行出现错误时搜索它们.


对于那些不使用此类写入SQL语句的人,这是一个示例.两者都包含缺少逗号的错误.

SELECT sdcolumn123
 , dscolumn234
 , sdcolumn343
 , ffcolumn434
 , sdcolumn543
 , bvcolumn645
  vccolumn754
 , cccolumn834
 , vvcolumn954
 , cvcolumn104
FROM table1
WHERE column3 IN
(
    ...
)

SELECT sdcolumn123, dscolumn234, asdcolumn345, dscolumn456, ascolumn554, gfcolumn645 sdcolumn754, fdcolumn845, sdcolumn954, fdcolumn1054
FROM table1
WHERE column3 IN
(
    ...
)

在第一个例子中,我发现更容易,更快捷.希望这个例子能够向你展示我的观点.


令我担心的是,很多人认为逗号是格式化SQL的最重要的事情.
有时候你会搜索你在哪里找不到逗号...当它们在前面时就很清楚了.因为逗号你会在SQL语句中出错的那一天你会想到我;)
使用领先的逗号,您始终知道它们在哪里,而不必去寻找它们.
如果你有一个合理的"垂直"风格,那么行尾逗号是完全可以扫描的,特别是如果你养成了为每列使用列标签的习惯.

2> Bill the Liz..:
SELECT column1, column2
FROM table
WHERE column3 IN (
    SELECT TOP(1) column4
    FROM table2
    INNER JOIN table3 ON table2.column1 = table3.column1
)

这非常简短易读.如果选择了更多列或更多连接条件,我会进行调整.



3> Codewerks..:

不确定是否有一种公认的做法,但现在我的方法是:

SELECT 
    column1, 
    column2 
FROM 
    table1 
WHERE 
    column3 IN 
    ( 
     SELECT TOP(1) 
         column4 
     FROM 
         table2 
         INNER JOIN 
         table3 
             ON table2.column1 = table3.column1 
    )



4> jalbert..:

我喜欢在代码中拥有白色空间的"河流".它使扫描更容易一些.

SELECT column1,
       column2
  FROM table1
 WHERE column3 IN (SELECT column4
                     FROM table2
                     JOIN table3
                       ON table2.column1 = table3.column1);



5> Slapout..:

我喜欢jalbert在右边排列关键字的形式.我还补充一点,我喜欢左边的AND和OR(有些人把它们放在右边.)另外,我喜欢在可能的情况下排列我的等号.

SELECT column1, 
       column2  
  FROM table1, table2 
 WHERE table1.column1 = table2.column4 
   AND table1.col5    = "hi" 
    OR table2.myfield = 678 



6> LeppyR64..:

这是我个人的方法.根据连接条件的长度,我有时会在下面的行中缩进它.

SELECT
  column1,
  column2
FROM
  table1
WHERE
  column3 IN ( 
    SELECT TOP(1)
      column4
    FROM
      table2
      INNER JOIN table3 ON table2.column1 = table3.column1
  )


SELECT
  column1,
  column2
FROM
  table1
WHERE
  column3 IN ( 
    SELECT TOP(1)
      column4
    FROM
      table2
      INNER JOIN table3
        ON table2.column1 = table3.column1 -- for long ones
  )



7> Mike Burton..:

我为我们的商店编写了一个代码标准,它极其偏向可读性/"可发现性"(后者主要用于插入选择语句):

SELECT 
    column1, 
    column2
FROM 
    table1
WHERE 
    column3 IN
    (
        SELECT TOP(1) 
            column4
        FROM 
            table2
            INNER JOIN table3 ON table2.column1 = table3.column1
    )

在更复杂的查询中,它变得更加明显:

SELECT
    Column1,
    Column2,
    Function1
    (
        Column1,
        Column2
    ) as Function1,
    CASE
    WHEN Column1 = 1 THEN
        a
    ELSE
        B
    END as Case1       
FROM
    Table1 t1
    INNER JOIN Table2 t2 ON t1.column12 = t2.column21
WHERE
    (
        FilterClause1
        AND FilterClause2
    )
    OR
    (
        FilterClause3
        AND FilterClause4
    )

在大多数查询中移动到具有多个连接的系统之后,我的经验是,使用垂直空间自由地是复杂SQL的最佳朋友.



8> DOK..:

如果你有一个冗长的SQL语句,你想要重新格式化而没有所有的输入和标签,你可以将它打入这个网站并获得格式良好的结果.您可以尝试各种格式,以查看哪种格式使您的文字最具可读性.

编辑:我相信这是SQL格式化程序的2014位置.



9> Charles Bret..:

SQL格式化是一个存在大量差异和分歧的领域......但是,我喜欢关注可读性,并认为无论你做什么,始终如一地遵守任何降低可读性的规则,就像旧的陈词滥调一样,一种"愚蠢的一致性"("愚蠢的一致性是简单思想的大人物")

因此,这里有一些指导原则,而不是称它们为规则.对于SQL语句中的每个Major子句(Select,Insert,Delete,From,Where,Having,Group BY,Order By,......我可能会遗漏一些)应该易于识别.所以我通常在最高级别缩进它们,所有这些都是相互的.然后在每个子句中,我均匀地缩进下一个逻辑子结构......依此类推......但是我觉得(并且经常会)更改模式,如果在任何个别情况下这样做会更具可读性......复杂案例陈述就是一个很好的例子.因为任何需要水平滚动的东西都会极大地降低可读性,所以我经常在多行上编写复杂(嵌套)Case表达式.当我这样做时,我会尝试根据它在SQL语句中的逻辑位置来保持这样一个语句的开头.

SQL数据库代码已经存在了很长时间,因为在计算机具有小写的情况之前,所以对于大写字母关键字存在历史偏好,但我更喜欢可读性而不是传统...(并且我使用的每个工具都使用颜色代码现在的关键词无论如何)

我也会使用表别名来减少眼睛必须扫描的文本量,以便了解查询的结构,只要别名不会造成混淆.在一个少于3或4个表的查询中,单个字符别名很好,如果所有的表都以不同的字母开头,我经常使用表的第一个字母...再次,无论最有助于可读性.最后,如果您的数据库支持它,许多关键字是可选的(如"内部","外部","作为"别名等)."进入"(来自Insert Into)在Sql Server上是可选的 - 但不是在Oracle上)如果您的代码需要与平台无关,请小心使用它...

你的例子,我会写为:

Select column1, column2
From table1 T1
Where column3 In (Select Top(1) column4
                  From table2 T2
                     Join table3 T3
                         On T2.column1 = T3.column1)

要么

Select column1, column2
From table1 T1
Where column3 In 
     (Select Top(1) column4
      From table2 T2
         Join table3 T3
            On T2.column1 = T3.column1)

如果select子句上有更多的列,我会缩进第二行和后续行......我通常不遵守任何严格的(每行一列)类规则,因为滚动veritcally几乎与可读性一样糟糕,因为水平滚动是,特别是如果只有屏幕的前十列有任何文字)

Select column1, column2, Col3, Col4, column5,
    column6, Column7, isNull(Column8, 'FedEx') Shipper,
    Case Upper(Column9) 
       When 'EAST'  Then 'JFK'
       When 'SOUTH' Then 'ATL'
       When 'WEST'  Then 'LAX'
       When 'NORTH' Then 'CHI' End HubPoint
From table1 T1
Where column3 In 
     (Select Top(1) column4
      From table2 T2
         Join table3 T3
            On T2.column1 = T3.column1)

以任何方式格式化代码使其最具可读性......



10> Jack Ryan..:

我喜欢将查询的不同部分垂直排列.对于SQL,我倾向于使用8个空格的制表符大小,这似乎很有效.

SELECT  column1, 
        column2
FROM    table1
WHERE   column3 IN
(
        SELECT TOP(1) column4
        FROM    table2
        INNER JOIN table3
        ON      table2.column1  = table3.column1
)



11> 小智..:

缩进非常复杂的SQL的示例:

SELECT 
    produtos_cesta.cod_produtos_cesta, 
    produtos.nome_pequeno,
    tab_contagem.cont,
    produtos_cesta.sku, 
    produtos_kits.sku_r AS sku_kit, 
    sku_final = CASE
        WHEN produtos_kits.sku_r IS NOT NULL THEN produtos_kits.sku_r
        ELSE produtos_cesta.sku
    END,
    estoque = CASE
        WHEN produtos2.estoque IS NOT NULL THEN produtos2.estoque
        ELSE produtos.estoque
    END,
    produtos_cesta.unidades as unidades1, 
    unidades_x_quantidade = CASE
        WHEN produtos.cod_produtos_kits_tipo = 1 THEN CAST(produtos_cesta.quantidade * (produtos_cesta.unidades / tab_contagem.cont) * produtos_kits.quantidade AS int)
        ELSE CAST(produtos_cesta.quantidade * produtos_cesta.unidades AS int)
    END,
    unidades = CASE
        WHEN produtos.cod_produtos_kits_tipo = 1 THEN produtos_cesta.unidades / tab_contagem.cont * produtos_kits.quantidade
        ELSE produtos_cesta.unidades
    END,
    unidades_parent = produtos_cesta.unidades,
    produtos_cesta.quantidade,
    produtos.controla_estoque, 
    produtos.status
FROM 
    produtos_cesta 
INNER JOIN produtos 
    ON (produtos_cesta.sku = produtos.sku) 
INNER JOIN produtos_pacotes 
    ON (produtos_cesta.sku = produtos_pacotes.sku) 
INNER JOIN (
    SELECT 
        produtos_cesta.cod_produtos_cesta,
        cont = SUM(
            CASE
                WHEN produtos_kits.quantidade IS NOT NULL THEN produtos_kits.quantidade
                ELSE 1
            END
        )
    FROM 
        produtos_cesta 
    LEFT JOIN produtos_kits 
        ON (produtos_cesta.sku = produtos_kits.sku) 
    LEFT JOIN produtos 
        ON (produtos_cesta.sku = produtos.sku) 
    WHERE 
        shopper_id = '" + mscsShopperId + @"' 
    GROUP BY 
        produtos_cesta.cod_produtos_cesta, 
        produtos_cesta.sku, 
        produtos_cesta.unidades 
) 
AS tab_contagem
    ON (produtos_cesta.cod_produtos_cesta = tab_contagem.cod_produtos_cesta)
LEFT JOIN produtos_kits 
    ON (produtos.sku = produtos_kits.sku) 
LEFT JOIN produtos as produtos2
    ON (produtos_kits.sku_r = produtos2.sku) 
WHERE 
    shopper_id = '" + mscsShopperId + @"' 
GROUP BY 
    produtos_cesta.cod_produtos_cesta, 
    tab_contagem.cont,
    produtos_cesta.sku, 
    produtos_kits.sku_r, 
    produtos.cod_produtos_kits_tipo, 
    produtos2.estoque,
    produtos.controla_estoque, 
    produtos.estoque, 
    produtos.status, 
    produtos.nome_pequeno, 
    produtos_cesta.unidades, 
    produtos_cesta.quantidade,
    produtos_kits.quantidade
ORDER BY 
    produtos_cesta.sku, 
    produtos_cesta.unidades DESC



12> 小智..:

由于大多数上面列出了返回列名称,我发现排列表名称和条件有助于提高可读性.

SELECT 
    column1, 
    column2
FROM 
    table1
WHERE 
    column3 IN
    (
        SELECT TOP(1) 
            column4
        FROM 
            table2 INNER JOIN 
            table3 ON table2.column1 = table3.column1
    )

并且当连接条件变长时.

SELECT
    Column1,
    Column2
FROM 
    Table1 JOIN 
    Table2 ON 
        Table1.Column3 = Table2.Column4 JOIN 
    Table3 ON 
        Table2.Column1 = Table3.Column1 and
        Table2.ColumnX = @x and
        Table3.ColumnY = @y
WHERE
    Condition1=xxx and
    Condition2=yyy and
    (
        Condition3=aaa or
        Condition4=bbb
    )


这些连接是不可读的

13> John Doe..:

这是我的看法:

select column1, column2
    from table1
    where (column3 in (
        select top(1) column4
            from table2
            inner join table3
                on (table2.column1 = table3.column1)
    ))
;

一切都是小写的,因为它更易于阅读小写字符(并且我们突出显示了代码以强调关键字)也易于键入

缩进关键字的每个限制或选项(例如select上的from或联接上的on)都会缩进,以显示其对outward关键字的依赖性

封闭支架与开口处的压痕高度相同

在括号内和子句中使用括号以提高可读性

让分号在相同的缩排处关闭选择语句,以便更好地区分多个语句(如果您需要像SAS PROC SQL这样的语言,请使用分号)

它仍然非常紧凑,并且不会遍及整个页面

推荐阅读
mobiledu2402852357
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有