Базы данных

Учебник SQL для начинающих

64 урока · 11 разделов · бесплатно, без регистрации

Язык запросов к реляционным базам данных. Научимся выбирать, фильтровать и группировать данные, соединять таблицы через JOIN и считать агрегаты.

Курс «SQL» состоит из 11 разделов и 64 уроков: Основы SQL, Проектирование баз данных, Транзакции, блокировки и конкурентность, SQL на практике: рецепты и антипаттерны, Агрегатные функции и подзапросы, Функции SQL, Оконные функции, Оконные функции, Продвинутые запросы и оптимизация, Объединение таблиц в SQL и Для продвинутых. Уроки идут по порядку — от основ к более сложным темам, в каждом есть объяснение с примерами, а в конце — вопросы для самопроверки. К урокам привязаны задачи с автоматической проверкой: прочитали тему — сразу закрепили её кодом.

Программа курса

  1. 1 Основы SQL

    1. Начинаем изучать SQL
    2. Синтаксис SQL

      Синтаксис SQL: структура инструкции, точка с запятой, регистр ключевых слов, однострочные и многострочные комментарии, порядок предложений SELECT.

    3. Создаем базу данных в SQL
    4. Создаем таблицу в SQL
    5. Ограничения в SQL
    6. SQL INSERT INTO

      INSERT INTO в SQL: добавление одной и нескольких строк, синтаксис с явным и без явного списка столбцов, частые ошибки при вставке данных.

    7. Оператор SELECT в SQL
    8. Условие WHERE в SQL
    9. AND, OR и NOT в SQL
    10. IN и BETWEEN в SQL
    11. ORDER BY в SQL
    12. TOP и LIMIT в SQL
    13. SQL DISTINCT

      SELECT DISTINCT в SQL: удаление дублирующихся строк из результата запроса, DISTINCT по нескольким столбцам и поведение с NULL-значениями.

    14. UPDATE в SQL
    15. SQL DELETE

      DELETE в SQL: удаление строк по условию WHERE, удаление всех строк, отличие от TRUNCATE TABLE — с примерами и частыми ошибками.

    16. SQL TRUNCATE TABLE

      TRUNCATE TABLE в SQL: быстрая очистка всех строк, сброс AUTO_INCREMENT, отличие от DELETE без WHERE — когда использовать каждый оператор.

    17. SQL DROP TABLE

      DROP TABLE и DROP DATABASE в SQL: синтаксис полного удаления таблицы или базы данных, IF EXISTS, отличие от DELETE и TRUNCATE.

  2. 2 Проектирование баз данных

    1. Таблицы, первичный и внешний ключ

      Что такое таблица, строка и столбец, зачем нужны PRIMARY KEY и FOREIGN KEY и как они защищают целостность данных. С живыми SQL-примерами.

    2. Связи: один-к-одному, один-ко-многим, многие-ко-многим

      Три типа связей между таблицами: один-к-одному, один-ко-многим и многие-ко-многим. Как реализовать каждую через внешние ключи и связующие таблицы.

    3. Нормализация: 1НФ, 2НФ, 3НФ

      Нормализация баз данных простыми словами: аномалии денормализованной таблицы и пошаговый разбор 1НФ, 2НФ и 3НФ на одном примере.

    4. ER-модель: сущности, атрибуты, связи

      ER-модель простыми словами: сущности, атрибуты и связи с кардинальностью 1:1, 1:N и M:N. Разбираем пример магазина и превращаем чертёж в реальные таблицы SQL.

    5. От модели к SQL: создаём схему

      Как перевести ER-модель в SQL: CREATE TABLE, типы столбцов, PRIMARY KEY, FOREIGN KEY, NOT NULL и правильный порядок создания таблиц на примере школьной базы.

  3. 3 Транзакции, блокировки и конкурентность

    1. Транзакции и ACID

      Что такое транзакция и зачем она нужна: BEGIN/COMMIT/ROLLBACK, SAVEPOINT, свойства ACID простыми словами и пример атомарного перевода денег между счетами.

    2. Уровни изоляции

      READ UNCOMMITTED, READ COMMITTED, REPEATABLE READ и SERIALIZABLE: аномалии грязного, неповторяемого и фантомного чтения и таблица того, что запрещает каждый уровень.

    3. Блокировки и взаимоблокировки

      Строчные и табличные блокировки, SELECT FOR UPDATE, как возникает deadlock и как его избежать через единый порядок захвата ресурсов и короткие транзакции.

    4. MVCC и стратегии конкуренции

      Многоверсионность (MVCC) как в PostgreSQL, версии строк и VACUUM, оптимистичная и пессимистичная блокировка, колонка-версия и выбор стратегии под частоту конфликтов.

  4. 4 SQL на практике: рецепты и антипаттерны

    1. CTE и рекурсивные запросы

      Common Table Expressions (WITH ... AS): как разбить сложный запрос на читаемые шаги и обойти иерархии и деревья через рекурсивный CTE.

    2. UPSERT: вставить-или-обновить

      UPSERT в SQL: INSERT ... ON CONFLICT DO UPDATE, идемпотентные вставки, оператор MERGE, счётчики и кэш без гонок и дублей.

    3. NULL и троичная логика: ловушки

      NULL в SQL и троичная логика: почему NULL ≠ NULL, как работает IS NULL, чем NOT IN ломается на NULL, и зачем нужны COALESCE, NULLIF, EXISTS.

    4. Антипаттерны и типичные ошибки

      Антипаттерны SQL: SELECT *, неявные касты ломают индекс, проблема N+1, OFFSET vs keyset-пагинация, функция на индексируемом столбце и базовый EXPLAIN.

  5. 5 Агрегатные функции и подзапросы

    1. Агрегатные функции COUNT, SUM, AVG, MIN, MAX

      Агрегатные функции SQL COUNT, SUM, AVG, MIN, MAX: как считать строки, суммировать, находить среднее и экстремумы с примерами на SQLite.

    2. Подзапросы во WHERE: IN и скалярное сравнение

      Подзапросы SQL во WHERE: IN, NOT IN, скалярное сравнение — вложенные SELECT для динамических условий с примерами на SQLite.

    3. Подзапросы в FROM и коррелированные подзапросы

      Подзапросы в FROM (derived table) и коррелированные подзапросы в SQL: EXISTS, ссылка на внешний запрос, inline-представления с примерами.

  6. 6 Функции SQL

    1. Строковые функции UPPER, LOWER, LENGTH, SUBSTR, REPLACE

      Строковые функции SQL: UPPER, LOWER, LENGTH, SUBSTR, REPLACE, TRIM и конкатенация оператором || — примеры на SQLite.

    2. Функции даты и времени в SQL

      Функции даты и времени в SQLite: strftime, date, julianday — извлечение частей дат, стаж в годах, фильтрация по периоду.

    3. Условные выражения CASE WHEN, COALESCE, NULLIF

      Условные выражения SQL: CASE WHEN для категоризации, COALESCE для замены NULL, NULLIF для защиты от деления на ноль — примеры на SQLite.

  7. 7 Оконные функции

    1. Введение в оконные функции: OVER и PARTITION BY

      Оконные функции SQL: предложение OVER, PARTITION BY — вычисления по группе без GROUP BY, AVG/MAX/COUNT в окне с примерами на SQLite.

    2. Ранжирование: ROW_NUMBER, RANK, DENSE_RANK

      ROW_NUMBER, RANK, DENSE_RANK в SQL: нумерация и ранжирование строк, топ-N по группе через PARTITION BY — примеры на SQLite.

    3. Оконные агрегаты и нарастающий итог

      Оконные агрегаты SQL: нарастающий итог SUM, скользящее среднее AVG, ROWS BETWEEN PRECEDING AND CURRENT ROW — примеры на SQLite.

  8. 8 Оконные функции

    1. Зачем нужны оконные функции

      Оконные функции в SQL: агрегат рядом с каждой строкой без схлопывания. Синтаксис OVER и почему окно нельзя использовать в WHERE.

    2. OVER, PARTITION BY и ORDER BY

      PARTITION BY делит таблицу на окна без схлопывания, ORDER BY внутри OVER задаёт порядок. Чем оконный ORDER BY отличается от сортировки вывода.

    3. Нумерация и ранжирование: ROW_NUMBER, RANK, DENSE_RANK

      ROW_NUMBER, RANK и DENSE_RANK в SQL: чем отличаются при ничьих, где «дыры» в ранге и какую функцию выбрать под задачу.

    4. Доступ к соседним строкам: LAG и LEAD

      LAG и LEAD в SQL: заглянуть в предыдущую и следующую строку без self-join. Приросты период к периоду, паузы между событиями, NULL на краях окна.

    5. Агрегаты-окна: нарастающий итог и скользящее среднее

      SUM/AVG/COUNT OVER с ORDER BY — нарастающий итог, а рамка ROWS BETWEEN — скользящее среднее. Как читать поведение окна по умолчанию.

    6. Практика: топ-N по группам и доли

      Топ-N в каждой группе через ROW_NUMBER в подзапросе, доли строки в группе через SUM OVER PARTITION BY — готовые шаблоны для отчётов.

  9. 9 Продвинутые запросы и оптимизация

    1. Подзапросы глубоко: скалярные, коррелированные, EXISTS

      Скалярные и коррелированные подзапросы и EXISTS в SQL: чем отличаются по смыслу и цене, почему EXISTS лучше COUNT(*)>0 и когда переписать на JOIN.

    2. CTE и рекурсивные CTE

      WITH для читаемости и WITH RECURSIVE для иерархий и последовательностей: якорь, рекурсивный шаг, условие остановки, обход дерева начальников.

    3. Условная логика: CASE, COALESCE, NULLIF

      CASE как if/else в SQL, COALESCE для запасного значения вместо NULL и NULLIF для защиты от деления на ноль — с проверенными примерами.

    4. Операции над множествами: UNION, INTERSECT, EXCEPT

      UNION, UNION ALL, INTERSECT и EXCEPT в SQL: объединение, пересечение и разность результатов. Почему UNION ALL быстрее UNION.

    5. Индексы: зачем нужны и как ускоряют

      Индексы в SQL: B-tree, поиск log(N) вместо полного перебора, что индексировать (WHERE/JOIN/ORDER BY) и когда индекс не работает или вредит.

    6. План запроса, SARGable-условия и оптимизация

      EXPLAIN QUERY PLAN, SCAN против SEARCH USING INDEX, SARGable-условия и антипаттерн N+1 — практический чек-лист оптимизации SQL-запросов.

  10. 10 Объединение таблиц в SQL

    1. Объединение таблиц в SQL
    2. INNER JOIN в SQL
    3. LEFT JOIN в SQL
    4. RIGHT JOIN в SQL
    5. FULL JOIN в SQL
    6. CROSS JOIN в SQL
  11. 11 Для продвинутых

    1. UNION в SQL
    2. LIKE в SQL
    3. ALTER TABLE в SQL
    4. Псевдонимы в SQL
    5. SQL GROUP BY

      GROUP BY в SQL: группировка строк и агрегатные функции COUNT, SUM, AVG, MIN, MAX — с примерами на таблицах employees и customers.

    6. SQL HAVING

      HAVING в SQL: фильтрация групп после GROUP BY, отличие от WHERE, примеры с COUNT, SUM и условиями на агрегаты.

    7. Представления в SQL