Как удостовериться, что мой код SQL не является страшной путаницей

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

10
задан froadie 6 July 2010 в 13:43
поделиться

3 ответа

Вы можете попробовать прочитать книгу Джо Селко Стиль программирования 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'
    )
11
ответ дан 3 December 2019 в 20:39
поделиться

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

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

    Ugly:
    select height, width, age from person where width = 20
    Tidy:
    ВЫБРАТЬ высоту, ширину, возраст FROM человека WHERE (width = 20)
  • Все имена таблиц в нижнем регистре. Никогда не используйте camelcase (donkeyWrench) в именах таблиц (вы выстрелите себе в голову, если будете создавать запросы вручную).

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

    Уродливо:
    ... где ширина = 20 и высота> 20
    Аккуратный:
    ГДЕ (ширина = 20) И (высота> 20)
  • Использовать псевдонимы для имен таблиц.
    `ВЫБРАТЬ * ИЗ гаечного ключа dw ...`
  • Используйте читаемые поля первичного ключа, связанные с именем таблицы. Я всегда начинаю ключи и первичные ключи с id_.
    имя таблицы: donkeywrench, первичный ключ: id_donkeywrench
  • Отметьте источник запроса. Читая журналы, вы можете легко отследить, где возникла проблема.
    / * Вызывается из donkeykong.php, строка 22 * ​​/ SELECT * FROM donkeywrench dw ...
  • Если запрос слишком длинный
    - Всегда оставляйте оператор (И, ИЛИ) в конце строки
    - Используйте круглые скобки!

Пример:

/*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
1
ответ дан 3 December 2019 в 20:39
поделиться

Обычно я следую этому типу синтаксиса для сервера MSSQL

SELECT statemenets

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')

Derived Tables in a Select

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

Update Statements

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

Insert Statements

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

If Statements

IF (some condition) BEGIN
END ELSE BEGIN
END

Procedures

CREATE PROCEDURE Foo (
  Bar INT,
  Foo VARCHAR(20)
) AS
BEGIN
  //Your Code Here
END
2
ответ дан 3 December 2019 в 20:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: