Система управления базами данных (СУБД) — это программа, через которую приложения и люди создают базу данных, записывают в неё данные, ищут их и меняют. Сама база — это файлы на диске. СУБД решает, как эти файлы устроены, кто к ним допущен и что делать, если посреди записи отключился сервер.
Примеры СУБД: PostgreSQL, MySQL, Microsoft SQL Server, Oracle, SQLite, MongoDB. С большинством из них говорят на языке запросов SQL, его основы я разбирал в статье о языке SQL и зачем его учить. Ниже: чем СУБД отличается от базы данных, какие у неё функции и объекты, какие бывают виды и как всё это потрогать руками за пять минут.
Что такое СУБД простыми словами

Термин закреплён ещё в советском ГОСТ 20886-85 «Организация данных в системах обработки данных. Термины и определения». Он до сих пор лучше многих учебников разводит два понятия, которые путают чаще всего.
«Совокупность программ и языковых средств, предназначенных для управления данными в базе данных, ведения базы данных и обеспечения взаимодействия ее с прикладными программами» — так ГОСТ 20886-85 определяет систему управления базами данных (термин 46).
База данных в том же стандарте (термин 6) — совокупность данных, организованных по общим правилам описания и хранения и независимая от прикладных программ. Последние слова важнее всего: данные живут отдельно от сайта или бухгалтерской программы, а доступ к ним идёт только через СУБД.
| База данных | СУБД | |
|---|---|---|
| Что это | Сами данные и их структура | Программа, которая этими данными управляет |
| Где лежит | Файлы на диске сервера или телефона | Процесс на сервере или библиотека внутри приложения |
| Пример | Таблицы clients и orders интернет-магазина | PostgreSQL, который их хранит и отдаёт |
| Можно ли открыть без другой части | Формально да, но без СУБД это нечитаемые байты | Да, СУБД без баз просто ждёт команд |
Одна СУБД обычно обслуживает сразу несколько баз. На одном сервере PostgreSQL может жить база магазина, база блога и тестовая копия. Как такую базу завести командой, показано в инструкции «Как создать базу данных в SQL».
Зачем нужна СУБД, если есть Excel и обычные файлы
Пока данных мало и с ними работает один человек, таблица Excel справляется. Проблемы начинаются, когда растёт хотя бы одно из трёх: объём, число пользователей или цена ошибки.
- Двое правят одновременно. Менеджер и бухгалтер открыли один файл, оба сохранили. Чьи правки остались? В СУБД каждый запрос встаёт в очередь по правилам блокировок, и ничего не теряется молча.
- Сбой посреди записи. Деньги списали с одного счёта, а до второго не дошли, потому что пропало питание. СУБД ведёт журнал изменений и после перезапуска откатывает недописанную операцию целиком.
- Поиск в миллионах строк. Файл приходится читать от начала до конца. СУБД строит индексы и находит нужную строку, не перебирая остальные.
- Разные права. Оператору можно смотреть заказы, но не зарплаты. В СУБД права выдаются на уровне таблиц, а иногда и отдельных строк.
Отсюда главный ответ на вопрос «для чего нужна СУБД»: чтобы данные оставались целыми и согласованными, когда с ними одновременно работают сотни программ и людей.
Канал основателя Checkroi Вани Буявца3 800 человек читают мой Телеграм-канал про нейросетиСобрал промпты для Claude Code и ChatGPT, разборы ИИ-инструментов и лайфхаки по продвижению бизнеса в одном местеПрисоединитьсяОсновные функции СУБД
Набор функций у PostgreSQL и у SQLite разный по масштабу, но обязательная часть одна и та же. Её спрашивают и в школьной информатике, и на собеседовании на младшего разработчика.
- Хранение данных во внешней памяти. СУБД сама раскладывает таблицы по файлам и страницам на диске. Пользователь думает строками и столбцами, а не байтами.
- Работа с оперативной памятью. Часто нужные страницы хранятся в буфере, чтобы не читать их с диска при каждом запросе.
- Язык определения и обработки данных. Через SQL создают таблицы и меняют записи. Команды делятся на группы, подробности в статье про DDL, DML, DCL и TCL.
- Транзакции и журнал. Несколько изменений выполняются как одно: либо все, либо ни одного. Журнал хранит, что именно менялось, на случай сбоя.
- Целостность. Ограничения не дают записать заказ несуществующему клиенту или отрицательный остаток на складе.
- Безопасность и права доступа. Пользователи, роли, пароли, кто что может читать и менять.
- Резервное копирование и восстановление. Встроенные утилиты снимают копию базы и поднимают её на другом сервере.
Транзакции и ACID
Четвёртый пункт стоит разобрать отдельно: именно он отличает СУБД от папки с файлами. В документации PostgreSQL суть транзакции сформулирована так: она объединяет несколько шагов в одну операцию по принципу «всё или ничего» (раздел Transactions, версия документации 18). Если на полпути передумать и выполнить ROLLBACK, все сделанные изменения отменяются.
Требования к надёжной транзакции обычно описывают четырьмя буквами ACID:
| Буква | Свойство | Что значит на практике |
|---|---|---|
| A | Atomicity, атомарность | Перевод денег проходит целиком или не проходит совсем |
| C | Consistency, согласованность | После транзакции все ограничения базы соблюдены |
| I | Isolation, изоляция | Параллельные транзакции не видят недописанных изменений друг друга |
| D | Durability, долговечность | Подтверждённое изменение переживёт перезагрузку сервера |
Реляционные СУБД поддерживают ACID полностью. Многие NoSQL-системы ради скорости ослабляют часть гарантий, и это нужно знать заранее, а не узнавать по пропавшим заказам.
Как устроена СУБД изнутри

