Реляционные БД и СУБД: основы и запуск MySQL
Представьте таблицу форума, где в одной ячейке записано «Велосипеды; О рыбалке». Как найти всех, кто создал тему про рыбалку, если значения склеены в одну строку? Именно такие проблемы решают реляционные базы данных и системы управления ими.
База данных (БД) — это упорядоченный набор взаимосвязанных данных, хранящийся в одном или нескольких файлах. СУБД (система управления базами данных) — программа, которая создаёт базу, хранит данные, выполняет запросы и следит за их целостностью. В этом уроке разберём, как устроены реляционные БД, а затем запустим MySQL и выполним первый запрос.
1. База данных и СУБД: в чём разница
База данных — это сами данные, а СУБД — программа, которая с ними работает: программа не хранит информацию «в себе», а управляет файлами базы. Java-приложение обращается не к файлам, а к СУБД, и общается с ней на языке SQL.
| Понятие | Что это | Пример |
|---|---|---|
| База данных (БД) | Набор взаимосвязанных данных, организованный по определённой модели | Данные форума: пользователи, темы, сообщения |
| СУБД | Программа для создания БД, хранения данных, выполнения запросов и контроля доступа | MySQL, PostgreSQL, Oracle Database |
| SQL | Язык структурированных запросов: через него приложение читает и записывает данные в БД | SELECT * FROM users; |
Примеры баз данных встречаются в любом приложении: каталог товаров и заказы интернет-магазина, счета и платежи клиентов банка, расписание поездов, пользователи и сообщения форума. Каждую такую базу обслуживает СУБД.
Основные функции СУБД: хранение и поиск данных, выполнение SQL-запросов, контроль целостности (данные не противоречат правилам таблиц), одновременная работа многих пользователей, разграничение прав доступа, резервное копирование и восстановление.
Простейшая схема работы выглядит так: приложение отправляет SQL-запрос в СУБД, СУБД читает или изменяет файлы базы и возвращает результат.

