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 стоит только когда гонка уже поймана за руку.

Автор статьи: Клавдия Кондакова