Как убедиться, что мой код SQL не страшный беспорядок - PullRequest
10 голосов
/ 01 июля 2010

SQL кажется наиболее забытым языком, когда речь идет о приятном и читаемом форматировании ... А поскольку операторы SQL могут быть невероятно подробными и сложными, с ним чрезвычайно сложно работать. Но я обнаружил, что, когда я пытаюсь отформатировать свой код SQL наилучшим из возможных способов, я иногда не уверен, как это сделать. Я знаю стандарты для Java, C #, Python и т. Д. .... но когда дело доходит до SQL, я не видел слишком много руководств или принятых практик. Каковы советы / правила для форматирования SQL, чтобы он был понятным, разборчивым и логичным? Можете ли вы привести пример кода для иллюстрации? Какой, по вашему мнению, самый стандартный и приемлемый способ форматирования SQL?

Ответы [ 4 ]

11 голосов
/ 01 июля 2010

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

Некоторые из моих собственных "правил"

  • Ключевые слова SQL всегда все
  • в верхнем регистре * Имена таблиц имеют "правильный" регистр, а столбцы и переменные - в нижнем регистре
  • Каждое "основное" предложение в выражении находится в начале строки
  • Критерии JOIN и WHERE появляются ниже, с отступом и выравниванием
  • Вложенные элементы имеют отступ дальше
  • Я использую псевдонимы для всех таблиц и представлений

Например:

SELECT
    column_1,
    column_2,
    CASE
        WHEN column_5 = 'Blah' THEN 1
        WHEN column_6 = 'Blah' THEN 2
        ELSE 3
    END AS column_alias
FROM
    My_Table MT
INNER JOIN My_Other_Table MOT ON
    MOT.column_1 = MT.column_1
WHERE
    MT.column_2 = 'Some Value' AND
    (
        MT.column_3 = 'Some other value' OR
        MT.column_4 = 'Some other value'
    )
4 голосов
/ 15 ноября 2011

Может быть, это "обман";) - но я только что нашел удивительный сайт, который делает это для вас!

http://poorsql.com

И параметры полностью настраиваемые

2 голосов
/ 01 июля 2010

Я обычно придерживаюсь этого типа синтаксиса для MSSQL Server

ВЫБОР госменец

SELECT //optionally specify top or distinct
  Field1,
  Field2,
  CASE WHEN (1 = 1) THEN
      "1"
    ELSE
      "2"
  END AS Field3,
  ...
FROM Table1 t1
INNER JOIN Table2 t2
  ON t2.field1 = t1.field1  //I always reference the joined tables field name first
LEFT OUTER JOIN Table3 t3
  ON (t3.field1 = t1.field1
    AND t3.field2 = t2.field2)  //I specify and with a new line and tabbed in
    OR                         // I specify or(s) on thier own line this way you can distinguish from the two conditionals that need to be met
    (t3.field1 = t2.field1
    AND t3.field2 = t1.field2)
WHERE
   (t1.Field1 = 'foo'
   AND t1.field2 = 'bar')
   OR
   (t2.Field1 = 'foo'
   AND t1.field2 = 'bar')

Производные таблицы в виде выбора

Select
  Field1,
  Field2,
  ...
FROM (Select
          Field1,
          Field2,
          Field3)
        FROM Table1
        WHERE
          Field1 = '1') t1

Обновление выписок

UPDATE Table1
  SET
    Field1 = 1,
    Field2 = 2,
    Field3 = 3
WHERE
  (Field1 = 2
  AND Field3 = 2)
  OR 
  (Field3 = 1)

Вставить выписки

INSERT INTO Table1
  (Field1,
   Field2,
   Field3,
   ...)
VALUES
  (1,
   2,
   3,
   ...)

Если заявления

IF (some condition) BEGIN
END ELSE BEGIN
END

Процедура

CREATE PROCEDURE Foo (
  Bar INT,
  Foo VARCHAR(20)
) AS
BEGIN
  //Your Code Here
END
1 голос
/ 01 июля 2010

Я использую следующие правила:

  • Всегда в верхнем регистре sql зарезервированные слова (SELECT, FROM, WHERE, HAVING, AND, OR, DISTINCT и т.

  • Строчные все имена таблиц. Никогда не используйте camelcase (donkeyWrench) в именах таблиц (вы будете стрелять себе в голову, если будете создавать запросы вручную).

  • Всегда используйте скобки в предложениях WHERE и HAVING. Используйте пробел между операторами.

  • Использовать псевдонимы для имен таблиц.
  • Используйте удобочитаемые поля первичного ключа, связанные с таблицей. Я всегда запускаю ключи и первичные ключи с 'id _'.
  • Отметьте источник запроса. При чтении журналов вы можете легко отследить, где возникла проблема.
  • Если запрос слишком длинный

Пример:

/*Executed from xyz.php*/
SELECT 
p.height, p.width, p.age,
pd.hastel, pd.hasmobile

FROM 
person p
LEFT JOIN personaldata pd ON p.id_person = pd.id_person
LEFT JOIN relatives r ON pd.id_person = r.id_person

WHERE 
( p.width = 20 ) AND 
( (p.height > 20) AND (p.height < 15) ) AND
( pd.hastel)

ORDER BY 
p.age, p.height
...