SQL ·
‹ Previous Next ›
⏱ 5 min read Modified: 2026-11-09

Реляционные БД и СУБД: основы и запуск 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 — один город, каждый столбец — один его атрибут: название, код страны, район и население.

Таблица city: первые 12 строк
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 Созданные темы
Кирилл [email protected] О рыбалке
Вася [email protected] Велосипеды; О рыбалке
Семен [email protected] Ночные клубы

У Васи в одной ячейке две темы — это нарушает атомарность: поиск по теме «О рыбалке» придётся строить на разборе строки. Поэтому таблицу делят на две:

Пользователи
Имя Email
Кирилл [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 update
sudo 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

Please log in or register to have a possibility to add comment.