缩进SQL语句的公认做法是什么?例如,考虑以下SQL语句:
SELECT column1, column2
FROM table1
WHERE column3 IN
(
SELECT TOP(1) column4
FROM table2
INNER JOIN table3
ON table2.column1 = table3.column1
)
应该如何缩进?非常感谢。
缩进SQL语句的公认做法是什么?例如,考虑以下SQL语句:
SELECT column1, column2
FROM table1
WHERE column3 IN
(
SELECT TOP(1) column4
FROM table2
INNER JOIN table3
ON table2.column1 = table3.column1
)
应该如何缩进?非常感谢。
Answers:
SELECT column1
, column2
FROM table1
WHERE column3 IN
(
SELECT TOP(1) column4
FROM table2
INNER JOIN table3
ON table2.column1 = table3.column1
)
我喜欢将所有的“,”放在前面,这样,当SQL编辑器在X行出现错误时,我就永远不会搜索它们。
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
)
这很短,很容易阅读。如果选择了更多的列或更多的连接条件,我会进行调整。
我喜欢在代码中包含空白的“ rivers”。它使扫描更加容易。
SELECT column1,
column2
FROM table1
WHERE column3 IN (SELECT column4
FROM table2
JOIN table3
ON table2.column1 = table3.column1);
我喜欢jalbert排列其右边关键字的形式。我还要补充一点,我喜欢左边的AND和OR(有些人把它们放在右边。)此外,我希望在可能的情况下排列我的等号。
SELECT column1,
column2
FROM table1, table2
WHERE table1.column1 = table2.column4
AND table1.col5 = "hi"
OR table2.myfield = 678
JOIN
具有显式联接而不是逗号分隔的隐式联接的语法。显式联接将结构与业务逻辑分开,它们使忘记联接变得更加困难。有时,我还会将整个查询放在LEFT JOIN
,,右边ORDER BY
,然后GROUP BY
完全在河的左侧流动。
这是我的个人方法。根据连接条件的长度,有时我会在下面的行中对其进行缩进。
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语句中的每个Major子句(“选择”,“插入”,“删除”,“从”,“位置”,“具有”,“分组依据”,“订购依据…………我可能会遗漏一些”),应该可以轻松识别。因此,我通常会在最高级别缩进,甚至彼此缩进。然后在每个子句中,我均匀地缩进下一个逻辑子结构……等等。但是,如果在任何情况下这样做都更容易阅读,我可以自由地(并且经常这样做)更改模式。复杂案例陈述就是一个很好的例子。因为任何需要水平滚动的操作都会极大地降低可读性,所以我经常在多行上编写复杂(嵌套)的Case表达式。当我这样做时,我会根据该语句在SQL语句中的逻辑位置,尝试使该语句的开头保持缩进,
SQL Database代码已经存在很长时间了,因为在计算机使用小写字母之前,因此在历史上偏爱使用大写字母作为关键字,但是与传统相比,我更喜欢可读性...(而且我现在使用的每个工具都使用颜色代码作为关键字无论如何)
我也将使用Table别名来减少眼睛以查询查询的结构而需要扫描的文本量,只要别名不会造成混乱即可。在少于3或4个表的查询中,单字符别名很好,如果所有其他表都以不同的字母开头,那么我经常使用表的第一个字母...同样,无论哪种方式都有助于提高可读性。最后,如果您的数据库支持它,则许多关键字是可选的(例如,“ Inner”,“ Outer”,“ As”等别名)。“ 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子句上有更多列,我将缩进第二行和后续行...我通常不遵守任何严格的规则(每行一列),因为垂直滚动几乎与水平滚动一样不利于可读性是,尤其是如果屏幕的前十列中只有任何文本)
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)
以任何使其最易读的方式格式化代码...
UPPER
或lower
全部可以帮助您直观地识别关键字。我更喜欢UPPER
作为EYE_GRABBING
方法。
我喜欢将查询的不同部分垂直排列。对于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 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)
我已经通过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
.....但是我还没有想出让颜色进入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 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)");
这就是我们在这里要做的:
选择 第1栏, 第2栏, 当COLUMN5 ='X'时 和 COLUMN6 ='Y' 然后“一个” 当COLUMN5在( 'AAA', 'BBB' ) 然后是“两个” 否则“三个” 以COLUMN7结尾 从 表格1 哪里 第2栏的( 选择顶部(1) 第4栏 从 表2 内部联接 表3 上 TABLE2.COLUMN1 = TABLE3.COLUMN1 和 TABLE2.COLUMN2 之间 表3.第2列 和 表3.第3列 )
我们的想法是:将sql关键字保留为小写,将所有变化的(因此更“有趣”)诸如表名或列名都使用大写。代码在这里可能看起来有些“炸破”,但是如果您具有比本示例更长的更长名称(包括架构等)的复杂查询,它会提高可读性。并且:根据对象的“级别”缩进所有对象。