Введение

Один из самых простых, но наиболее эффективных способов отточить свои навыки программиста — сделать свой код более читабельным. Читаемый код делает его более интерпретируемым, более воспроизводимым и упрощает отладку. Лучший способ сделать ваш код более читабельным — это применить некоторые правила или стандарты, чтобы сделать его согласованным и чистым.

С учетом сказанного я собираюсь поделиться с вами восемью советами по написанию высококлассного SQL-кода:

Не забудьте ПОДПИСАТЬСЯ здесь, чтобы не пропустить новую статью о руководствах по науке о данных, хитростях и советах, жизненных уроках и многом другом!

1. Ключевые слова и функции в верхнем регистре

Я начну с простого совета, который вы, возможно, уже используете, и это здорово, но вы будете удивлены количеством людей, которые не поддерживают этот совет: когда дело доходит до ключевых слов и функций, убедитесь, что они заглавными буквами!

Хотя это может показаться придиркой, подобные советы сделают ваш код в десять раз более разборчивым.

Вместо:

select name, date_trunc(register_date, week) from customers

Попробуйте:

SELECT name, DATE_TRUNC(register_date, WEEK) FROM customers

2. Отступ и выравнивание

Следующий совет, основанный на нашем предыдущем примере, посвящен отступам и выравниванию кода. Рассмотрим два примера — какой из них более разборчив?

SELECT name, height, age, salary, CASE WHEN age<18 THEN "child" ELSE    
"adult" END AS child_or_adult
FROM People LEFT JOIN Income USING (name)
WHERE height<=200 and age<=65

or

SELECT 
   name
 , height
 , age
 , salary
 , CASE WHEN age < 18 THEN "child"
        ELSE "adult"
   END AS child_or_adult
FROM 
   People
LEFT JOIN 
   Income USING (name)
WHERE 
   height <= 200
   AND age <= 65

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

Хотя вам не обязательно следовать этому точному стилю отступов и форматирования, важно по-прежнему применять его и разрабатывать согласованный стиль во всем коде.

Не забудьте ПОДПИСАТЬСЯ здесь, чтобы не пропустить новую статью о руководствах по науке о данных, хитростях и советах, жизненных уроках и многом другом!

3. Примените согласованный тип случая для схем, таблиц, столбцов.

В программировании существует несколько типов типов case, и это лишь некоторые из них:

  • верблюдЧехол
  • PascalCase
  • змея_кейс

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

Вместо:

SELECT 
   firstName
 , LastName
 , child_or_adult 
FROM 
   customers

Попробуйте:

SELECT 
   first_name
 , last_name
 , child_or_adult 
FROM 
   customers

4. Избегайте SELECT *

Это важный совет не только для форматирования, но и для оптимизации запросов (о чем мы поговорим в другой статье!).

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

Вместо:

SELECT 
   *
FROM 
   customers

Попробуйте:

SELECT 
   name
 , height
 , age
 , salary
FROM 
   customers

Не забудьте ПОДПИСАТЬСЯ здесь, чтобы не пропустить новую статью о руководствах по науке о данных, хитростях и советах, жизненных уроках и многом другом!

5. Модульность кода с помощью общих табличных выражений

Использование общих табличных выражений (или CTE) чрезвычайно полезно для модуляции и разбиения вашего кода — подумайте об этом так же, как если бы вы разбили эссе на несколько абзацев.

Ознакомьтесь с этой статьей, если вы хотите узнать о CTE более подробно, но по своей сути CTE создают временную таблицу, которая позволяет вам запросить запрос.

Вместо:

SELECT 
   name
 , salary
FROM 
   People
WHERE 
   name IN (SELECT DISTINCT 
              name 
           FROM 
              population 
           WHERE 
              country = "Canada"
              AND city = "Toronto")
   AND salary >= (SELECT 
                     AVG(salary)
                  FROM 
                     salaries
                  WHERE 
                     gender = "Female")

Попробуйте:

with toronto_ppl as (
   SELECT DISTINCT 
      name
   FROM 
      population
   WHERE 
      country = "Canada"
      AND city = "Toronto"
)
, avg_female_salary as (
   SELECT 
      AVG(salary) as avg_salary
   FROM 
      salaries
   WHERE 
      gender = "Female"
)
SELECT 
   name
