Найти в Дзене
Аналитика данных

Заповеди SQL. Премудрость №2

1. Никогда не пиши SQL-запрос без псевдонимов (alias.col_name) или без полного наименования таблицы (table_name.col_name). Это приведёт к ошибкам и сделает код не читаемым. Пример с псевдонимами (alias): SELECT * FROM table1 AS t1
LEFT JOIN table2 AS t2 ON t1.id = t2.id Пример с полными наименованиями таблиц: SELECT * FROM table1
LEFT JOIN table2 ON table1.id = table2.id 2. Не используй RIGHT JOIN, вместо него пиши LEFT JOIN. FULL JOIN есть не во всех базах данных, но его можно эмулировать: SELECT * FROM table1 LEFT JOIN table2 ON table1.id = table2.id
UNION
SELECT * FROM table1 RIGHT JOIN table2 ON table1.id = table2.id А если нет RIGHT JOIN то эмуляция выглядит так: SELECT * FROM table1 LEFT JOIN table2 ON table1.id = table2.id
UNION
SELECT * FROM table2 LEFT JOIN table1 ON table2.id = table1.id 3. Всегда оставляй дату в формате даты и никогда просто числом, если нужен месяц, оставь просто первое число месяца. 4. Если нужен отчёт за какой-то период, то сначала сгенерируй таблицу с да

1. Никогда не пиши SQL-запрос без псевдонимов (alias.col_name) или без полного наименования таблицы (table_name.col_name). Это приведёт к ошибкам и сделает код не читаемым.

Пример с псевдонимами (alias):

SELECT * FROM table1 AS t1
LEFT JOIN table2 AS t2 ON t1.id = t2.id

Пример с полными наименованиями таблиц:

SELECT * FROM table1
LEFT JOIN table2 ON table1.id = table2.id

2. Не используй RIGHT JOIN, вместо него пиши LEFT JOIN.

FULL JOIN есть не во всех базах данных, но его можно эмулировать:

SELECT * FROM table1 LEFT JOIN table2 ON table1.id = table2.id
UNION
SELECT * FROM table1 RIGHT JOIN table2 ON table1.id = table2.id

А если нет RIGHT JOIN то эмуляция выглядит так:

SELECT * FROM table1 LEFT JOIN table2 ON table1.id = table2.id
UNION
SELECT * FROM table2 LEFT JOIN table1 ON table2.id = table1.id

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

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

Генерация всех месяцев в указанном периоде:

WITH dates(month) AS (
VALUES (({date_min}))
UNION ALL
SELECT date(month, '+1 month')
FROM dates
WHERE month < ({date_max}))

5. Когда делаешь отчёт по нескольким товарам, пользователям и т.п., всегда проверяй работу кода на одном ID (товар, пользователь и т.п.).

6. После всех вычислений проверяй контрольные суммы из «сырых» данных и из своего получившегося отчёта. Суммы должны сходиться.