> For the complete documentation index, see [llms.txt](https://interlink.gitbook.io/process/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://interlink.gitbook.io/process/dev/development/technologies/databases/sql.md).

# 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://sqlzoo.net/>
  * <https://www.w3schools.com/sql/>
* Нарастающий итог в SQL <https://habr.com/ru/post/474458/>