Когда приложение отправляет запрос SELECT * FROM orders WHERE client_id = 1, внутри СУБД он проходит несколько компонентов по очереди:
- Парсер проверяет синтаксис и то, что таблица и столбец существуют. Сведения о них он берёт из каталога метаданных, по сути базы данных о самой базе.
- Оптимизатор выбирает план: прочитать таблицу целиком или пойти по индексу, в каком порядке соединять таблицы.
- Исполнитель выполняет план и собирает результат.
- Подсистема хранения достаёт нужные страницы из буфера в памяти или с диска.
- Менеджер блокировок и журнал следят, чтобы параллельные запросы не мешали друг другу, и записывают изменения до того, как они попадут в основные файлы.
Пользователь видит только первый и последний шаг: отправил запрос, получил строки. Но когда запрос «вдруг стал медленным», разбираться приходится как раз с планом оптимизатора. Пример такого разбора будет ниже, в практической части.
Объекты базы данных
Объекты базы данных — всё, что СУБД создаёт и хранит по команде пользователя. Основной объект — таблица, остальные строятся вокруг неё.
| Объект | Что это | Пример |
|---|---|---|
| Таблица | Набор строк одного вида | clients — клиенты магазина |
| Столбец (поле) | Одно свойство с типом данных | balance INTEGER |
| Строка (запись) | Один объект реального мира | Клиент Анна с балансом 5000 |
| Первичный ключ | Столбец, по которому строку можно найти однозначно | id |
| Внешний ключ | Ссылка на строку другой таблицы | orders.client_id → clients.id |
| Ограничение | Правило, которое СУБД не даст нарушить | CHECK (balance >= 0) |
| Индекс | Отдельная структура для быстрого поиска | Индекс по client_id |
| Представление (view) | Сохранённый запрос, который выглядит как таблица | Сумма покупок по клиентам |
| Триггер | Код, который срабатывает при вставке, изменении или удалении | Записать в журнал, кто поменял цену |
| Хранимая процедура или функция | Программа внутри СУБД | Пересчёт скидки по истории заказов |
| Схема | Папка, в которой лежат объекты | public, sales, archive |
| Пользователь и роль | Кто подключается и что ему разрешено | Роль «только чтение» для аналитика |
Какие типы бывают у столбцов и чем INTEGER отличается от NUMERIC, разобрано в таблице типов данных SQL. А как разложить данные по таблицам, чтобы одно и то же не хранилось в пяти местах, объясняет статья о нормализации данных.
Проверьте сами: СУБД за пять минут на SQLite
Определения запоминаются хуже, чем то, что сделал руками. Для опыта не нужен сервер: SQLite встроена в Python. Её разработчики описывают SQLite как встраиваемый, бессерверный SQL-движок с транзакциями, а полную базу с таблицами, индексами, триггерами и представлениями хранят в одном файле на диске (страница About SQLite).
Все три примера ниже я запускал подряд на Python 3.14 с SQLite 3.54, вывод вставлен из терминала.
Шаг 1: таблицы, ключи и первый запрос
import sqlite3
con = sqlite3.connect("shop.db")
con.execute("PRAGMA foreign_keys = ON")
con.executescript("""
DROP TABLE IF EXISTS orders;
DROP TABLE IF EXISTS clients;
CREATE TABLE clients (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL,
balance INTEGER NOT NULL CHECK (balance >= 0)
);
CREATE TABLE orders (
id INTEGER PRIMARY KEY,
client_id INTEGER NOT NULL REFERENCES clients(id),
total INTEGER NOT NULL
);
INSERT INTO clients (name, balance) VALUES ('Анна', 5000), ('Борис', 1200);
INSERT INTO orders (client_id, total) VALUES (1, 3200), (1, 900), (2, 1500);
""")
con.commit()
rows = con.execute("""
SELECT c.name, COUNT(o.id), SUM(o.total)
FROM clients c JOIN orders o ON o.client_id = c.id
GROUP BY c.name ORDER BY c.name
""").fetchall()
print(rows)
[('Анна', 2, 4100), ('Борис', 1, 1500)]
Рядом с файлом скрипта появился shop.db. Это и есть база данных, а SQLite в этом примере сыграла роль СУБД. Запрос соединил две таблицы, подробнее о соединениях — в статье про JOIN в SQL.
Шаг 2: целостность и откат транзакции
import sqlite3
con = sqlite3.connect("shop.db")
con.execute("PRAGMA foreign_keys = ON")
# 1. Ограничение: баланс не может уйти в минус
try:
con.execute("UPDATE clients SET balance = balance - 9000 WHERE id = 2")
except sqlite3.IntegrityError as e:
print("CHECK:", e)
# 2. Внешний ключ: заказ несуществующему клиенту
try:
con.execute("INSERT INTO orders (client_id, total) VALUES (99, 500)")
except sqlite3.IntegrityError as e:
print("FK:", e)
# 3. Транзакция: перевод 1000 от Анны Борису, второй шаг падает
try:
with con:
con.execute("UPDATE clients SET balance = balance - 1000 WHERE id = 1")
con.execute("UPDATE clients SET balance = balance + 1000 WHERE id = 3")
if con.execute("SELECT changes()").fetchone()[0] == 0:
raise ValueError("получатель не найден")
except ValueError as e:
print("ROLLBACK:", e)
print(con.execute("SELECT name, balance FROM clients").fetchall())
CHECK: CHECK constraint failed: balance >= 0
FK: FOREIGN KEY constraint failed
ROLLBACK: получатель не найден
[('Анна', 5000), ('Борис', 1200)]
Три функции СУБД в одном выводе. Ограничение CHECK не пустило минус на счёт. Внешний ключ не дал создать заказ клиенту с id 99. А в третьем блоке ошибка в id получателя откатила и уже выполненное списание: у Анны по-прежнему 5000.
Важная деталь SQLite: проверка внешних ключей в ней по умолчанию выключена ради обратной совместимости, и включать её нужно на каждом подключении (документация SQLite о внешних ключах). Без строки PRAGMA foreign_keys = ON заказ клиенту 99 записался бы без ошибки.
Шаг 3: индекс, представление и каталог
import sqlite3
con = sqlite3.connect("shop.db")
q = "SELECT * FROM orders WHERE client_id = 1"
print(con.execute("EXPLAIN QUERY PLAN " + q).fetchall())
con.execute("CREATE INDEX IF NOT EXISTS idx_orders_client ON orders(client_id)")
print(con.execute("EXPLAIN QUERY PLAN " + q).fetchall())
con.execute("""CREATE VIEW IF NOT EXISTS client_totals AS
SELECT client_id, SUM(total) AS spent FROM orders GROUP BY client_id""")
print(con.execute("SELECT * FROM client_totals").fetchall())
print(con.execute(
"SELECT type, name FROM sqlite_master WHERE name NOT LIKE 'sqlite_%' ORDER BY type, name"
).fetchall())
[(2, 0, 216, 'SCAN orders')]
[(3, 0, 62, 'SEARCH orders USING INDEX idx_orders_client (client_id=?)')]
[(1, 4100), (2, 1500)]
[('index', 'idx_orders_client'), ('table', 'clients'), ('table', 'orders'), ('view', 'client_totals')]
До индекса оптимизатор читал таблицу целиком (SCAN), после — пошёл по индексу (SEARCH … USING INDEX). На трёх строках разницы не заметно, на трёх миллионах это секунды против миллисекунд. Последняя строка вывода — каталог метаданных: СУБД сама помнит, какие объекты в базе есть.
Те же опыты можно повторить мышью: к SQLite, PostgreSQL и MySQL удобно подключаться через универсальный клиент, инструкция — «Как подключиться к базе данных в DBeaver». Для PostgreSQL есть свой графический клиент, в нём можно создать таблицу в pgAdmin 4 без единой строки SQL.
Виды СУБД
Классификаций несколько, и они не исключают друг друга. PostgreSQL одновременно реляционная, клиент-серверная и открытая.
По модели данных
Главная ось. Она определяет, как данные лежат и какими запросами их достают.
| Вид | Как хранит данные | Примеры | Когда подходит |
|---|---|---|---|
| Реляционные | Таблицы со связями через ключи, язык SQL | PostgreSQL, MySQL, Oracle, SQL Server, SQLite | Учёт, заказы, деньги, почти любое приложение |
| Документные | Документы в формате, похожем на JSON | MongoDB, Couchbase | Каталоги с разной структурой карточек, прототипы |
| Ключ-значение | Пары «ключ → значение» в памяти | Redis, Memcached | Кэш, сессии, счётчики |
| Колоночные | Данные лежат по столбцам, а не по строкам | ClickHouse, Vertica | Аналитика по миллиардам событий |
| Графовые | Узлы и связи между ними | Neo4j | Социальные связи, рекомендации, антифрод |
| Временных рядов | Значения с меткой времени | InfluxDB, TimescaleDB | Метрики серверов, датчики |
| Векторные | Числовые векторы для поиска похожих | Milvus, Qdrant, pgvector в PostgreSQL | Поиск по смыслу, работа с нейросетями |
В ГОСТ 20886-85 кроме реляционной базы названы ещё иерархическая, сетевая и распределённая. Иерархические и сетевые модели появились раньше реляционной, в новых проектах они почти не встречаются.
Всё, что не реляционное, обычно объединяют словом NoSQL. В нём нет единого языка запросов: у MongoDB свой синтаксис, у Redis — набор команд. Поэтому навыки SQL на них не переносятся напрямую, и для MongoDB в каталоге есть отдельные курсы по MongoDB.
По архитектуре
- Встраиваемые. СУБД работает как библиотека внутри приложения, отдельного сервера нет. Пример — SQLite в смартфонах и браузерах.
- Клиент-серверные. СУБД — отдельный процесс, приложения подключаются к нему по сети. Так работают PostgreSQL, MySQL, Oracle.
- Распределённые. Одна логическая база разложена по нескольким серверам, чтобы пережить отказ любого из них и выдержать нагрузку.
- Облачные. СУБД разворачивает и обслуживает провайдер, клиент получает адрес для подключения.
По лицензии
Открытые СУБД (PostgreSQL, SQLite, MySQL Community) можно ставить бесплатно. Коммерческие (Oracle, Microsoft SQL Server, российские корпоративные сборки) продаются с поддержкой и дополнительными функциями.
Новичку проще начать с PostgreSQL: она бесплатна и стоит в первой четвёрке рейтинга популярности ниже. Программы, где её разбирают с нуля, собраны в подборке курсов по PostgreSQL.
Популярные СУБД и российские решения
Популярность СУБД каждый месяц считает сайт DB-Engines: по описанию методики он учитывает упоминания на сайтах, частоту поиска, вопросы на Stack Overflow, вакансии и профили в LinkedIn. В его рейтинге за ноябрь 2026 года 442 системы, первая пятёрка выглядит так (из России сайт DB-Engines открывается нестабильно, поэтому цифры привожу полностью):
- Oracle — 1096,15 балла;
- MySQL — 823,23;
- Microsoft SQL Server — 693,53;
- PostgreSQL — 689,69;
- MongoDB — 366,14.
Четыре из пяти — реляционные. PostgreSQL за год прибавил 38,32 балла, а у трёх лидеров баллы снизились: Oracle потерял 143,63, MySQL 42,59, SQL Server 25,34.
По числу установок рейтинг выглядел бы иначе. Разработчики SQLite оценивают, что в активном использовании больше триллиона её баз, потому что она есть в каждом смартфоне на Android и iOS (Most Widely Deployed).
Двое из первой тройки рейтинга в 2022 году перестали работать с новыми клиентами в России. Oracle, по её годовому отчёту за 2022 финансовый год, свернула работу в стране в марте 2022 года. Microsoft тогда же приостановила все новые продажи продуктов и сервисов в России.
Для проектов, где требуется российское ПО, есть отечественные сборки. Три известных построены на открытом коде:
- Postgres Pro Enterprise — на ядре PostgreSQL, на сайте разработчика указан номер 104 в Едином реестре российского ПО;
- Tantor — тоже на основе PostgreSQL;
- РЕД База Данных — на основе открытой СУБД Firebird.
Для новичка из этого следует простой вывод: навыки PostgreSQL переносятся на две из трёх российских СУБД почти без переучивания.
Как выбрать СУБД под задачу
Универсального ответа нет, но для типовых случаев выбор почти очевиден:
| Задача | С чего начать | Почему |
|---|---|---|
| Учебные запросы, первые шаги в SQL | SQLite или PostgreSQL | SQLite не требует установки, PostgreSQL ближе к работе |
| Веб-приложение, интернет-магазин | PostgreSQL или MySQL | Транзакции, связи, большое сообщество |
| Мобильное приложение, хранение на устройстве | SQLite | Одна библиотека, база в одном файле |
| Кэш и сессии | Redis | Данные хранятся в оперативной памяти, а не на диске |
| Отчёты по миллиардам строк | ClickHouse | Колоночное хранение быстрее считает агрегаты |
| Заказчик требует российское ПО | Сборки из реестра российского ПО | Это условие самого заказчика |
Совет из практики: если сомневаетесь, берите реляционную СУБД. Перейти с PostgreSQL на что-то специализированное, когда появится реальная нагрузка, проще, чем потом собирать связи между документами MongoDB руками.
Частые ошибки новичков при работе с СУБД

