Есть ли широко распространенный стандарт кодирования SQL? SQL немного отличается от языка программирования C/С++. На самом деле не знаю, как наилучшим образом форматировать его для удобства чтения.
С какими стандартами кодирования SQL вы следуете?
Ответ 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
Ответ 4
Если вы google, существует множество стандартов кодирования. Например,
Стандарт и руководство по кодированию базы данных
и
Стандарты и рекомендации по кодированию базы данных SQL SERVER Полный список
Ответ 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'
)
Ответ 10
Играйте с www.sqlinform.com - Я рекомендую использовать стандарт ANSI-92, а затем довольно хорошо с этим сайтом.
Ответ 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
)
)