С какими стандартами кодирования SQL вы следуете?

Есть ли широко распространенный стандарт кодирования SQL? SQL немного отличается от языка программирования C/С++. На самом деле не знаю, как наилучшим образом форматировать его для удобства чтения.

Ответ 1

Не назвал бы это стандартом кодирования - больше похоже на стиль кодирования

SELECT
    T1.col1,
    T1.col2,
    T2.col3
FROM
    table1 T1
    INNER JOIN ON Table2 T2 ON T1.ID = T2.ID
WHERE
    T1.col1 = 'xxx'
    AND T2.Col3 = 'yyy'
  • использовать зарезервированные слова
  • ключевые слова на новой строке
  • не может использоваться для запятых перед столбцами
  • всегда использовать короткие значащие псевдонимы таблицы.
  • префиксные представления с v
  • префикс хранит procs с sp (однако не использует "sp_", который зарезервирован для встроенных procs)
  • не префиксные таблицы
  • уникальные имена таблиц

Ответ 2

Мне нравится предшествующая запятая:

SELECT
      column1
    , column2
    , column3
    , COALESCE(column4,'foo') column4
FROM
    tablename
WHERE
    column1 = 'bar'
ORDER BY 
      column1
    , column2

он делает его самым легким для чтения и отладки по моему мнению.

Ответ 3

Я знаю, что это долго, но несите меня, это важно. Этот вопрос открыл крутую банку червей. И если вам не нравятся блоки базы данных, читайте дальше.

И, прежде чем кто-нибудь подумает о том, чтобы сбить мой ответ, обратитесь к следующей статье и связанным с ней статьям о блокировке и перекомпилируйте; два из самых разрушительных ресурсов попадают в базу данных SQL.

http://support.microsoft.com/kb/263889

Я могу напечатать довольно быстро, и я не люблю печатать больше, чем следующий человек. Но пункты ниже я следую очень внимательно, даже если это больше набирает текст. Настолько, что я создал свои собственные приложения SP, чтобы сделать это для меня.

Точки, которые я поднимаю, действительно важны! Вы могли бы даже сказать себе: "Вы шутите, это не проблема", ну, тогда вы не читали статьи выше. И, это абсолютно глупо, что M $поставит эти точки в качестве ПРИМЕЧАНИЕ. Эти вопросы для меня должны быть BOLD и SCREAMING.

Я также делаю много кодирования для создания основных сценариев с использованием приложений С# для ускорения разработки, и эти практики очень надежны (10 лет), чтобы упростить и ускорить создание сценариев SP.

Это больше, чем это, но это то, что я делаю для первых 60% всего.


Рекомендации

  • Используйте скобки вокруг объектов, поэтому механизм запроса явно знает поле, когда он видит его
  • Используйте ОЖИДЫЙ СЛУЧАЙ как имена и имена полей таблицы
  • При вызове SP из приложения используйте полнофункциональный [dbo]. [procName] с правильным кодом владельца и. Без шуток! Прочтите статьи выше!
  • Ссылка на владельца объекта, поэтому безопасность явно известна и не обязательно должна быть выяснена
  • НЕ будем использовать "sp_", поскольку это относится к системным хранимым процессам и служебным
  • Используйте SET NOCOUNT ON и SET NOCOUNT OFF, чтобы устранить дополнительные накладные расходы, чтобы отслеживать, сколько записей обновляется в сохраненном proc, если они вам не нужны. Обычно вы этого не делаете, и вы можете добиться огромного увеличения производительности.

Preferences

  • Префикс хранит procs с proc
  • Суффикс каждого хранимого процесса с помощью SEL, UPD, DEL, INS (или SELECT, UPDATE, DELETE, INSERT)
  • Использовать зарезервированные слова
  • Основные ключевые слова в новой строке (скриптинг)
  • Используйте запятые перед столбцами (скрипты)
  • Префиксные представления с помощью vw
  • Не префиксные таблицы
  • Названия таблиц в единственном числе
  • Добавьте суффикс к стандартным именам типа "_ByPK", "_OrderByLastName" или "_Top15Orders" для вариантов на складе SP

Выбрать

CREATE PROC [dbo].[procTable_SEL]
AS
SET NOCOUNT ON
SELECT
    [Column1] = T1.[col1]
  , [Column2] = T1.[col2]
  , [Column3] = T2.[col3]
