# SQL

**Области для изучения**

* Типы данных (авто инкремент, blob)
* CRUD operations (select, insert, update, delete)
* Функции aggregate (max, min, iif, sum)
* JOINs (left, right, inner, outer)
* Distinct
* Группировка
* Подзапросы
* Индексы (PK, FK, суррогатные индексы), управление подключением индексов
* Последовательность применения группировок и сортировок
* Производительность выборки, профилирование, планы запросов
* Уровни изоляции транзакций (dirty read, read committed, repeatable read)
* Хранимые процедуры и триггеры
* 1-5 нормальные формы хранения данных

**Best practices**

* Избегать использования бизнес логики SQL сервера (хранимые процедуры и триггеры)
* Использовать Restrictions, индексы для поддержания целостности данных который бы запрещал вставку дубликатов.
* Использовать поля createdAt, updatedAt в каждой таблице. При обновлении указывать where updatedAt = \<date> чтобы избежать ситуации перезаписывания уже обновленной записи.
* Пытаться использовать 3ю нормальную форму для хранения данных, использовать денормализацию только для решения проблем с производительностью.
* Шардировать данные, создавать несколько таблиц для общей сущности для ускорения выборок, в таблицах с 10M+ строк. Например address\_a, address\_b .. address\_z: адреса начинающиеся с разных букв находятся в разных таблицах.

**Рекомендуемая литература**

* Мартин Грубер. Понимание SQL
* Интерактивный SQL тренажер&#x20;
  * [https://sqlbolt.com/](https://sqlbolt.com/)
  * [https://sqlzoo.net/](https://sqlzoo.net/)
  * [https://www.w3schools.com/sql/](https://www.w3schools.com/sql/)
* Нарастающий итог в SQL [https://habr.com/ru/post/474458/](https://habr.com/ru/post/474458/)
