Базы данных с нуля: от данных до запросов

Курс для школьников 8–11 классов, который знакомит с базами данных через простые аналогии из жизни. Вы узнаете, что такое данные и базы данных, как устроены таблицы и связи между ними, научитесь писать запросы на языке SQL и управлять информацией. Курс построен на практических заданиях и примерах, понятных каждому.

1. Что такое данные и базы данных: зачем они нужны и какие бывают

Что такое данные и базы данных: зачем они нужны и какие бывают

Представь, что ты ведёшь дневник тренировок в блокноте. Каждый день записываешь: дату, упражнение, количество подходов, вес. Через месяц блокнот полон — а найти, сколько ты жал лёжа три недели назад, уже нереально. Приходится листать страницы одну за другой. А теперь представь, что у тебя не один блокнот, а пятьсот — и все они о разных вещах: друзьях, фильмах, оценках, поездках. Как в этом разобраться? Именно эту проблему решают базы данных — но начнём с самого начала.

Что такое данные

Данные — это любые зафиксированные сведения о чём-либо. Твоя фамилия в школьном журнале — данные. Температура за окном на термометре — данные. Количество лайков под постом — тоже данные. По сути, данные — это сырой материал, из которого потом можно извлечь смысл.

Важно отличать данные от информации. Данные — это отдельные факты без контекста. Информация — это данные, которые уже обработаны и несут смысл. Например, число «5» — это просто данные. А фраза «Иванов получил 5 по математике 15 марта» — уже информация, потому что число обрело смысл в контексте.

> Данные — это сырой материал. Информация — это данные, получившие смысл и контекст.

В цифровом мире данные хранятся в электронном виде: текстовые файлы, таблицы Excel, фотографии, сообщения в мессенджерах. Каждый день человек генерирует огромное количество данных — от поисковых запросов до геолокации телефона. По оценкам Statista, к 2025 году общий объём данных в мире превысит 180 зеттабайт. Чтобы представить масштаб: один зеттабайт — это триллион гигабайт.

Зачем нужны базы данных

Вернёмся к блокноту. Пока записей мало — пять, десять, двадцать — ты легко находишь нужное. Но что делать, когда записей тысячи? Нужен способ не просто хранить данные, а быстро находить нужные, добавлять новые, удалять устаревшие и не путаться при этом.

База данных — это организованное хранилище данных, в котором информация структурирована так, чтобы её можно было быстро находить, добавлять, изменять и удалять.

Почему бы не обойтись обычным файлом или таблицей? Вот простой пример. Допустим, у тебя есть Excel-файл с контактами всех учеников школы — 800 человек. Тебе нужно найти всех, кто учится в 9-м классе и живёт на улице Ленина. В Excel ты будешь фильтровать вручную или писать сложные формулы. База данных решает такую задачу за доли секунды с помощью одного запроса.

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

Какие бывают базы данных

Базы данных различаются по способу организации данных. Есть два главных типа, и понимание разницы между ними — одна из ключевых тем всего курса.

Реляционные базы данных

Реляционная база данных — это база, в которой данные хранятся в таблицах, связанных между собой. Представь школьный журнал: каждая страница — это таблица. На одной — список учеников, на другой — оценки, на третьей — расписание. Между этими страницами есть связи: оценка принадлежит конкретному ученику, ученик учится в конкретном классе.

Главный принцип реляционной базы — каждая таблица хранит данные об одном типе объектов. Ученики — отдельно, оценки — отдельно, предметы — отдельно. А связи между ними обеспечиваются с помощью ключей — специальных идентификаторов, о которых поговорим подробнее в следующих главах.

Самый известный язык для работы с реляционными базами — SQL (Structured Query Language, структурированный язык запросов). С его помощью можно создавать таблицы, искать данные, добавлять, менять и удалять записи.

Примеры реляционных баз данных: MySQL, PostgreSQL, SQLite, Microsoft SQL Server. Они используются в банковских системах, интернет-магазинах, социальных сетях — везде, где важна точность и согласованность данных.

Нереляционные базы данных (NoSQL)

Нереляционные базы данных — это базы, которые не используют табличную структуру. Данные могут храниться в виде документов, пар «ключ-значение», графов или колонок. Звучит абстрактно, поэтому — аналогия.

Представь два способа хранить коллекцию наклеек. Первый — в альбоме с размеченными ячейками: каждая наклейка на своём месте, все одного размера. Это реляционный подход. Второй — в коробке: наклейки лежат кучей, каждая помечена ярлыком, и ты достаёшь нужную по ярлыку. Это похоже на нереляционный подход — он гибче, но требует другого способа поиска.

