Хорошая практика отступа инструкции 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
)


Как это должно быть отступ? Большое спасибо.

497   25  

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

    Ничего не найдено.