2. Примеры и типы СУБД
Чаще всего в разработке встречаются реляционные СУБД (РСУБД), где данные лежат в таблицах: MySQL, PostgreSQL, Oracle Database, Microsoft SQL Server, SQLite. Для остальных моделей данных используют нереляционные (NoSQL) системы.
| Тип СУБД | Как хранит данные | Примеры |
|---|---|---|
| Реляционные | Таблицы со строками и столбцами, связи между таблицами | MySQL, MariaDB, PostgreSQL, Oracle, SQL Server, SQLite |
| Документные | Документы (чаще всего JSON) | MongoDB |
| Ключ-значение | Пары «ключ → значение», обычно в памяти | Redis |
| Графовые | Узлы и связи между ними | Neo4j |
| Иерархические и сетевые | Древовидные и графоподобные записи; исторические модели, предшествовавшие реляционной | IMS (иерархическая), IDMS (сетевая) |
В этом модуле используем MySQL: он бесплатный, распространённый и хорошо подходит для обучения. Всё, что вы узнаете про SQL, с небольшими отличиями работает и в других реляционных СУБД.
3. Реляционная модель: таблицы, строки, столбцы
Реляционная модель хранит данные в виде двумерных таблиц: каждая строка описывает одну запись, каждый столбец — один атрибут записи. Таблица реляционной БД обладает такими свойствами:
- каждый столбец имеет уникальное имя;
- все значения в столбце одного типа (число, строка, дата);
- одинаковых строк в таблице нет;
- порядок строк произвольный;
- на пересечении строки и столбца лежит одно атомарное значение, то есть не список значений.
Свойство «одинаковых строк нет» относится к модели: настоящая SQL-таблица без ограничений позволит вставить две одинаковые строки, и запрет на это обеспечивает первичный ключ (о нём — в уроке Типы ключей баз данных). Требование атомарности лежит в основе нормализации; подробнее о нормальных формах — в уроке Нормализация баз данных.
Пример таблицы city
Каждая строка таблицы city — один город, каждый столбец — один его атрибут: название, код страны, район и население.
| ID | Name | CountryCode | District | Population |
|---|---|---|---|---|
| 1 | Kabul | AFG | Kabol | 1 780 000 |
| 2 | Qandahar | AFG | Qandahar | 237 500 |
| 3 | Herat | AFG | Herat | 186 800 |
| 4 | Mazar-e-Sharif | AFG | Balkh | 127 800 |
| 5 | Amsterdam | NLD | Noord-Holland | 731 200 |
| 6 | Rotterdam | NLD | Zuid-Holland | 593 321 |
| 7 | Haag | NLD | Zuid-Holland | 440 900 |
| 8 | Utrecht | NLD | Utrecht | 234 323 |
| 9 | Eindhoven | NLD | Noord-Brabant | 201 843 |
| 10 | Tilburg | NLD | Noord-Brabant | 193 238 |
| 11 | Groningen | NLD | Groningen | 172 701 |
| 12 | Breda | NLD | Noord-Brabant | 160 398 |
4. Зачем раскладывать данные по таблицам: пример форума
Данные раскладывают по нескольким таблицам, чтобы в каждой ячейке лежало одно значение и ничего не дублировалось. Допустим, нужно хранить пользователей форума и созданные ими темы. В одной таблице получится так:
| Имя | Созданные темы | |
|---|---|---|
| Кирилл | [email protected] | О рыбалке |
| Вася | [email protected] | Велосипеды; О рыбалке |
| Семен | [email protected] | Ночные клубы |
У Васи в одной ячейке две темы — это нарушает атомарность: поиск по теме «О рыбалке» придётся строить на разборе строки. Поэтому таблицу делят на две:
| Имя | |
|---|---|
| Кирилл | [email protected] |
| Вася | [email protected] |
| Семен | [email protected] |
| Наименование | Автор |
|---|---|
| О рыбалке | Кирилл |
| Велосипеды | Вася |
| О рыбалке | Вася |
| Ночные клубы | Семен |
Теперь в каждой ячейке одно значение. Остаётся надёжно связать строки разных таблиц (например, тему и её автора, если на форуме появится второй Вася) — для этого в реляционных БД существуют ключи. Как они устроены, разберём в уроке Типы ключей баз данных.
5. Запуск MySQL
Запустить MySQL можно двумя способами: в контейнере Docker (одна команда, ничего не остаётся в системе) или установкой на компьютер. Для курса берём MySQL 8.4 — ветку с долгосрочной поддержкой (LTS). Версии 5.7 и 8.0 сняты с поддержки (8.0 — в апреле 2026 года), на них учиться не стоит.
С 2026 года у MySQL две LTS-ветки, 8.4 и 9.7, а новые промежуточные (Innovation) релизы нумеруются по календарю: 26.7, 26.10 и т.д. Для запросов этого модуля разницы между ними нет.
Вариант 1. Docker
Если Docker уже установлен, MySQL запускается одной командой:
docker run --name mysql-course -e MYSQL_ROOT_PASSWORD=secret -p 3306:3306 -v mysql_data:/var/lib/mysql -d mysql:8.4 | Часть команды | Что делает |
|---|---|
--name mysql-course | Имя контейнера; по нему его запускают, останавливают и подключаются к нему |
-e MYSQL_ROOT_PASSWORD=secret | Задаёт пароль пользователя root; без этой переменной контейнер сразу завершится с ошибкой |
-p 3306:3306 | Пробрасывает порт 3306 контейнера на порт 3306 компьютера (формат порт_компьютера:порт_контейнера) |
-v mysql_data:/var/lib/mysql | Именованный volume: данные хранятся вне контейнера и не пропадут после его удаления |
-d mysql:8.4 | Запуск в фоне из образа MySQL 8.4 LTS |
Первый запуск скачивает образ и инициализирует базу, это занимает от нескольких секунд до минуты. Сервер готов, когда в логе появилась строка ready for connections с port: 3306: при первом запуске такая строка печатается ещё и для временного сервера инициализации (с port: 0), к нему подключаться бесполезно. Затем проверьте версию и подключитесь клиентом внутри контейнера:
docker logs mysql-course
docker exec mysql-course mysql --version
docker exec -it mysql-course mysql -uroot -p Введите пароль (secret): появится приглашение mysql>. Выйти — exit. Остановить и снова запустить контейнер можно командами docker stop mysql-course и docker start mysql-course: данные сохранятся в volume.
Порт уже занят
Если на компьютере уже работает другой MySQL, Docker выдаст ошибку port is already allocated или address already in use. Запустите контейнер на другом порту компьютера, например -p 3307:3306, и подключайтесь к порту 3307. Простой пароль secret годится только для учебной машины.
Вариант 2. Установка на компьютер
| Система | Установка | Запуск и подключение |
|---|---|---|
| Windows | Скачайте с dev.mysql.com MSI-пакет MySQL Community Server 8.4 и установите его. Сразу после установки запустите MySQL Configurator: он настроит сервер и попросит задать пароль root | Configurator регистрирует сервер как службу Windows, она стартует автоматически. Подключение: mysql -uroot -p; чтобы команда находилась, добавьте в PATH папку C:\Program Files\MySQL\MySQL Server 8.4\bin |
| macOS | brew install [email protected]. Формула keg-only: клиент не попадает в PATH сам, добавьте его командойecho 'export PATH="$(brew --prefix [email protected])/bin:$PATH"' >> ~/.zshrc и откройте новый терминал | brew services start [email protected]. Пароль root после установки пустой: подключение mysql -uroot, пароль задайте командой mysql_secure_installation |
| Linux (Ubuntu, Debian) | sudo apt updatesudo apt install mysql-server | sudo systemctl status mysql — проверка службы. Подключение: sudo mysql (по умолчанию root входит через сокет, без пароля) |
Версия из репозитория зависит от системы: в Ubuntu 26.04 apt ставит MySQL 8.4, в более старых выпусках может оказаться снятая с поддержки 8.0, а brew install mysql без версии ставит свежий Innovation-релиз 26.x. Для учебных запросов этого модуля подойдёт любая из них. После установки проверьте, что клиент найден и сервер отвечает:
mysql --version
mysql -uroot -p Первая команда выводит версию клиента, например mysql Ver 8.4.8 for Linux on x86_64 (MySQL Community Server - GPL); вторая запрашивает пароль и открывает приглашение mysql>. Если система отвечает command not found или "mysql" не является внутренней или внешней командой, папка bin MySQL не добавлена в PATH.
Графические клиенты
Вводить запросы можно в консоли, но с таблицами удобнее работать в графическом клиенте. Для подключения везде нужны одни и те же параметры: хост 127.0.0.1 (или localhost), порт 3306 (или тот, что вы пробросили), пользователь root и его пароль.
| Клиент | Особенности |
|---|---|
| MySQL Workbench | Официальный бесплатный клиент MySQL (скачивается отдельно с dev.mysql.com): редактор запросов, просмотр таблиц, схемы |
| DBeaver Community | Бесплатный, работает с MySQL, PostgreSQL, SQLite и другими СУБД |
| Database tool в IntelliJ IDEA Ultimate | Встроен в IDE: удобен, если вы и так пишете Java-код в IntelliJ IDEA (в бесплатной Community-версии его нет) |
6. Первый запрос в MySQL
Первый запрос состоит из пяти шагов: создать базу данных, выбрать её, создать таблицу, добавить в неё строки и прочитать их обратно. Подключитесь клиентом mysql (см. выше) и выполните команды по порядку; каждая заканчивается точкой с запятой.
Создаём базу forum и выбираем её как текущую:
CREATE DATABASE forum;
USE forum; Создаём таблицу users и проверяем, что она появилась:
CREATE TABLE users (
id INT NOT NULL AUTO_INCREMENT,
username VARCHAR(50) NOT NULL,
email VARCHAR(100) NOT NULL,
PRIMARY KEY (id)
);
SHOW TABLES; +-----------------+
| Tables_in_forum |
+-----------------+
| users |
+-----------------+ Добавляем две строки и читаем всё содержимое таблицы:
INSERT INTO users (username, email) VALUES
('Kirill', '[email protected]'),
('Vasya', '[email protected]');
SELECT * FROM users; +----+----------+--------------------+
| id | username | email |
+----+----------+--------------------+
| 1 | Kirill | [email protected] |
| 2 | Vasya | [email protected] |
+----+----------+--------------------+ Столбец id вы не заполняли — MySQL проставил номера сам благодаря AUTO_INCREMENT. Этот столбец — первичный ключ таблицы, подробнее о ключах — в уроке Типы ключей баз данных. Что выведет следующий запрос?
SELECT username, email FROM users WHERE id = 2; +----------+-------------------+
| username | email |
+----------+-------------------+
| Vasya | [email protected] |
+----------+-------------------+ Синтаксис операторов подробно разбирается в следующих уроках: SQL: оператор CREATE, Оператор INSERT в SQL и SQL: оператор SELECT. Типы данных столбцов (INT, VARCHAR) описаны в уроке Какие существуют типы данных в MySQL.
Что может пойти не так
Ошибка ERROR 1046 (3D000): No database selected означает, что вы забыли USE forum;. Ошибка ERROR 1007 (HY000): Can't create database 'forum'; database exists — база уже создана: пропустите первую команду или пишите CREATE DATABASE IF NOT EXISTS forum;.
Часто задаваемые вопросы
MySQL и SQL — это одно и то же?
Нет. SQL — язык запросов, а MySQL — одна из СУБД, которая этот язык понимает. Такие же запросы вы напишете для PostgreSQL или Oracle, с небольшими отличиями в диалекте. Сравнение понятий — в таблице выше.
Какую СУБД выбрать начинающему Java-разработчику?
Начните с MySQL или PostgreSQL: обе бесплатны, широко используются в Java-проектах и поддерживаются JDBC и Hibernate. Для учебных задач на SQL разницы между ними почти нет; в этом курсе используется MySQL.
Чем сетевая или NoSQL-база отличается от реляционной?
В реляционной БД данные лежат в таблицах с заранее заданными столбцами, и их связывают запросами. В сетевых, документных и графовых базах данные хранятся в других структурах (записи со ссылками, JSON-документы, узлы и рёбра), а жёсткой таблицы нет. Реляционные базы остаются стандартом для данных со строгой структурой, например заказов и платежей.
Какую версию MySQL ставить: 8.4, 9.7 или 26.x?
Для учёбы и рабочих проектов выбирайте LTS-ветку: 8.4 или 9.7 получают исправления несколько лет. Релизы 26.x (Innovation) выходят раз в квартал и быстро сменяют друг друга — они нужны, чтобы попробовать новые возможности. Версии 5.7 и 8.0 больше не поддерживаются, в новых проектах их не используют.
Почему mysql -uroot -p на компьютере не подключается к MySQL в Docker?
В Linux и macOS клиент mysql с хостом localhost подключается через Unix-сокет, а не по сети, и не видит сервер в контейнере — отсюда ERROR 2002 (HY000): Can't connect to local MySQL server through socket. Укажите адрес явно: mysql -h 127.0.0.1 -P 3306 -uroot -p. Графические клиенты подключаются по сети, у них этой проблемы нет.
Comments