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