- Путать базу данных и СУБД. «Установил базу MySQL» на деле значит «установил СУБД MySQL», а база появится после
CREATE DATABASE. На собеседовании эту разницу спрашивают первой. - Работать без транзакций. Симптом: после ошибки в середине скрипта половина данных изменилась, половина нет. Решение: связанные изменения обернуть в
BEGIN … COMMIT, как в шаге 2. - Не ставить индексы или ставить их на всё. Без индекса запрос по фильтру читает всю таблицу. С индексом на каждом столбце медленнее идёт запись: каждый индекс надо обновить. Сначала смотрите план запроса через
EXPLAIN, потом решайте. - Удалять данные без резервной копии.
DELETEбезWHEREочищает всю таблицу. ЧемDELETEотличается отTRUNCATEи как не потерять лишнее, разобрано в статье про TRUNCATE и DELETE. - Выбирать NoSQL «потому что модно». Для заказов и денег нужны связи и транзакции, и реляционная СУБД даёт их из коробки.
Где научиться работать с СУБД
Чтобы понять, что такое СУБД, хватит этой статьи и часа экспериментов с SQLite. Работать с ней профессионально — другая задача: проектирование схемы, оптимизация запросов, резервное копирование, права. Этим занимаются администраторы баз данных и SQL-разработчики, а основы нужны любому аналитику и бэкенд-разработчику.
Ниже пять программ из раздела курсов по базам данных нашего каталога: от основ SQL до администрирования.
| Курс | Школа | Стоимость со скидкой | В рассрочку | Длительность | Обзор курса от Checkroi |
|---|---|---|---|---|---|
| Базы данных для разработчиков Перейти на сайт курса | 24 908 ₽ | 4151 ₽/мес. | 4 месяца | Обзор курса | |
| Базы данных. Интерактивный курс Перейти на сайт курса | 15 000 ₽ | 417 ₽/мес. | 1 месяц | Обзор курса | |
| Базы данных с нуля Перейти на сайт курса | 9680 ₽ | 767 ₽/мес. | 2 месяца | Обзор курса | |
| PostgreSQL для начинающих Перейти на сайт курса | 24 813 ₽ | - | 1 месяц | Обзор курса | |
| Основы MySQL Перейти на сайт курса | 30 000 ₽ | - | 1 месяц | Обзор курса |
Больше программ — в полном каталоге курсов по базам данных




