Поиск…


Вступление

Как писать хорошие, читаемые SQL-запросы и примеры передового опыта.

Форматирование и правописание ключевых слов и имен

Таблицы / Имена столбцов

Двумя распространенными способами форматирования имен таблиц и столбцов являются CamelCase и snake_case :

SELECT FirstName, LastName
FROM Employees
WHERE Salary > 500;
SELECT first_name, last_name
FROM employees
WHERE salary > 500;

Имена должны описывать, что хранится в их объекте. Это означает, что имена столбцов обычно должны быть сингулярными. Должны ли имена таблиц использовать сингулярное или множественное число, является широко обсуждаемым вопросом, но на практике чаще всего используется множество имен таблиц.

Добавление префиксов или суффиксов, таких как tbl или col уменьшает читаемость, поэтому избегайте их. Однако они иногда используются для предотвращения конфликтов с ключевыми словами SQL и часто используются с триггерами и индексами (имена которых обычно не упоминаются в запросах).

Ключевые слова

Ключевые слова SQL не чувствительны к регистру. Тем не менее, обычно их пишут в верхнем регистре.

ВЫБРАТЬ *

SELECT * возвращает все столбцы в том же порядке, который определен в таблице.

При использовании SELECT * данные, возвращаемые запросом, могут меняться при изменении определения таблицы. Это увеличивает риск того, что разные версии вашего приложения или вашей базы данных несовместимы друг с другом.

Кроме того, чтение большего количества столбцов, чем необходимо, может увеличить объем дискового и сетевого ввода-вывода.

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

--SELECT *                                 don't
  SELECT ID, FName, LName, PhoneNumber  -- do
  FROM Emplopees;

(При выполнении интерактивных запросов эти соображения не применяются.)


Однако SELECT * не повредит в подзапросе оператора EXISTS, потому что EXISTS все равно игнорирует фактические данные (он проверяет, только если найдена хотя бы одна строка). По той же причине не имеет смысла перечислять какие-либо конкретные столбцы для EXISTS, поэтому SELECT * имеет смысл:

-- list departments where nobody was hired recently
SELECT ID,
       Name
FROM Departments
WHERE NOT EXISTS (SELECT *
                  FROM Employees
                  WHERE DepartmentID = Departments.ID
                    AND HireDate >= '2015-01-01');

Отступ

Нет общепринятого стандарта. Все согласны с тем, что сжатие всего в одну строку плохое:

SELECT d.Name, COUNT(*) AS Employees FROM Departments AS d JOIN Employees AS e ON d.ID = e.DepartmentID WHERE d.Name != 'HR' HAVING COUNT(*) > 10 ORDER BY COUNT(*) DESC;

Как минимум, поместите каждое предложение в новую строку и разделите строки, если они станут слишком длинными в противном случае:

SELECT d.Name,
       COUNT(*) AS Employees
FROM Departments AS d
JOIN Employees AS e ON d.ID = e.DepartmentID
WHERE d.Name != 'HR'
HAVING COUNT(*) > 10
ORDER BY COUNT(*) DESC;

Иногда все после того, как ключевое слово SQL, вводящее предложение, имеет отступ в одном столбце:

SELECT   d.Name,
         COUNT(*) AS Employees
FROM     Departments AS d
JOIN     Employees AS e ON d.ID = e.DepartmentID
WHERE    d.Name != 'HR'
HAVING   COUNT(*) > 10
ORDER BY COUNT(*) DESC;

(Это можно сделать и при правильном выравнивании ключевых слов SQL.)

Другим распространенным стилем является включение важных ключевых слов в их собственные строки:

SELECT
    d.Name,
    COUNT(*) AS Employees
FROM
    Departments AS d
JOIN
    Employees AS e
    ON d.ID = e.DepartmentID
WHERE
    d.Name != 'HR'
HAVING
    COUNT(*) > 10
ORDER BY
    COUNT(*) DESC;

Вертикальное выравнивание нескольких похожих выражений улучшает читаемость:

SELECT Model,
       EmployeeID
FROM Cars
WHERE CustomerID = 42
  AND Status     = 'READY';

Использование нескольких строк затрудняет внедрение SQL-команд в другие языки программирования. Однако многие языки имеют механизм для многострочных строк, например, @"..." в C #, """...""" в Python или R"(...)" в C ++.

присоединяется

Явные соединения всегда должны использоваться; неявные объединения имеют несколько проблем:

  • Условие соединения находится где-то в предложении WHERE, смешанном с любыми другими условиями фильтра. Это затрудняет понимание того, какие таблицы объединены и как.

  • Из-за вышеизложенного существует более высокий риск ошибок, и более вероятно, что они будут найдены позже.

  • В стандартном SQL явные соединения являются единственным способом использования внешних соединений :

    SELECT d.Name,
           e.Fname || e.LName AS EmpName
    FROM      Departments AS d
    LEFT JOIN Employees   AS e ON d.ID = e.DepartmentID;
    
  • Явные объединения позволяют использовать условие USING:

    SELECT RecipeID,
           Recipes.Name,
           COUNT(*) AS NumberOfIngredients
    FROM      Recipes
    LEFT JOIN Ingredients USING (RecipeID);
    

    (Это требует, чтобы обе таблицы использовали одно и то же имя столбца.
    ИСПОЛЬЗОВАНИЕ автоматически удаляет дубликат столбца из результата, например, соединение в этом запросе возвращает один столбец из RecipeID .)



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow