SQL语句压缩良好做法

缩进SQL语句的公认做法是什么? 例如,考虑下面的SQL语句:

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 ) 

我喜欢所有的“,”在前面 ,这样,我从来没有search他们的时候,从SQL编辑器X行的错误。


这是那些不使用这种types的写入SQL语句的例子。 两者都包含缺less逗号的错误。

 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 ( ... ) 

在第一个例子中,我发现更容易,更快捷。 希望这个例子可以让你更加了解我的观点。

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

这是相当短暂和易于阅读。 如果select了更多的列或更多的连接条件,我会进行调整。

不知道有一个公认的做法,但现在是我怎么做:

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

我喜欢在代码中有空白的“河stream”。 这使得它更容易扫描。

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

我喜欢贾尔伯特排列在他们右边的关键字的forms。 我还要补充一点,我喜欢左边的AND和OR(有些人把它们放在右边)。另外,如果可能,我喜欢排列等号。

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

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

 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 ) 

我已经为我们的商店编写了一个代码标准,这个标准在可读性/可发现性方面有着极大的偏见(后者主要用于insert-select语句):

 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最好的朋友。

如果你有一个很长的SQL语句,你想重新格式化没有所有的打字和标签,你可以把它打到这个网站,并得到一个很好的格式化结果。 您可以尝试使用各种格式来查看哪些文本最具可读性。

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

SQL格式化是一个存在很大差异和不一致的领域…但是,我喜欢把重点放在可读性上,并且认为不pipe你做什么,始终遵守任何降低可读性的规则,就像老习惯一样,一个“愚蠢的一致性”(“愚蠢的一致性是一个简单的头脑大地精”)

所以,不要把它们叫做规则,这里有一些准则。 对于SQL语句中的每个主要子句(select,插入,删除,发件人,地址,拥有,组BY,sorting依据,…我可能会缺less一些)应该是易于识别的。 所以我通常会把他们压在最高一级,甚至互相压制。 然后,在每个子句中,我均匀地缩进下一个逻辑子结构…等等。但是,如果在任何情况下它更易于阅读,我可以自由地(经常地)改变模式。复杂案例陈述就是一个很好的例子。 因为任何需要水平滚动的东西都极大地降低了可读性,所以我经常在多行上编写复杂的(嵌套的)Caseexpression式。 当我这样做,我试图保持这样一个声明挂起缩进的开始,基于它在SQL语句中的逻辑位置,并缩小其余的语句行几个字符furthur …

SQL数据库代码已经存在了很长一段时间,因为在计算机使用小写字母之前,所以对上面的关键字有一个历史的偏好,但是我更喜欢可读性超过传统…(我用颜色编码的每个工具现在都是关键词无论如何)

只要别名不会造成混淆,我也会使用表别名来减less眼睛扫描文本的数量,以便查询查询的结构。 在less于3或4个表的查询中,单个字符的别名是好的,如果所有的表都以不同的字母开头的话,我经常使用表的第一个字母……再次,无论最有助于可读性。 最后,如果你的数据库支持它,许多关键字是可选的(比如“Inner”,“Outer”,别名等)。“Into”(来自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子句中有更多的列,我会缩进第二行和后面的行…我通常不坚持任何严格的(每行一列)types的规则作为滚动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) 

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

我喜欢将查询的不同部分垂直排列。 我倾向于使用SQL空间的8个空格的标签大小,似乎运作良好。

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

示例缩进非常非常非常复杂的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 

当然,这归结于个人偏好。 而且,如果在团队中,为了一致起见,成员之间应该达成一致。 但是,这将是我的首选:

 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 ) 

而当连接条件变长时。

 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 ) 

我会这样格式化:

 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) 

这是我的捅在这:

 select column1, column2 from table1 where (column3 in ( select top(1) column4 from table2 inner join table3 on (table2.column1 = table3.column1) )) ; 
  • 一切都小写,因为它更容易阅读小写字符(我们有代码突出强调关键字)也更容易打字
  • 每个关键字的限制或选项(比如select或join上的from)都会缩进以显示它们对于向外关键字的依赖
  • 右括号与开放的地方在同一个缩进级别
  • 使用方括号来增加可读性
  • 用相同的缩进closuresselect语句的分号,这样可以更好地区分多个语句(如果您需要像SAS PROC SQL那样在语言中使用分号)
  • 它仍然非常紧凑,不会在页面上延伸

这是我的正常select:

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

虽然stackoverflow混淆格式与一个额外的领先空间,所以我把一些时期,所以你可以看到实际的格式…

我刚刚通过我的SQL美化器,它是这样出来….

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

http://extras.sqlservercentral.com/prettifier/prettifier.aspx

…..但我还没有find一种方法来获取颜色到StackOverflow。

是的,这是非常主观的…但是,这是我的2美分:

 SELECT Column1, Column2 FROM Table1 WHERE Column3 IN ( SELECT Column4 FROM Table2 JOIN Table3 ON Table2.Column1 = Table3.Column1 ) 

但是,真的,我可能会重写它没有IN:

 SELECT Column1, Column2 FROM Table1 JOIN Table2 ON Table1.Column3 = Table2.Column4 JOIN Table3 ON Table2.Column1 = Table3.Column1 

基本上,我的规则是:

  • 大写关键字
  • 列单独行,但SELECT修饰符(SELECT TOP 100,SELECT DISTINCT等)或单列(SELECT 1,SELECT ID,SELECT *等)在同一行
  • join在JOIN子句下缩进的条件
  • 使用JOIN INNER JOIN(因为它是常见的),并完全指定其他(LEFT OUTER JOIN,FULL OUTER JOIN等)
  • 在同一行打开parens,closuresparen在单独的行上。 如果你有一个别名,那么这个别名就会变成近亲。

这个链接是我find的最好的。 http://www.sqlinform.com/free_online_sw.html

那么,当然这取决于查询。

对于简单的查询,一个高度正式的缩进scheme只是比它的价值更麻烦,实际上可以使代码更less可读性,而不是更多。 但是随着复杂性的增长,您需要开始更加小心地处理语句的结构,以确保能够在以后再次读取。

我不知道是否有一个标准,但我喜欢这样做,

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

因为我可以更好地阅读和分析SQL。

 SELECT Column1, Column2 FROM Table1 WHERE Column3 IN ( SELECT TOP (1) Column4 FROM Table2 INNER JOIN Table3 ON Table2.Column1 = Table3.Column1 ) 

我通常做的是,

 print("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 ) 

这就是我们如何做到这一点:

select
         COLUMN1,
         COLUMN2,
        当COLUMN5 ='X'
                        和
                         COLUMN6 ='Y'
                那么'一个'
                当COLUMN5在(
                                 'AAA',
                                 'BBB'
                         )
                那么'两'
                其他'三'
        结束为COLUMN7
从
        表格1
哪里
         COLUMN2在(
                select顶部(1)
                         COLUMN4
                从
                         TABLE2
                        内部联接
                        表3
                                上
                                         TABLE2.COLUMN1 = TABLE3.COLUMN1
                                        和
                                        是table2.column2
                                                之间
                                                         TABLE3.COLUMN2
                                                        和
                                                         TABLE3.COLUMN3
         )

我们的想法是:保持sql关键字小写,并把所有更改(因此“更有趣”)的东西,如大小写的表名或列名。 代码在这里可能看起来有点“爆炸”,但是如果你有比这个例子更长的名字(包括模式等)的复杂查询,它会增加可读性。 并且:根据它们的“级别”缩进所有对象。