SQL в целом: CRUD, джойны и диалекты
| Введение | |
| Четыре команды на каждый день | |
| Джойны без боли | |
| Диалекты | |
| Индексы | |
| Транзакции |
Введение
SQL это декларативный язык: вы описываете, какие данные хотите получить, а СУБД сама решает, как их достать. Один и тот же запрос работает в MySQL, PostgreSQL и MSSQL с поправкой на диалект.
Четыре команды на каждый день
Почти вся работа это CRUD: SELECT читает, INSERT добавляет, UPDATE меняет, DELETE удаляет. Выучите их порядок и синтаксис WHERE, и дальше всё остальное это комбинации:
SELECT name, price FROM products WHERE price > 100 ORDER BY price DESC;
Джойны без боли
INNER JOIN оставляет только совпавшие строки, LEFT JOIN сохраняет все строки левой таблицы и подставляет NULL справа. Правило большого пальца: начинайте с LEFT JOIN, пока не убедитесь, что «лишних» строк нет, иначе отчёты тихо потеряют данные.
Диалекты
Стандарт один, мелочи разные: кавычки для идентификаторов, LIMIT против
TOP и FETCH, автоинкремент против SERIAL и IDENTITY, функции дат.
Пишите переносимый код на общем подмножестве, а специфику прячьте в
миграции, а не в application code.
Если схема ещё не выбрана, почитайте, когда вместо реляционной базы
берут NoSQL.
Индексы
Без индекса каждый запрос читает всю таблицу. Индексируйте колонки из WHERE и JOIN, составные индексы стройте в порядке селективности, а лишние периодически вычищайте — каждый индекс замедляет запись. Проверяйте план через EXPLAIN до продакшена, а не после первого фаерфайтинга.
Транзакции
Транзакция это «всё или ничего» для группы изменений: деньги списались и зачислились атомарно, а не по частям. Держите транзакции короткими — долгие держат локи и душат параллельность. Уровень изоляции по умолчанию подходит почти всегда; лезть в SERIALIZABLE стоит только с измеренной гонкой в руках.
| Базы данных | |
| SQL in general | |
| NoSQL databases | |
| MySQL | |
| PostgreSQL |