awilum.ru
Статьи Курсы Об авторе

Руководство по стилю SQL

Курсы / SQL Базовый уровень / Основы

Основные положения

Хороший стиль


SELECT file_hash -- stored ssdeep hash
	FROM file_system
	WHERE file_name = '.vimrc';
/* Updating the file record after writing to the file */
UPDATE file_system
   SET file_modified_date = '1980-02-22 13:19:01.00000',
		file_size = 209732
 WHERE file_name = '.vimrc';

Плохой стиль

Соглашения о наименовании

Общее


SELECT first_name
	FROM staff;

Таблицы

Столбцы

Псевдонимы/корреляции


SELECT first_name AS fn
  FROM staff AS s1
  JOIN students AS s2
    ON s2.mentor_id = s1.staff_num;
SELECT SUM(s.monitor_tally) AS monitor_total
	FROM staff AS s;

Хранимые процедуры

Универсальные суффиксы

Приведённые ниже суффиксы универсальны, что гарантирует простоту понимания значения столбцов из кода SQL.

Синтаксис запросов

Зарезервированные слова

Зарезервированные ключевые слова всегда пишите прописными буквами, например SELECT, WHERE.

Не используйте сокращённый вариант ключевого слова, если имеется полный. Например, используйте ABSOLUTE вместо ABS.

Не используйте специфичные для какого-либо поставщика СУБД ключевые слова, если в ANSI SQL есть ключевые слова, выполняющие такие же функции. Это сделает ваш код более переносимым.

SELECT model_num
  FROM phones AS p
 WHERE p.release_date > '2014-09-30';

Пробельные символы

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

Пробелы

Можно и нужно использовать пробелы для выравнивания основных ключевых слов по их правому краю. В типографике получающиеся таким образом «коридоры» стараются избегать, в то же время в нашем случае они, напротив, помогают лучше вычленять важные ключевые слова.

(SELECT f.species_name,
	AVG(f.height) AS average_height, AVG(f.diameter) AS average_diameter
FROM flora AS f
WHERE f.species_name = 'Banksia'
 OR f.species_name = 'Sheoak'
 OR f.species_name = 'Wattle'
GROUP BY f.species_name, f.observation_date)

UNION ALL

(SELECT b.species_name,
	AVG(b.height) AS average_height, AVG(b.diameter) AS average_diameter
FROM botanic_garden_flora AS b
WHERE b.species_name = 'Banksia'
 OR b.species_name = 'Sheoak'
 OR b.species_name = 'Wattle'
GROUP BY b.species_name, b.observation_date);

Обратите внимание, что ключевые слова SELECT, FROM и т.д. выровнены по правому краю, при этом названия столбцов и различные условия — по левому.

Помимо этого, старайтесь расставлять пробелы:

SELECT a.title, a.release_date, a.recording_date
FROM albums AS a
WHERE a.title = 'Charcoal Lane'
	OR a.title = 'The New Danger';

Переводы строки

Всегда делайте перенос строки:

Следуя принципу, что ключевые слова выравниваются по правому краю, а всё остальное — по левому, мы добиваемся достаточно удобного расположения частей кода, вследствие чего улучшается зрительная навигация по нему.

INSERT INTO albums (title, release_date, recording_date)
	 VALUES ('Charcoal Lane', '1990-01-01 01:01:01.00000', '1990-01-01 01:01:01.00000'),
		    ('The New Danger', '2008-01-01 01:01:01.00000', '1990-01-01 01:01:01.00000');
UPDATE albums
   SET release_date = '1990-01-01 01:01:01.00000'
 WHERE title = 'The New Danger';
SELECT a.title,
	   a.release_date, a.recording_date, a.production_date -- grouped dates together
 FROM albums AS a
WHERE a.title = 'Charcoal Lane'
   OR a.title = 'The New Danger';

Отступы

Для того, чтобы SQL был удобочитаем, важно также следовать стандартам расстановки отступов.

JOIN

Объединения (JOIN) должны располагаться по правую часть «коридора». При необходимости между ними можно добавить пустую строку.

SELECT r.last_name
  FROM riders AS r
	   INNER JOIN bikes AS b
	   ON r.bike_vin_num = b.vin_num
		  AND b.engine_tally > 2

	   INNER JOIN crew AS c
	   ON r.crew_chief_last_name = c.last_name
	      AND c.chief = 'Y';

Подзапросы

Подзапросы тоже должны быть выровнены по правому краю «коридора», а внутри них самих применяются те же правила форматирования, что и в любом другом запросе. Если используются вложенные подзапросы, может иметь смысл поставить закрывающую скобку на новой строке ровно под парной ей открывающей скобкой.

SELECT r.last_name,
	(SELECT MAX(YEAR(championship_date))
	   FROM champions AS c
	  WHERE c.last_name = r.last_name
		AND c.confirmed = 'Y') AS last_championship_year
 FROM riders AS r
WHERE r.last_name IN
	(SELECT c.last_name
	   FROM champions AS c
	  WHERE YEAR(championship_date) > '2008'
		AND c.confirmed = 'Y');

Формальные тонкости

SELECT CASE postcode
	WHEN 'BN1' THEN 'Brighton'
	WHEN 'EH1' THEN 'Edinburgh'
	END AS city
 FROM office_locations
WHERE country = 'United Kingdom'
  AND opening_time BETWEEN 8 AND 9
  AND postcode IN ('EH1', 'BN1', 'NN1', 'KW1');

Синтаксис CREATE

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

Внутри объявления CREATE делайте отступ, равный 4 пробелам.

Типы данных

Значения по умолчанию

Ограничения и ключи

Ограничения и их подмножество, ключи, — важная часть любой структуры базы данных, поэтому важно следовать стандартам их объявления, чтобы избежать трудностей в последующей поддержке написанного.

Ключи

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

  1. Ключ должен быть в какой-то степени уникальным.
  2. Должна быть согласованность по типу данных для значения во всей схеме, а также чем ниже вероятность того, что это изменится в будущем, тем лучше.
  3. Можно ли проверить значение на соответствие стандарту (например, ISO)?
  4. Ключ должен быть как можно проще, чтобы можно было без трудностей использовать составные ключи.

Это своего рода конвенции, которые нужно сформулировать при проектировании базы данных. Если требования впоследствии будут разрастаться, можно и нужно вносить изменения в структуру базы, чтобы поддерживать её в актуальном состоянии.

Ограничения

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

Общее

Расположение и порядок

Валидация

Пример:

CREATE TABLE staff (
	PRIMARY KEY (staff_num),
	staff_num      INT(5)       NOT NULL,
	first_name     VARCHAR(100) NOT NULL,
	pens_in_drawer INT(2)       NOT NULL,
				   CONSTRAINT pens_in_drawer_range
				   CHECK(pens_in_drawer BETWEEN 1 AND 99)
);

Чего следует избегать

Приложение

Список зарезервированных ключевых слов

Список зарезервированных ключевых слов ANSI SQL (92, 99 and 2003), MySQL версий с 3 по 5.x, PostgreSQL 8.1, MS SQL Server 2000, MS ODBC и Oracle 10.2.

Рекомендации, описанные в этом руководстве, во многом пересекаются с описанными в книге Джо Селко «Стиль программирования Джо Селко на SQL» (оригинал: SQL Programming Style).

SQL: Руководство по стилю (SQL style guide) за авторством Саймона Холиуэлла (Simon Holywell) находится под лицензией Creative Commons. Оригинал — https://www.sqlstyle.guide. Перевел Den Patin

Введение в SQL Типы данных
Записаться на курс