FROM [dbo].[Table] T1    
INNER JOIN ON [dbo].[Table2] T2 ON T1.ID = T2.ID
WHERE
      T1.[col1] = 'xxx'
  AND T2.[Col3] = 'yyy'
SET NOCOUNT OFF
GO

Update

CREATE PROC [dbo].[procTable_UPD]
AS
SET NOCOUNT ON
UPDATE t1 SET
    [Column1] = @Value1
  , [Column2] = @Value2
  , [Column3] = @Value3
FROM [dbo].[Table1] T1
INNER JOIN ON [dbo].[Table2] T2 ON T1.[ID] = T2.[ID]
WHERE
      T1.[col1] = 'xxx'
  AND T2.[Col3] = 'yyy'
SET NOCOUNT OFF
GO

Вставка

CREATE PROC [dbo].[procTable_INS]
AS
SET NOCOUNT ON
INSERT INTO [Table1] (
[Column1]
  , [Column2]
  , [Column3]
)
VALUES (
    @Value1
  , @Value2
  , @Value3
)
SET NOCOUNT OFF
GO

ИЛИ

CREATE PROC dbo.procTable_INS
AS
SET NOCOUNT ON
INSERT INTO [table1] (
    [Column1]
  , [Column2]
  , [Column3]
)
SELECT
    [Column1] = T1.col1
  , [Column2] = T1.col2
  , [Column3] = T2.col3
FROM dbo.Table1 T1    
INNER JOIN ON Table2 T2 ON T1.ID = T2.ID
WHERE
      T1.[col1] = 'xxx'
  AND T2.[Col3] = 'yyy'
SET NOCOUNT OFF
GO

Удалить

CREATE PROC dbo.procTable_DEL
AS
SET NOCOUNT ON
DELETE
FROM [dbo].[Table1] T1
INNER JOIN ON [dbo].[Table2] T2 ON T1.[ID] = T2.[ID]
WHERE
      T1.[col1] = 'xxx'
  AND T2.[Col3] = 'yyy'
SET NOCOUNT OFF
GO

Ответ 5

Из действительно очень приятного блога на PostgreSQL, но эта тема применима в целом:

Поддерживаемые запросы - моя точка зрения (depesz.com)

... Я решил, что мои приоритеты для написания поддерживаемых запросов:

  • Избегайте бесполезной печати. ​​

  • Используйте псевдонимы для таблиц/представлений. Всегда. И сделать их разумными псевдонимы.

  • Код отступа в некотором роде.

  • Избегайте цитат (да, вот почему я ненавижу Django)

  • Использовать синтаксис соединения

Я согласен с капитализацией зарезервированных слов и любого другого идентификатора, кроме моего собственного.

Ответ 6

Мне лично не нравится префикс имени хранимой процедуры sp_ - он избыточен, IMO. Вместо этого мне нравится префикс их с идентификатором "единицы функциональности". например Я позвоню sprocs, чтобы иметь дело с заказами order_Save, order_GetById, order_GetByCustomer и т.д. Он держит их все логически сгруппированными в студии управления и затрудняет выбор неправильного. (GetOrderByProduct, GetCustomerById и т.д.)

Конечно, это личное предпочтение, другие люди могут предпочесть, чтобы все соединители Get вместе, все Save и т.д.

Просто мой 2c.

Ответ 7

Google для обычного принтера или посмотрите здесь. Я сам не пробовал, но это дает вам хорошее начало. В большинстве коммерческих инструментов, таких как Toad, есть опция форматирования, которая также помогает.

Ответ 8

Я удивлен, что стиль кодирования, который я использовал почти 20 лет, отсутствует в этом списке:

  SELECT column1,
         column2,
         column3,
         COALESCE(column4, 'foo') AS column4
    FROM tablename
   WHERE column1 = 'bar'
ORDER BY column1,
         column2

Я считаю это абсолютно читаемым, но я признаю, что это утомительно печатать. Если правильное выравнивание ключевых слов слишком велико, я бы выбрал для их выравнивания слева:

SELECT   column1,
         column2,
         column3,
         COALESCE(column4, 'foo') AS column4
FROM     tablename
WHERE    column1 = 'bar'
ORDER BY column1,
         column2

Ответ 9

Я обычно держу очень мало за строку, т.е.

select
    col1,
    col2,
    col3
from
    some_table tabl1
where
    col1 = 'some'
and 
(
    col2 = 'condition'
or  col2 = 'other'
)

Ответ 11

SELECT c.id
     , c.name
     , c.folder
     , cs.num_users active_members
     , cs.num_videos

  FROM campaign c
  JOIN campaign_stats cs
    ON cs.campaign_id = c.id
  JOIN (SELECT _c.id
             , _c.name

          FROM campaign _c
         WHERE _c.type = 9) t_c 
    ON t_c.id = c.id

 WHERE c.id IN (1,2,3)
   AND cs.num_videos > 10

Это очень хорошо для нас.

Этот фактический запрос не имеет большого смысла, поскольку я попытался его быстро построить в качестве примера... но это не так.

  • t_c обозначает подзапрос таблицы категорий или "темп-категорию".
  • _отчет содержимого внутри подзапросов.
  • имена столбцов псевдонимов имеют смысл в контексте запроса. например "active_members"
  • Размещение запятых в начале новых строк упрощает построение динамических запросов:

    $sql .= ", c.another_column"
    
  • все остальное просто.

Ответ 12

Все, что в синем, это верхний регистр SELECT, DELETE, GO и т.д.

Названия таблиц являются единственными, как таблица, в которой наши клиенты будут представлять собой таблицу клиентов

Связывание таблиц tablename_to_tablename

используйте _ между работами в именах таблиц и параметрах

Пример

BEGIN
    SELECT
        Company.ID AS Company_ID,
        Company.Client_Name,
        Company.Website,
        Office.Office_Name
    FROM
        Company_Office WITH(NOLOCK)
        INNER JOIN Company WITH(NOLOCK) ON Company_Office.Company_ID = Company.ID
    WHERE
END

Ответ 13

Используемые типы данных: Мы должны использовать только следующие типы данных:

  • INT
  • BIGINT
  • SMALLINT
  • VARCHAR
  • BIT
  • DATETIME

Укажите значение по умолчанию для типа данных BIT. Он не должен быть нулевым Названия таблиц и столбцов никогда не должны быть в нижнем регистре. Он должен описать свою цель. Избегайте использования коротких форм. При создании таблицы FK и PK нужно хорошо продумать и определить. Имена переменных должны начинаться с одной/двух букв с указанием типа данных в нижнем регистре. Напр. Переменная INT должна начинаться с i. Имя должно быть описательным, а краткие формы следует избегать. Каждое слово должно начинаться с заглавной буквы, за которой следуют все маленькие буквы.

например.

Правильный способ: - iTotalCount

Неверный способ: - xyz

Столбцы столбцов, используемые с предложением "WHERE" внутри хранимых процедур, должны быть проиндексированы/введены ключом. Это увеличит скорость обработки данных. Порядок параметров в предложении WHERE должен быть выполнен правильно. Первичный ключ/индекс должен предшествовать битовым переменным. Например: индекс создается в комбинации столбцов (REF_ID, T_TYPE_STR, CNUMBER, TLOG_ID)

- Правильный способ, когда индексированные ключи используются последовательно в разделе WHERE

SELECT REF_ID,T_TYPE_STR,C_NUMBER,TLOG_ID

FROM T_T_DATA_tbl

WHERE REF_ID = 1

AND LOG_ID = ‘4042654’

AND T_TYPE_STR = ‘SA’

AND CNUMBER = ‘10702’

–Incorrect way

SELECT REF_ID, T_TYPE_STR, CNUMBER, LOG_ID

FROM T_T_DATA_tbl

WHERE LOG_ID = ‘4042654’

AND T_TYPE_STR = ‘SA’

При написании хранимой процедуры у нас должен быть раздел описания в начале, который будет содержать Автор:

Дата создания:

Описание:

Если какой-либо sp модифицирован, этот раздел следует добавить с помощью

Модифицировано:

Изменено:

Описание:

Столбец

ROW_INSERTION_DATE_TIME AND ROW_UPDATION_DATE_TIME должен иметь значения по умолчанию как GETDATE().

Больше: http://www.writeulearn.com/sql-database-coding-standards/

Ответ 14

create table
    #tempTable (
        col1 int,
        col2 int,
        col3 int
    )

insert into
    #tempTable (
        col1,
        col2,
        col3
    )
    select
        col1,
        col2,
        col3
    from
        Table3
        inner join Table2
            on Table1.col1 = Table2.col2
    where col1 = 5

select
    col2,
    case when col1 = 3
        then 'something'
        else 'somethingelse'
    end
from #tempTable
where
    col1 = 5
    and (
        col2 = 5
        or col3 in (
            select field
            from Table2
            where
                somecol = 2
                and othercol = 5
        )
    )