Хорошая практика отступа инструкции 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
)
Как это должно быть отступ? Большое спасибо.
25 ответов:
SELECT column1 , column2 FROM table1 WHERE column3 IN ( SELECT TOP(1) column4 FROM table2 INNER JOIN table3 ON table2.column1 = table3.column1 )
мне нравится иметь все "," перед, таким образом, я никогда не искать их, когда ошибка в строке X из редактора SQL.
это пример для тех, кто не использует этот тип записи инструкции 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 ( ... )
Я нашел проще и быстрее на первом примере. Надеюсь, этот пример покажет вам больше моей точки зрения.
SELECT column1, column2 FROM table 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 column4 FROM table2 JOIN table3 ON table2.column1 = table3.column1);
Мне нравится форма жальбер из подкладки ключевые слова на их права. Я бы также добавил, что мне нравятся ANDs и ORs слева (некоторые люди ставят их справа.) Кроме того, мне нравится выстраивать свои знаки равенства, когда это возможно.
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, который вы хотели бы переформатировать без всех вводов и вкладок, вы можете ударить его в этот сайт и получить красиво отформатированный результат. Вы можете экспериментировать с различными форматами, чтобы увидеть, что делает ваш текст наиболее читаемым.
Edit: я считаю, что этой является 2014 расположение модуля форматирования SQL.
форматирование SQL-это область, в которой существует много различий и разногласий... Но fwiw, мне нравится сосредотачиваться на читаемости и думать, что все, что вы делаете, последовательно соответствует любым правилам, которые уменьшают читаемость, как говорится в старом клише, "глупая последовательность" ("глупая последовательность-это Хобгоблин для простых умов")
Итак, вместо того, чтобы называть их правилами, вот некоторые руководящие принципы. Для каждого основного предложения в инструкции SQL (Select, Insert, Delete, From, Where, Имея, группировать по порядку, ... Я могу пропустить несколько) должны быть легко идентифицированы. Так что я вообще отступаю от них на самом высоком уровне, все даже друг с другом. Затем в каждом предложении я равномерно отступаю от следующей логической подструктуры... и так далее.. Но я чувствую себя свободным (и часто делаю) изменить шаблон, если в любом отдельном случае это было бы более читаемым, чтобы сделать это... Хорошим примером являются сложные операторы Case. Поскольку все, что требует горизонтальной прокрутки, значительно снижает читаемость, я часто пишут сложные (вложенные) выражения Case на нескольких строках. Когда я это делаю, я стараюсь держать начало такого оператора висящим отступом на основе его логического места в операторе SQL и отступать от остальных строк оператора на несколько символов дальше...
код базы данных SQL существует уже давно, так как раньше компьютеры имели нижний регистр, поэтому существует историческое предпочтение для ключевых слов верхнего регистра, но я предпочитаю читаемость по традиции... (и каждый инструмент, который я использую цветовые коды ключевых слов теперь в любом случае)
Я также буду использовать псевдонимы таблиц для уменьшения объема текста, который должен сканировать глаз, чтобы сгладить структуру запроса, если псевдонимы не создают путаницы. В запросе с менее чем 3 или 4 таблицами односимвольные псевдонимы хороши, я часто использую первую букву таблицы, если все таблицы начинаются с другой буквы... опять же, все, что больше всего способствует читаемости. Наконец, если ваша база данных поддерживает его, многие из ключевые слова являются необязательными (например, "внутренний", "внешний", " как " для псевдонимов и т. д.) "Into" (from 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)
форматируйте код таким образом, чтобы он был наиболее читаемым...
Мне нравится, чтобы разные части моего запроса выстраивались вертикально. Я обычно использую размер вкладки 8 пробелов для SQL, который, кажется, хорошо работает.
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) )) ;
- все строчные буквы, потому что легче читать строчные символы (и у нас есть подсветка кода, чтобы подчеркнуть ключевые слова) также легче вводить
- каждое ограничение или параметр по ключевому слову (например, from on the select или on on The join) отступается, чтобы показать их зависимость от внешнего ключевого слова
- закрывающая скобка находится на том же уровне отступа, что и отверстие, где
- использовать кронштейны для Где - и о-положения, чтобы повысить удобочитаемость
- имейте точку с запятой, закрывающую оператор select - при одном и том же отступе, чтобы можно было лучше различать несколько операторов (если вам нужна точка с запятой на вашем языке, например, SAS PROC 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)
Это мое обычное предпочтение:
....SELECT column1 ........,column2 ....FROM table1 ....WHERE column3 IN ( ........SELECT TOP(1) column4 ........FROM table2 ........INNER JOIN table3 ............ON table2.column1 = table3.column1 ....)
хотя stackoverflow портит форматирование с дополнительным ведущим пространством, поэтому я помещаю некоторые периоды, чтобы вы могли видеть фактическое форматирование...
Я только что поставил его через мой SQL prettifier и он вышел вот так....
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
в основном, мои правила:
- Использовать Ключевые Слова
- столбцы идут по отдельным строкам, но выберите модификаторы (выберите TOP 100, выберите DISTINCT и т. д.) или отдельные столбцы (выберите 1, Выберите Id, выберите * и т. д.) перейти на ту же линию
- условия соединения с отступом под соединением пункт
- используйте JOIN для внутреннего соединения (так как это общий) и полностью укажите другие (левое внешнее соединение, полное внешнее соединение и т. д.)
- откройте parens на той же линии, закройте paren на отдельной строке. Если у вас есть псевдоним, псевдоним идет с close paren.
эта ссылка является лучшим, что я нашел. http://www.sqlinform.com/free_online_sw.html
ну, конечно, это зависит от запроса.
для простых запросов очень формальная схема отступа-это просто больше проблем, чем стоит, и может фактически сделать код меньше читабельно, не более. Но по мере роста сложности вам нужно начать быть более осторожным с тем, как вы структурируете заявление, чтобы убедиться, что оно будет читаться позже.
Я не знаю, есть ли стандарт, но мне нравится делать это таким образом;
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, case when COLUMN5 = 'X' and COLUMN6 = 'Y' then 'one' when COLUMN5 in ( 'AAA', 'BBB' ) then 'two' else 'three' end as COLUMN7 from TABLE1 where COLUMN2 in ( select top(1) COLUMN4 from TABLE2 inner join TABLE3 on TABLE2.COLUMN1 = TABLE3.COLUMN1 and TABLE2.COLUMN2 between TABLE3.COLUMN2 and TABLE3.COLUMN3 )наша идея: сохранить ключевые слова sql в нижнем регистре и поместить все изменяющиеся (и, следовательно, "более интересные") вещи, такие как имена таблиц или столбцов в верхнем регистре. Код может выглядеть немного "взорванным" здесь, но он повышает читаемость, если у вас есть сложные запросы с более длинными именами (ВКЛ. схемы и т. д.) гораздо дольше, чем в этом примере. И: отступ всех объектов в соответствии с их "уровнем".
Comments