,  salary
FROM 
   People
WHERE 
   name IN(SELECT name FROM toronto_ppl)
   AND salary >= (SELECT avg_salary FROM avg_female_salary)

Теперь легко сказать, что предложение WHERE отфильтровывает имена в Торонто. CTE полезны не только потому, что вы можете разбить свой код на более мелкие блоки, но и потому, что вы можете присвоить имя переменной каждому CTE (например, toronto_ppl и avg_female_salary).

Говоря об именах переменных, это приводит к следующему пункту:

6. Описательные имена переменных

Когда вы создаете имена переменных, вы хотите, чтобы они описывали то, что они представляют. Рассмотрим мой предыдущий пример:

with toronto_ppl as (
   SELECT DISTINCT 
      name
   FROM 
      population
   WHERE 
      country = "Canada"
      AND city = "Toronto"
)
, avg_female_salary as (
   SELECT 
      AVG(salary) as avg_salary
   FROM 
      salaries
   WHERE 
      gender = "Female"
)
SELECT 
   name
,  salary
FROM 
   People
WHERE 
   name IN(SELECT name FROM toronto_ppl)
   AND salary >= (SELECT avg_salary FROM avg_female_salary)

Просто прочитав сами имена переменных, становится ясно, что первый CTE извлекает людей из Торонто, а второй CTE получает среднюю зарплату женщин.

С другой стороны, это был бы пример плохого соглашения об именах (которое я действительно видел раньше):

with table_one as (
   SELECT DISTINCT 
      name
   FROM 
      population
   WHERE 
      country = "Canada"
      AND city = "Toronto"
)
, table_two as (
   SELECT 
      AVG(salary) as var_1
   FROM 
      salaries
   WHERE 
      gender = "Female"
)
SELECT 
   name
,  salary
FROM 
   People
WHERE 
   name IN(SELECT name FROM table_one)
   AND salary >= (SELECT var_1 FROM table_two)

7. Упростите код, используя временные функции

Временные функции — отличный способ

  1. Разрушение кода
  2. Написание более чистого кода
  3. И возможность повторно использовать код.

Если вы хотите узнать больше о временных функциях, вы можете прочитать эту статью.

Рассмотрим следующий пример:

SELECT name
       , CASE WHEN tenure < 1 THEN "analyst"
              WHEN tenure BETWEEN 1 and 3 THEN "associate"
              WHEN tenure BETWEEN 3 and 5 THEN "senior"
              WHEN tenure > 5 THEN "vp"
              ELSE "n/a"
         END AS seniority 
FROM employees

Вместо этого вы можете использовать временную функцию для захвата предложения CASE.

CREATE TEMPORARY FUNCTION seniority(tenure INT64) AS (
   CASE WHEN tenure < 1 THEN "analyst"
        WHEN tenure BETWEEN 1 and 3 THEN "associate"
        WHEN tenure BETWEEN 3 and 5 THEN "senior"
        WHEN tenure > 5 THEN "vp"
        ELSE "n/a"
   END
);
SELECT name
       , seniority(tenure) as seniority
FROM employees

С временной функцией сам запрос намного проще, читабельнее, и вы можете повторно использовать функцию старшинства!

8. Значимые комментарии

Вот самое важное правило при написании комментариев: Пишите комментарии только тогда, когда это необходимо.

Следуя предыдущим семи советам (используя описательные имена, модульность кода, написание чистого кода и т. д.), вам не нужно будет писать много комментариев.

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

Вот пример плохого комментария:

# Getting names of people in Toronto, Canada
with table1 as (
   SELECT DISTINCT name
   FROM population
   WHERE country = "Canada"
         AND city = "Toronto"
)
# Getting the average salary of females
, table2 as (
   SELECT AVG(salary) as var1
   FROM salaries
   WHERE gender = "Female"
)

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

Спасибо за прочтение!

Не забудьте ПОДПИСАТЬСЯ здесь, чтобы не пропустить новую статью о руководствах по науке о данных, хитростях и советах, жизненных уроках и многом другом!

Не знаете, что читать дальше? Я подобрал для вас еще одну статью:



и еще один:



- Теренс Шин