Email or username:

Password:

Forgot your password?
OfShad0ws

Советы начинающему аналитику (aka How to SQL) будут под этим постом
Кому не интересно, извините за спам, можете заглушить тэг #SQLtips
Критика и ценные замечания приветствуются, готов вносить правки.

8 comments
OfShad0ws

1. Осторожнее с проверками значений "не равно" (!=, not in, not between)
NULL не пройдёт ни одну из этих проверок, такие записи будут отфильтрованы.
Если их необходимо сохранить, используйте coalesce(t1.a,'X') != 'Y'

2. Всегда выполняйте регресс-тестирование на значительном объёме данных, а не на нескольких кейсах.
Используйте full join или except (в обе стороны)

#SQLtips

1. Осторожнее с проверками значений "не равно" (!=, not in, not between)
NULL не пройдёт ни одну из этих проверок, такие записи будут отфильтрованы.
Если их необходимо сохранить, используйте coalesce(t1.a,'X') != 'Y'

2. Всегда выполняйте регресс-тестирование на значительном объёме данных, а не на нескольких кейсах.
Используйте full join или except (в обе стороны)

OfShad0ws

3. Не присоединяйте таблицу с помощью left join, чтобы затем отфильтровать значения в ней в where.
Это фактически inner join, только выглядит непрофессионально и читается плохо.

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

#SQLtips

OfShad0ws

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

6. Иногда можно избавиться от case when с помощью функций least, greatest и других (зависят от языка). Это хорошо работает и чаще лучше читается. Прочитайте о доступных вам функциях хотя бы один раз, чтобы где-то осели знания типа "так можно". Не обязательно учить их синтаксис, важно знать о существовании.

#SQLtips

OfShad0ws

7. Если часто выполняете запрос, его можно сохранить как представление (create view).
Это позволит быстро вернуться к результатам, а иногда может быть удобным способом поделиться кодом и результатом с коллегой.

#SQLtips

OfShad0ws

8. Чтобы соединить несколько таблиц с помощью full join и не задублировать первичный ключ (a), используйте такую конструкцию:
select coalesce(t1.a,t2.a,t3.a,t4.a) as a
from t1
full join t2 on t2.a = t1.a
full join t3 on t3.a = coalesce(t1.a,t2.a)
full join t4 on t4.a = coalesce(t1.a,t2.a,t3.a)

9. Если таблица присоединяется к первой left join, а следующая присоединяется ко второй inner join, то left превращается в inner: это частая ошибка.

#SQLtips

8. Чтобы соединить несколько таблиц с помощью full join и не задублировать первичный ключ (a), используйте такую конструкцию:
select coalesce(t1.a,t2.a,t3.a,t4.a) as a
from t1
full join t2 on t2.a = t1.a
full join t3 on t3.a = coalesce(t1.a,t2.a)
full join t4 on t4.a = coalesce(t1.a,t2.a,t3.a)

9. Если таблица присоединяется к первой left join, а следующая присоединяется ко второй inner join, то left превращается в inner: это частая ошибка.

OfShad0ws

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

#SQLtips

OfShad0ws

11. При выполнении арифметических операций учитывайте, что любая операция с участием null даст null, а деление на 0 - ошибку. Заранее предусмотрите эти сценарии.

#SQLtips

OfShad0ws

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

#SQLtips

Go Up