Учебник SQL для начинающих
Язык запросов к реляционным базам данных. Научимся выбирать, фильтровать и группировать данные, соединять таблицы через JOIN и считать агрегаты.
Курс «SQL» состоит из 11 разделов и 64 уроков: Основы SQL, Проектирование баз данных, Транзакции, блокировки и конкурентность, SQL на практике: рецепты и антипаттерны, Агрегатные функции и подзапросы, Функции SQL, Оконные функции, Оконные функции, Продвинутые запросы и оптимизация, Объединение таблиц в SQL и Для продвинутых. Уроки идут по порядку — от основ к более сложным темам, в каждом есть объяснение с примерами, а в конце — вопросы для самопроверки. К урокам привязаны задачи с автоматической проверкой: прочитали тему — сразу закрепили её кодом.
Программа курса
1 Основы SQL
- Начинаем изучать SQL
- Синтаксис SQL
Синтаксис SQL: структура инструкции, точка с запятой, регистр ключевых слов, однострочные и многострочные комментарии, порядок предложений SELECT.
- Создаем базу данных в SQL
- Создаем таблицу в SQL
- Ограничения в SQL
- SQL INSERT INTO
INSERT INTO в SQL: добавление одной и нескольких строк, синтаксис с явным и без явного списка столбцов, частые ошибки при вставке данных.
- Оператор SELECT в SQL
- Условие WHERE в SQL
- AND, OR и NOT в SQL
- IN и BETWEEN в SQL
- ORDER BY в SQL
- TOP и LIMIT в SQL
- SQL DISTINCT
SELECT DISTINCT в SQL: удаление дублирующихся строк из результата запроса, DISTINCT по нескольким столбцам и поведение с NULL-значениями.
- UPDATE в SQL
- SQL DELETE
DELETE в SQL: удаление строк по условию WHERE, удаление всех строк, отличие от TRUNCATE TABLE — с примерами и частыми ошибками.
- SQL TRUNCATE TABLE
TRUNCATE TABLE в SQL: быстрая очистка всех строк, сброс AUTO_INCREMENT, отличие от DELETE без WHERE — когда использовать каждый оператор.
- SQL DROP TABLE
DROP TABLE и DROP DATABASE в SQL: синтаксис полного удаления таблицы или базы данных, IF EXISTS, отличие от DELETE и TRUNCATE.
2 Проектирование баз данных
- Таблицы, первичный и внешний ключ
Что такое таблица, строка и столбец, зачем нужны PRIMARY KEY и FOREIGN KEY и как они защищают целостность данных. С живыми SQL-примерами.
- Связи: один-к-одному, один-ко-многим, многие-ко-многим
Три типа связей между таблицами: один-к-одному, один-ко-многим и многие-ко-многим. Как реализовать каждую через внешние ключи и связующие таблицы.
- Нормализация: 1НФ, 2НФ, 3НФ
Нормализация баз данных простыми словами: аномалии денормализованной таблицы и пошаговый разбор 1НФ, 2НФ и 3НФ на одном примере.
- ER-модель: сущности, атрибуты, связи
ER-модель простыми словами: сущности, атрибуты и связи с кардинальностью 1:1, 1:N и M:N. Разбираем пример магазина и превращаем чертёж в реальные таблицы SQL.
- От модели к SQL: создаём схему
Как перевести ER-модель в SQL: CREATE TABLE, типы столбцов, PRIMARY KEY, FOREIGN KEY, NOT NULL и правильный порядок создания таблиц на примере школьной базы.
- Таблицы, первичный и внешний ключ
3 Транзакции, блокировки и конкурентность
- Транзакции и ACID
Что такое транзакция и зачем она нужна: BEGIN/COMMIT/ROLLBACK, SAVEPOINT, свойства ACID простыми словами и пример атомарного перевода денег между счетами.
- Уровни изоляции
READ UNCOMMITTED, READ COMMITTED, REPEATABLE READ и SERIALIZABLE: аномалии грязного, неповторяемого и фантомного чтения и таблица того, что запрещает каждый уровень.
- Блокировки и взаимоблокировки
Строчные и табличные блокировки, SELECT FOR UPDATE, как возникает deadlock и как его избежать через единый порядок захвата ресурсов и короткие транзакции.
- MVCC и стратегии конкуренции
Многоверсионность (MVCC) как в PostgreSQL, версии строк и VACUUM, оптимистичная и пессимистичная блокировка, колонка-версия и выбор стратегии под частоту конфликтов.
- Транзакции и ACID
4 SQL на практике: рецепты и антипаттерны
- CTE и рекурсивные запросы
Common Table Expressions (WITH ... AS): как разбить сложный запрос на читаемые шаги и обойти иерархии и деревья через рекурсивный CTE.
- UPSERT: вставить-или-обновить
UPSERT в SQL: INSERT ... ON CONFLICT DO UPDATE, идемпотентные вставки, оператор MERGE, счётчики и кэш без гонок и дублей.
- NULL и троичная логика: ловушки
NULL в SQL и троичная логика: почему NULL ≠ NULL, как работает IS NULL, чем NOT IN ломается на NULL, и зачем нужны COALESCE, NULLIF, EXISTS.
- Антипаттерны и типичные ошибки
Антипаттерны SQL: SELECT *, неявные касты ломают индекс, проблема N+1, OFFSET vs keyset-пагинация, функция на индексируемом столбце и базовый EXPLAIN.
- CTE и рекурсивные запросы
5 Агрегатные функции и подзапросы
- Агрегатные функции COUNT, SUM, AVG, MIN, MAX
Агрегатные функции SQL COUNT, SUM, AVG, MIN, MAX: как считать строки, суммировать, находить среднее и экстремумы с примерами на SQLite.
- Подзапросы во WHERE: IN и скалярное сравнение
Подзапросы SQL во WHERE: IN, NOT IN, скалярное сравнение — вложенные SELECT для динамических условий с примерами на SQLite.
- Подзапросы в FROM и коррелированные подзапросы
Подзапросы в FROM (derived table) и коррелированные подзапросы в SQL: EXISTS, ссылка на внешний запрос, inline-представления с примерами.
- Агрегатные функции COUNT, SUM, AVG, MIN, MAX
6 Функции SQL
- Строковые функции UPPER, LOWER, LENGTH, SUBSTR, REPLACE
Строковые функции SQL: UPPER, LOWER, LENGTH, SUBSTR, REPLACE, TRIM и конкатенация оператором || — примеры на SQLite.
- Функции даты и времени в SQL
Функции даты и времени в SQLite: strftime, date, julianday — извлечение частей дат, стаж в годах, фильтрация по периоду.
- Условные выражения CASE WHEN, COALESCE, NULLIF
Условные выражения SQL: CASE WHEN для категоризации, COALESCE для замены NULL, NULLIF для защиты от деления на ноль — примеры на SQLite.
- Строковые функции UPPER, LOWER, LENGTH, SUBSTR, REPLACE
7 Оконные функции
- Введение в оконные функции: OVER и PARTITION BY
Оконные функции SQL: предложение OVER, PARTITION BY — вычисления по группе без GROUP BY, AVG/MAX/COUNT в окне с примерами на SQLite.
- Ранжирование: ROW_NUMBER, RANK, DENSE_RANK
ROW_NUMBER, RANK, DENSE_RANK в SQL: нумерация и ранжирование строк, топ-N по группе через PARTITION BY — примеры на SQLite.
- Оконные агрегаты и нарастающий итог
Оконные агрегаты SQL: нарастающий итог SUM, скользящее среднее AVG, ROWS BETWEEN PRECEDING AND CURRENT ROW — примеры на SQLite.
- Введение в оконные функции: OVER и PARTITION BY
8 Оконные функции
- Зачем нужны оконные функции
Оконные функции в SQL: агрегат рядом с каждой строкой без схлопывания. Синтаксис OVER и почему окно нельзя использовать в WHERE.
- OVER, PARTITION BY и ORDER BY
PARTITION BY делит таблицу на окна без схлопывания, ORDER BY внутри OVER задаёт порядок. Чем оконный ORDER BY отличается от сортировки вывода.
- Нумерация и ранжирование: ROW_NUMBER, RANK, DENSE_RANK
ROW_NUMBER, RANK и DENSE_RANK в SQL: чем отличаются при ничьих, где «дыры» в ранге и какую функцию выбрать под задачу.
- Доступ к соседним строкам: LAG и LEAD
LAG и LEAD в SQL: заглянуть в предыдущую и следующую строку без self-join. Приросты период к периоду, паузы между событиями, NULL на краях окна.
- Агрегаты-окна: нарастающий итог и скользящее среднее
SUM/AVG/COUNT OVER с ORDER BY — нарастающий итог, а рамка ROWS BETWEEN — скользящее среднее. Как читать поведение окна по умолчанию.
- Практика: топ-N по группам и доли
Топ-N в каждой группе через ROW_NUMBER в подзапросе, доли строки в группе через SUM OVER PARTITION BY — готовые шаблоны для отчётов.
- Зачем нужны оконные функции
9 Продвинутые запросы и оптимизация
- Подзапросы глубоко: скалярные, коррелированные, EXISTS
Скалярные и коррелированные подзапросы и EXISTS в SQL: чем отличаются по смыслу и цене, почему EXISTS лучше COUNT(*)>0 и когда переписать на JOIN.
- CTE и рекурсивные CTE
WITH для читаемости и WITH RECURSIVE для иерархий и последовательностей: якорь, рекурсивный шаг, условие остановки, обход дерева начальников.
- Условная логика: CASE, COALESCE, NULLIF
CASE как if/else в SQL, COALESCE для запасного значения вместо NULL и NULLIF для защиты от деления на ноль — с проверенными примерами.
- Операции над множествами: UNION, INTERSECT, EXCEPT
UNION, UNION ALL, INTERSECT и EXCEPT в SQL: объединение, пересечение и разность результатов. Почему UNION ALL быстрее UNION.
- Индексы: зачем нужны и как ускоряют
Индексы в SQL: B-tree, поиск log(N) вместо полного перебора, что индексировать (WHERE/JOIN/ORDER BY) и когда индекс не работает или вредит.
- План запроса, SARGable-условия и оптимизация
EXPLAIN QUERY PLAN, SCAN против SEARCH USING INDEX, SARGable-условия и антипаттерн N+1 — практический чек-лист оптимизации SQL-запросов.
- Подзапросы глубоко: скалярные, коррелированные, EXISTS
10 Объединение таблиц в SQL
11 Для продвинутых
- UNION в SQL
- LIKE в SQL
- ALTER TABLE в SQL
- Псевдонимы в SQL
- SQL GROUP BY
GROUP BY в SQL: группировка строк и агрегатные функции COUNT, SUM, AVG, MIN, MAX — с примерами на таблицах employees и customers.
- SQL HAVING
HAVING в SQL: фильтрация групп после GROUP BY, отличие от WHERE, примеры с COUNT, SUM и условиями на агрегаты.
- Представления в SQL