Нереляционные базы данных обозначают аббревиатурой NoSQL (Not Only SQL, «не только SQL»). Это не значит, что SQL там не используется вообще — просто данные организованы иначе.

| Тип | Как хранит данные | Аналогия | Пример базы | |---|---|---|---| | Документная | В виде документов (JSON) | Папка с анкетами | MongoDB | | «Ключ-значение» | Пары: ключ → значение | Словарь | Redis | | Графовая | Узлы и связи между ними | Карта друзей ВКонтакте | Neo4j | | Колоночная | Данные по колонкам | Столбцы Excel | Cassandra |

Когда использовать реляционную базу, а когда нереляционную? Если данные строго структурированы и важны связи между ними — подойдёт реляционная. Если данные часто меняют структуру или нужно обрабатывать огромные объёмы с высокой скоростью — стоит рассмотреть нереляционную. Но это обобщение; в реальном проекте выбор зависит от десятка факторов.

Как данные превращаются в базу данных

Допустим, у тебя есть список любимых фильмов в блокноте. Каждая запись содержит: название, год, жанр, оценку. Это уже данные. Но чтобы превратить их в базу данных, нужно:

  • Определить структуру — решить, какие поля (столбцы) будут в таблице
  • Задать типы данных — понять, что «год» — это число, а «название» — текст
  • Организовать хранение — создать таблицу и внести записи
  • Обеспечить доступ — дать возможность искать, добавлять и удалять данные
  • На практике это выглядит так. Допустим, ты ведёшь учёт прочитанных книг. В блокноте у тебя 30 записей. Ты решаешь перенести их в базу данных. Сначала определяешь поля: название, автор, год издания, жанр, прочитана ли. Потом создаёшь таблицу с этими полями и заполняешь её. Теперь ты можешь за секунду найти все книги определённого автора или посчитать, сколько книг ты прочитал за год.

    Типичное заблуждение

    Многие думают, что база данных — это то же самое, что таблица в Excel. На самом деле разница принципиальная. Excel — это программа для работы с электронными таблицами, где данные хранятся в одном файле. База данных — это система, которая умеет одновременно работать с миллионами записей, обеспечивает безопасность, контроль доступа и целостность данных. Excel подходит для личных задач и небольших проектов. База данных нужна, когда данные используются множеством людей или программ одновременно.

    > Excel — это блокнот. База данных — это целый архив с системой каталогизации, охраной и правилами доступа.

    Что запомнить из этой главы

  • Данные — это зафиксированные сведения; информация — данные, получившие смысл и контекст
  • База данных — организованное хранилище, которое позволяет быстро находить, добавлять, изменять и удалять данные
  • Два главных типа баз данных: реляционные (табличные, с языками типа SQL) и нереляционные (документные, графовые и другие), и выбор между ними зависит от задачи
  • 2. Реляционные базы данных: как устроены таблицы, строки и столбцы

    Реляционные базы данных: как устроены таблицы, строки и столбцы

    Когда ты заходишь в интернет-магазин и ищешь телефон по фильтрам — цена, диагональ экрана, бренд — за доли секунды система находит сотни подходящих товаров. Как это возможно? Потому что данные в магазине организованы в реляционной базе данных — строгой, предсказуемой структуре, где каждый элемент лежит на своём месте. Разберёмся, как эта структура устроена изнутри.

    Таблица — главный строительный блок

    В реляционной базе данных вся информация хранится в таблицах. Но это не таблица в привычном смысле — не Excel-файл с произвольным содержимым. Каждая таблица в реляционной базе описывает один тип объектов и имеет строгую структуру.

    Представь шкаф с папками в школьной канцелярии. В одной папке — личные дела учеников. В другой — ведомости по предметам. В третьей — медицинские справки. Каждая папка — это отдельная таблица. Внутри папки все документы одного типа и имеют одинаковые поля.

    Вот как выглядит таблица учеников:

    | id | Имя | Фамилия | Класс | Дата рождения | |---|---|---|---|---| | 1 | Анна | Петрова | 9А | 2009-03-15 | | 2 | Максим | Иванов | 10Б | 2008-07-22 | | 3 | София | Козлова | 9А | 2009-11-01 |

    Эта таблица содержит три строки (записи) и пять столбцов (поля).

    Строки и столбцы: что за чем

    Строка (также называется записью или record) — это один конкретный объект в таблице. В таблице учеников одна строка — это один ученик. Если в школе 800 учеников, в таблице будет 800 строк.

    Столбец (также называется полем или field) — это характеристика объекта. В таблице учеников столбец «Имя» хранит имена, столбец «Класс» — номера классов. Каждый столбец имеет имя и тип данных — ограничение на то, что в нём можно хранить.

    Типы данных — это как правила для ячеек:

  • INTEGER (целое число) — для возраста, количества, года
  • TEXT или VARCHAR (текст) — для имён, адресов, описаний
  • DATE (дата) — для дат рождения, сроков
  • REAL или FLOAT (число с плавающей точкой) — для цен, веса, температуры
  • BOOLEAN (логическое) — для ответов да/нет
  • > Тип данных — это контракт: ты обещаешь базе данных, что в этом столбце всегда будет определённый вид информации.

    Зачем это нужно? Представь, что в столбец «Дата рождения» случайно попал текст «красивый день». База данных с типом DATE отклонит эту запись — потому что «красивый день» — это не дата. Типы данных защищают от ошибок ещё на этапе ввода.

    Структура таблицы: схема

    Схема (schema) — это описание структуры таблицы: какие столбцы есть, какого они типа, какие ограничения на них наложены. Схема — это как чертёж здания: сама по себе она не содержит данных, но определяет, как данные будут организованы.

    Вот схема таблицы учеников:

    | Столбец | Тип данных | Ограничение | |---|---|---| | id | INTEGER | Первичный ключ, уникальный | | Имя | TEXT | Не может быть пустым | | Фамилия | TEXT | Не может быть пустым | | Класс | TEXT | Не может быть пустым | | Дата рождения | DATE | Может быть пустым |

    Ограничения (constraints) — это правила, которые нельзя нарушать. Например, ограничение «не может быть пустым» (NOT NULL) означает, что при создании ученика обязательно нужно указать имя и фамилию. А вот дату рождения можно не указать — ограничение позволяет оставить поле пустым.

    Главное правило: атомарность данных

    Есть фундаментальный принцип реляционных баз данных: каждая ячейка таблицы должна содержать только одно значение. Это называется атомарностью данных (от греческого atomos — неделимый).

    Плохо: столбец «Телефоны» со значением «+7-900-123-45-67, +7-900-765-43-21». Это два номера в одной ячейке — нарушение атомарности.

    Хорошо: отдельная таблица «Телефоны», где каждый номер — отдельная строка, связанная с конкретным учеником.

    Почему это важно? Представь, что нужно найти всех учеников, у которых есть номер, начинающийся на +7-900. Если телефоны перечислены через запятую в одной ячейке, поиск превращается в головную боль. Если каждый номер — отдельная строка, поиск тривиален.

    Работа с таблицей: основные операции

    С таблицами в реляционной базе данных выполняют четыре базовые операции, которые часто обозначают аббревиатурой CRUD:

  • Create (создать) — добавить новую строку в таблицу
  • Read (прочитать) — найти и извлечь данные из таблицы
  • Update (обновить) — изменить данные в существующей строке
  • Delete (удалить) — удалить строку из таблицы
  • Эти четыре операции покрывают практически всё, что можно делать с данными. Добавил нового ученика — это Create. Посмотрел список всех учеников 9А класса — это Read. Исправил оценку — Update. Удалил запись об ушедшем ученике — Delete.

    Микропример: ты ведёшь таблицу своих занятий спортом. Сегодня добавил запись «Бег, 5 км, 25 минут» — это Create. Потом посмотрел, сколько раз бегал за месяц — Read. Заметил ошибку: было не 5 км, а 6 — исправил (Update). Удалил дубликат записи — Delete.

    Почему именно таблицы

    Может возникнуть вопрос: почему реляционные базы данных используют именно таблицы, а не списки, деревья или что-то ещё? Потому что табличная структура решает три задачи одновременно:

  • Простота — таблицу понимает любой человек без технического образования
  • Строгость — каждый столбец имеет тип и ограничения, что исключает хаос
  • Связность — таблицы можно связывать между собой через ключи (об этом — в следующей главе)
  • Эдгар Кодд, сотрудник компании IBM, предложил реляционную модель данных в 1970 году. Его идея была простой: хранить данные в таблицах и связывать их математическими отношениями. Эта идея оказалась настолько удачной, что спустя более 50 лет реляционные базы данных по-прежнему доминируют в мире.

    Практический пример: проектируем таблицу

    Допустим, ты создаёшь базу данных для школьной библиотеки. Какие таблицы понадобятся? Начнём с одной — таблицы книг.

    Сначала определим поля:

  • id — уникальный номер книги (INTEGER, первичный ключ)
  • Название — название книги (TEXT, обязательно)
  • Автор — фамилия автора (TEXT, обязательно)
  • Год издания — год выхода книги (INTEGER)
  • Жанр — жанр книги (TEXT)
  • В наличии — есть ли книга на полке (BOOLEAN, по умолчанию true)
  • Обрати внимание: мы не стали добавлять в эту таблицу поле «Кто взял книгу» и «Дата возврата». Почему? Потому что это информация о другом типе объектов — не о книгах, а о выдачах. Она belongs в отдельной таблице. Это и есть принцип: одна таблица — один тип объектов.

    Типичное заблуждение

    Часто думают, что чем больше столбцов в таблице, тем лучше — «запишем всё в одну таблицу, и не придётся ничего искать». На практике это ведёт к хаосу. Представь таблицу, где у ученика записаны: имя, фамилия, класс, оценка по математике, оценка по физике, оценка по химии, телефон мамы, телефон папы, адрес, аллергии, любимое блюдо в столовой. Такая таблица неудобна: при добавлении нового предмета нужно добавлять столбец, при смене телефона — искать конкретную ячейку. Правильный подход — разбить данные на несколько связанных таблиц.

    Что запомнить из этой главы

  • Таблица — главный строительный блок реляционной базы данных; каждая таблица описывает один тип объектов
  • Строка — один конкретный объект, столбец — одна характеристика; каждый столбец имеет тип данных и может иметь ограничения
  • Атомарность: каждая ячейка содержит только одно значение; если данных много — создавай отдельную таблицу
  • Основные операции с данными — CRUD: создание, чтение, обновление, удаление
  • 3. Ключи и связи между таблицами: как таблицы узнают друг друга

    Ключи и связи между таблицами: как таблицы узнают друг друга

    Представь, что ты администратор школьной базы данных. У тебя есть таблица учеников и таблица оценок. В таблице оценок написано: «Ученик №3 получил 5 по математике 10 марта». Но кто такой ученик №3? Без связи между таблицами это число — просто число. А со связью — это Анна Петрова из 9А. Именно ключи и связи превращают набор отдельных таблиц в единую, логичную систему.

    Первичный ключ: уникальный паспорт записи

    Первичный ключ (primary key) — это столбец (или комбинация столбцов), значение которого уникально для каждой строки таблицы. Он однозначно идентифицирует запись — как паспортный номер идентифицирует человека.

    Вернёмся к таблице учеников:

    | id | Имя | Фамилия | Класс | |---|---|---|---| | 1 | Анна | Петрова | 9А | | 2 | Максим | Иванов | 10Б | | 3 | София | Козлова | 9А |

    Столбец id — это первичный ключ. Каждое значение уникально: 1, 2, 3. Даже если в школе две Анны Петровы, их id будут разными.

    Почему нельзя использовать имя как ключ? Потому что имена повторяются. А первичный ключ обязан быть уникальным — это его главная характеристика. Также первичный ключ не может быть пустым (NOT NULL): у каждой записи всегда есть идентификатор.

    На практике первичные ключи почти всегда представляют собой автоматически генерируемые числа: 1, 2, 3, 4... База данных сама назначает следующий номер при добавлении новой строки. Это надёжнее, чем использовать, например, фамилию или номер телефона, которые могут измениться.

    Внешний ключ: мост между таблицами

    Внешний ключ (foreign key) — это столбец в одной таблице, который ссылается на первичный ключ другой таблицы. Он создаёт связь между двумя таблицами.

    Разберём на примере. Есть таблица учеников (мы уже её видели) и таблица оценок:

    Таблица «Ученики»:

    | id | Имя | Фамилия | Класс | |---|---|---|---| | 1 | Анна | Петрова | 9А | | 2 | Максим | Иванов | 10Б |

    Таблица «Оценки»:

    | id | Ученик_id | Предмет | Оценка | Дата | |---|---|---|---|---| | 1 | 1 | Математика | 5 | 2024-03-10 | | 2 | 1 | Физика | 4 | 2024-03-11 | | 3 | 2 | Математика | 3 | 2024-03-10 |

    Столбец Ученик_id в таблице «Оценки» — это внешний ключ. Он ссылается на столбец id в таблице «Ученики». Значение 1 в строке оценки означает «эта оценка принадлежит Анне Петровой», потому что в таблице учеников id=1 — это Анна.

    > Первичный ключ — это адрес дома. Внешний ключ — это записная книжка, где рядом с именем друга написан адрес его дома.

    Без внешнего ключа пришлось бы дублировать имя и фамилию в таблице оценок для каждой записи. А это — нарушение принципа атомарности и источник ошибок: если Анна Петрова сменила фамилию, пришлось бы исправлять её в каждой строке оценок. С внешним ключом достаточно обновить одну строку в таблице учеников.

    Типы связей между таблицами

    Связи между таблицами бывают трёх типов, и понимание каждого важно для правильного проектирования базы данных.

    Один к одному (1:1)

    Каждой записи в первой таблице соответствует ровно одна запись во второй. Например, у каждого ученика ровно одна медицинская карта. Таблица «Ученики» и таблица «Медицинские карты» связаны связью «один к одному».

    На практике такой тип связи встречается реже всего — чаще данные с такой связью объединяют в одну таблицу.

    Один ко многим (1:N)

    Одной записи в первой таблице соответствует много записей во второй. Это самый распространённый тип связи. Один ученик — много оценок. Один автор — много книг. Один класс — много учеников.

    Именно связь «один ко многим» мы рассмотрели в примере с учениками и оценками: один ученик (id=1) имеет несколько оценок (строки с Ученик_id=1).

    Многие ко многим (N:M)

    Многим записям первой таблицы соответствует много записей второй. Например, ученик может записаться на несколько кружков, и в каждом кружке много учеников.

    Как хранить такую связь? Напрямую — никак. Для этого создаётся промежуточная таблица (также называется таблицей связей или junction table).

    Таблица «Ученики»:

    | id | Имя | |---|---| | 1 | Анна | | 2 | Максим |

    Таблица «Кружки»:

    | id | Название | |---|---| | 1 | Робототехника | | 2 | Рисование | | 3 | Шахматы |

    Таблица «Ученики_Кружки» (промежуточная):

    | Ученик_id | Кружок_id | |---|---| | 1 | 1 | | 1 | 3 | | 2 | 2 | | 2 | 3 |

    Из этой таблицы видно: Анна (id=1) ходит на робототехнику (id=1) и шахматы (id=3), а Максим (id=2) — на рисование (id=2) и шахматы (id=3).

    Целостность данных: зачем нужны ограничения

    Внешние ключи не просто связывают таблицы — они защищают данные от ошибок. Это свойство называется ссылочной целостностью (referential integrity).

    Что это значит на практике? База данных не позволит:

  • Добавить оценку с Ученик_id=999, если ученика с id=999 не существует
  • Удалить ученика, у которого есть оценки (пока не удалишь оценки или не настроишь каскадное удаление)
  • Представь, что это правило отключено. Тогда в таблице оценок могут появиться записи, которые ссылаются на несуществующих учеников. Данные станут противоречивыми — как если бы в адресной книге был номер телефона, который никому не принадлежит.

    Нормализация: порядок в таблицах

    Нормализация — это процесс организации таблиц так, чтобы избежать дублирования данных и обеспечить их согласованность. Придумала его Эдгар Кодд — тот самый, кто предложил реляционную модель.

    Разберём на примере. Допустим, ты хранишь данные о книгах в одной таблице:

    | Название | Автор | Страна автора | Жанр | |---|---|---|---| | Мастер и Маргарита | Булгаков | Россия | Роман | | Собачье сердце | Булгаков | Россия | Повесть | | Война и мир | Толстой | Россия | Роман |

    Здесь страна автора повторяется для каждой книги. Если Булгакова написано 10 книг — «Россия» повторится 10 раз. А если выяснится, что Булгаков родился не в России (гипотетически), придётся исправлять все 10 строк.

    Нормализованный вариант — две таблицы:

    Таблица «Авторы»:

    | id | Имя | Страна | |---|---|---| | 1 | Булгаков | Россия | | 2 | Толстой | Россия |

    Таблица «Книги»:

    | id | Название | Автор_id | Жанр | |---|---|---|---| | 1 | Мастер и Маргарита | 1 | Роман | | 2 | Собачье сердце | 1 | Повесть | | 3 | Война и мир | 2 | Роман |

    Теперь страна автора записана один раз. Исправление — в одном месте. Это и есть нормализация: каждый факт хранится в одном месте.

    Что запомнить из этой главы

  • Первичный ключ уникально идентифицирует каждую строку таблицы; внешний ключ ссылается на первичный ключ другой таблицы и создаёт связь между ними
  • Три типа связей: один к одному, один ко многим (самый частый), многие ко многим (через промежуточную таблицу)
  • Нормализация устраняет дублирование: каждый факт хранится в одном месте, а таблицы связаны ключами
  • 4. Введение в язык SQL: как задавать вопросы базе данных

    Введение в язык SQL: как задавать вопросы базе данных

    Представь, что у тебя есть база данных с миллионом книг — все когда-либо изданные в твоей стране. Тебе нужна одна конкретная книга: детектив Агаты Кристи, изданный после 1950 года. Как её найти? Перебирать миллион записей вручную? Конечно нет. Для этого существует SQL — язык, на котором люди «разговаривают» с базами данных.

    Что такое SQL

    SQL (Structured Query Language, структурированный язык запросов) — это специальный язык для работы с реляционными базами данных. С помощью SQL можно создавать таблицы, добавлять данные, искать нужную информацию, изменять и удалять записи.

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

    > SQL — это как заказ в ресторане. Ты говоришь официанту: «Принесите мне салат Цезарь». Тебе не нужно знать, как повар его готовит — ты описал результат, а не процесс.

    SQL используется практически во всех реляционных базах данных: MySQL, PostgreSQL, SQLite, Microsoft SQL Server, Oracle. Синтаксис может немного отличаться, но основные команды одинаковы везде.

    SELECT: как искать данные

    Команда SELECT — это самая часто используемая команда SQL. Она извлекает данные из таблицы. Это как вопрос к базе данных: «Покажи мне...»

    Базовый синтаксис:

    Допустим, у нас есть таблица учеников:

    | id | Имя | Фамилия | Класс | Оценка_средняя | |---|---|---|---|---| | 1 | Анна | Петрова | 9А | 4.7 | | 2 | Максим | Иванов | 10Б | 3.9 | | 3 | София | Козлова | 9А | 4.9 | | 4 | Артём | Сидоров | 10Б | 4.2 |

    Чтобы получить имена и фамилии всех учеников:

    Результат: Анна Петрова, Максим Иванов, София Козлова, Артём Сидоров.

    Чтобы получить все данные из таблицы, используется звёздочка:

    Это вернёт все столбцы и все строки — как если бы ты открыл таблицу целиком.

    WHERE: как фильтровать данные

    Часто нужно получить не все записи, а только подходящие. Для этого служит условие WHERE — оно работает как фильтр.

    Найти всех учеников из 9А класса:

    Результат: Анна Петрова, София Козлова.

    Условия могут быть разными:

  • Класс = '9А' — равно
  • Оценка_средняя > 4.0 — больше (в SQL используется знак >, а не LaTeX)
  • Оценка_средняя >= 4.5 — больше или равно
  • Имя != 'Максим' — не равно
  • Можно комбинировать условия с помощью AND (и) и OR (или):

    Этот запрос вернёт учеников из 10Б, у которых средняя оценка выше 4.0. Результат: Артём Сидоров (4.2). Максим Иванов не подходит — его оценка 3.9.

    ORDER BY: как сортировать результаты

    Данные в базе хранятся без определённого порядка. Чтобы отсортировать результаты запроса, используется ORDER BY:

    Ключевое слово DESC означает сортировку по убыванию (от большего к меньшему). Без него — по умолчанию — сортировка идёт по возрастанию (ASC).

    Результат: София Козлова (4.9), Анна Петрова (4.7), Артём Сидоров (4.2), Максим Иванов (3.9).

    LIMIT: как ограничить количество строк

    Иногда не нужны все результаты — только первые несколько. Например, «покажи тройку лучших учеников». Для этого — LIMIT:

    Результат: София Козлова, Анна Петрова, Артём Сидоров — три ученика с наивысшими оценками.

    Агрегатные функции: как считать и суммировать

    SQL умеет не только искать отдельные записи, но и вычислять что-то по всем записям сразу. Для этого существуют агрегатные функции:

  • COUNT — подсчитывает количество строк
  • SUM — суммирует значения
  • AVG — вычисляет среднее
  • MAX — находит максимальное значение
  • MIN — находит минимальное значение
  • Сколько всего учеников в базе?

    Результат: 4.

    Какая средняя оценка по всем ученикам?

    Результат: 4.425.

    Агрегатные функции часто используются вместе с группировкой GROUP BY — она разбивает данные на группы и применяет функцию к каждой группе отдельно. Средняя оценка по каждому классу:

    Результат: 9А — 4.8, 10Б — 4.05.

    Работающий пример: собираем всё вместе

    Допустим, тебе нужно найти двух лучших учеников из 9А класса и вывести их имена, фамилии и оценки, отсортировав по убыванию.

    Разберём по шагам:

  • FROM Ученики — берём данные из таблицы «Ученики»
  • WHERE Класс = '9А' — оставляем только учеников из 9А (Анна и София)
  • ORDER BY Оценка_средняя DESC — сортируем: сначала с более высокой оценкой (София 4.9, потом Анна 4.7)
  • LIMIT 2 — берём первые две строки
  • SELECT Имя, Фамилия, Оценка_средняя — выводим только нужные столбцы
  • Результат: София Козлова (4.9), Анна Петрова (4.7).

    Обрати внимание на порядок: SQL-запрос читается не сверху вниз, а в логическом порядке: сначала откуда берём данные (FROM), потом фильтруем (WHERE), сортируем (ORDER BY), ограничиваем (LIMIT) и только потом выбираем столбцы (SELECT).

    Типичное заблуждение

    Многие новички думают, что SQL — это сложный язык программирования, требующий математических знаний. На самом деле SQL ближе к обычному английскому языку, чем к программированию. «SELECT имя FROM ученики WHERE класс = '9А'» читается почти как предложение: «Выбери имя из учеников, где класс — 9А». Главная сложность — не синтаксис, а логика: понять, какой запрос написать, чтобы получить нужный результат.

    Что запомнить из этой главы

  • SQL — декларативный язык: ты говоришь, что хочешь получить, а база данных решает, как это сделать
  • SELECT извлекает данные, WHERE фильтрует, ORDER BY сортирует, LIMIT ограничивает количество строк
  • Агрегатные функции (COUNT, SUM, AVG, MAX, MIN) вычисляют что-то по всем строкам; GROUP BY применяет функцию к каждой группе отдельно
  • 5. Работа с данными: добавляем, меняем и удаляем записи через SQL

    Работа с данными: добавляем, меняем и удаляем записи через SQL

    В прошлой главе ты научился искать данные с помощью SELECT. Но база данных — не музей, где экспонаты только рассматриваются. Данные постоянно меняются: появляются новые ученики, обновляются оценки, удаляются устаревшие записи. Для этого в SQL есть три команды, которые вместе с SELECT образуют полный набор операций CRUD: INSERT, UPDATE и DELETE.

    INSERT: добавляем новые записи

    Команда INSERT добавляет новую строку в таблицу. Представь, что в школу пришёл новый ученик — его нужно зарегистрировать в базе.

    Базовый синтаксис:

    Добавим нового ученика в таблицу:

    После выполнения этого запроса в таблице появится новая строка:

    | id | Имя | Фамилия | Класс | Оценка_средняя | |---|---|---|---|---| | 1 | Анна | Петрова | 9А | 4.7 | | 2 | Максим | Иванов | 10Б | 3.9 | | 3 | София | Козлова | 9А | 4.9 | | 4 | Артём | Сидоров | 10Б | 4.2 | | 5 | Дмитрий | Волков | 9А | 4.3 |

    Обрати внимание: столбец id мы не указывали — база данных автоматически назначила значение 5. Это типичное поведение для первичного ключа с автоинкрементом.

    Добавление нескольких строк сразу

    Можно добавить несколько строк одним запросом — просто перечислить наборы значений через запятую:

    Это удобнее, чем писать отдельный INSERT для каждой строки — особенно когда данных много.

    Что произойдёт, если нарушить правила

    Если попытаться вставить запись, которая нарушает ограничения таблицы, база данных отклонит запрос и вернёт ошибку. Например:

    Столбец «Имя» имеет ограничение NOT NULL — он не может быть пустым. Мы не указали имя, поэтому база данных откажется добавлять запись. Это защита от некорректных данных: лучше ошибка сейчас, чем мусор в базе потом.

    UPDATE: изменяем существующие данные

    Команда UPDATE изменяет данные в уже существующих строках. Допустим, Анна Петрова перевелась из 9А в 10А — нужно обновить её запись.

    Базовый синтаксис:

    После выполнения этого запроса строка Анны Петровой изменится:

    | id | Имя | Фамилия | Класс | Оценка_средняя | |---|---|---|---|---| | 1 | Анна | Петрова | 10А | 4.7 |

    Изменение нескольких столбцов одновременно

    Можно обновить сразу несколько полей, перечислив их через запятую:

    Критически важное правило: всегда используй WHERE

    Самая опасная ошибка новичков — забыть условие WHERE. Без него UPDATE изменит все строки таблицы.

    Этот запрос переведёт всех учеников в 9А — потому что нет условия, которое ограничило бы действие. Такая ошибка может уничтожить данные в реальной базе.

    > Представь, что ты пользуешься ластиком. С WHERE ты стираешь одну букву. Без WHERE — всю страницу.

    Поэтому правило номер один при работе с UPDATE: всегда проверяй, что условие WHERE написано и написано правильно. Перед выполнением UPDATE в реальной базе данных сначала выполни SELECT с тем же условием — чтобы убедиться, что затронуты только нужные строки.

    DELETE: удаляем записи

    Команда DELETE удаляет строки из таблицы. Допустим, Максим Иванов переехал в другой город — его нужно удалить из базы.

    Базовый синтаксис:

    После выполнения строка с Максимом Ивановым исчезнет из таблицы. Остальные записи останутся нетронутыми.

    Опасность DELETE без WHERE

    Та же ловушка, что и у UPDATE: если забыть WHERE, удалятся все строки таблицы.

    Этот запрос очистит таблицу целиком. Данные будут потеряны (если нет резервной копии). Поэтому — снова правило: перед DELETE всегда проверяй условие с SELECT.

    Разница между DELETE и TRUNCATE

    Если нужно удалить все строки таблицы осознанно, существует команда TRUNCATE:

    Она делает то же, что DELETE без WHERE, но работает быстрее, потому что не проверяет каждую строку по отдельности. Однако TRUNCATE нельзя отменить в некоторых базах данных, и он сбрасывает счётчик автоинкремента. Используй его только когда точно уверен, что все данные нужно удалить.

    Работающий пример: полный цикл CRUD

    Давай смоделируем реальный сценарий. Ты — администратор базы данных школьной библиотеки. Вот твоя таблица книг:

    | id | Название | Автор | Год | В наличии | |---|---|---|---|---| | 1 | Мастер и Маргарита | Булгаков | 1967 | true | | 2 | 1984 | Оруэлл | 1949 | true | | 3 | Преступление и наказание | Достоевский | 1866 | false |

    Шаг 1: Добавить новую книгу (CREATE)

    Шаг 2: Прочитать — найти все книги, которых нет в наличии (READ)

    Результат: Преступление и наказание, Достоевский.

    Шаг 3: Обновить — книгу вернули, теперь она в наличии (UPDATE)

    Шаг 4: Удалить — книга списана из библиотеки (DELETE)

    После всех операций таблица выглядит так:

    | id | Название | Автор | Год | В наличии | |---|---|---|---|---| | 1 | Мастер и Маргарита | Булгаков | 1967 | true | | 3 | Преступление и наказание | Достоевский | 1866 | true | | 4 | Война и мир | Толстой | 1869 | true |

    Книга Оруэлла удалена, книга Достоевского теперь в наличии, добавлена книга Толстого.

    Транзакции: безопасность изменений

    В реальных системах несколько операций часто выполняются как единое целое. Например, при переводе денег с одного счёта на другой нужно одновременно уменьшить сумму на первом счёте и увеличить на втором. Если что-то пойдёт не так между этими двумя операциями — деньги исчезнут.

    Транзакция — это группа операций, которая выполняется либо целиком, либо не выполняется вовсе. В SQL транзакция оборачивается командами BEGIN, COMMIT и ROLLBACK:

    Если между BEGIN и COMMIT произойдёт ошибка, можно выполнить ROLLBACK — и все изменения откатятся к состоянию на момент BEGIN. Ничего не пропадёт.

    > Транзакция — это как правило «все за одного»: либо все операции выполнены, либо ни одной.

    Типичное заблуждение

    Часто думают, что удалённые через DELETE данные можно легко восстановить. В большинстве случаев — нет. DELETE удаляет строку безвозвратно (если нет резервной копии или журнала транзакций). Поэтому в реальных системах данные часто не удаляют физически, а помечают как удалённые — например, добавляют столбец «Архивный» со значением true. Это называется мягким удалением (soft delete). Так данные остаются в базе, но перестают отображаться в обычных запросах.

    Что запомнить из этой главы

  • INSERT добавляет новые строки, UPDATE изменяет существующие, DELETE удаляет строки — вместе с SELECT это полный набор CRUD-операций
  • Главное правило безопасности: всегда используй WHERE в UPDATE и DELETE, иначе затронуты будут все строки таблицы
  • Транзакция объединяет несколько операций в единое целое: либо все выполнены, либо ни одной — это защищает данные от частичных ошибок