В прошлом уроке мы выяснили, что MySQL это сервер mysqld, а работаем мы с ним через клиент mysql. Сегодня запускаем свой сервер, подключаемся к нему и учимся читать, что отвечает клиент. Здесь легко споткнуться о мелочь вроде забытой точки с запятой, поэтому разберём каждую.
Телефонный звонок
Подключение к базе похоже на звонок в справочную. Нужно знать номер (адрес сервера и порт), представиться (имя пользователя) и назвать пароль. Пока линия открыта, ты задаёшь вопросы и получаешь ответы. Положил трубку, разговор окончен.
Клиент mysql и есть такая трубка. Он открывает соединение, принимает твои запросы, отправляет их серверу и печатает ответы. Сервер при этом живёт сам по себе: если клиент закрыть, сервер продолжит ждать следующих звонков.
MySQL в Docker
Быстрее всего получить MySQL на любой системе через Docker. В систему ничего не ставится, а удалить сервер можно одной командой. Если Docker у тебя есть, запусти:
docker run --name mysql \
-e MYSQL_ROOT_PASSWORD=change-me \
-p 3306:3306 \
-v mysqldata:/var/lib/mysql \
-d mysql:8.4
Разберём по строкам:
--name mysqlдаёт контейнеру имя, по нему мы будем к нему обращаться.-e MYSQL_ROOT_PASSWORD=change-meзадаёт пароль главного пользователяroot. Без этой переменной контейнер не запустится. Пароль здесь учебный, для настоящего сервера придумай свой.-p 3306:3306открывает порт: соединения на порт 3306 твоего компьютера попадут в контейнер.-v mysqldata:/var/lib/mysqlсохраняет файлы базы в томеmysqldata. Без тома данные живут внутри контейнера и пропадут вместе с ним.-d mysql:8.4запускает официальный образ MySQL 8.4 в фоне. Тег8.4всегда указывает на свежий выпуск этой LTS-ветки.
При первом запуске сервер готовит каталог данных, это занимает несколько секунд. Следи за журналом командой docker logs -f mysql и жди строку ready for connections с port: 3306, которую мы видели в прошлом уроке.
Если Docker не хочется, MySQL ставят пакетом: на Ubuntu через apt, на macOS через Homebrew, на Windows установщиком с dev.mysql.com. Дальше всё одинаково.
Подключаемся
Внутри контейнера уже есть клиент mysql. Подключимся им от имени root:
docker exec -it mysql mysql -uroot -pchange-me
Флаг -u задаёт пользователя, -p пароль. Между флагом и значением пробела нет: -pchange-me, а не -p change-me. Вот что напечатал клиент:
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 251
Server version: 8.4.13 MySQL Community Server - GPL
Copyright (c) 2000, 2026, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
Прочитаем это приветствие сверху вниз:
- Предупреждение. Пароль в командной строке видят другие программы на компьютере и история команд. Надёжнее написать один
-pбез значения: клиент спросит пароль сам и не покажет его на экране. Commands end with ; or \g. Команда заканчивается точкой с запятой. Пока её нет, клиент ждёт продолжения.- Connection id. Номер твоего подключения на сервере. У каждого клиента свой.
- Server version. Версия сервера, к которому ты подключился, 8.4.13.
mysql>. Это приглашение: клиент готов принять команду.
С компьютера, где запущен Docker, подключаются так же, только клиент нужен у тебя в системе:
mysql -h 127.0.0.1 -P 3306 -u root -p
Здесь -h это адрес сервера, а -P (заглавная) это порт. Пиши именно 127.0.0.1, а не localhost: на слово localhost клиент MySQL подключается не по сети, а через сокет-файл на твоём компьютере, и до контейнера не достучится.
Кроме консольного клиента, к MySQL подключаются программами с окнами: MySQL Workbench от самих авторов MySQL или DBeaver, который умеет работать с любыми базами. Им нужны те же четыре вещи: адрес, порт, пользователь и пароль. В уроках мы остаёмся в консоли: в ней видно каждый ответ сервера ровно таким, какой он есть.
Точка с запятой и продолжение
Наберём запрос:
SELECT CURRENT_USER(), DATABASE(), NOW();
+----------------+------------+---------------------+
| CURRENT_USER() | DATABASE() | NOW() |
+----------------+------------+---------------------+
| root@localhost | kino | 2026-10-24 12:00:00 |
+----------------+------------+---------------------+
1 row in set (0.00 sec)
CURRENT_USER() показывает, под кем ты работаешь, DATABASE() это текущая база, NOW() время на сервере. В песочнице база kino уже выбрана, а у себя ты увидишь NULL: базу мы ещё не выбрали, об этом следующий урок.
Клиент отправляет запрос серверу только когда увидит ;. Если нажать Enter раньше, приглашение сменится на ->. Это значит: «продолжай, я жду конца команды». Длинный запрос так и пишут, по строке:
mysql> SELECT id, title
-> FROM films
-> WHERE release_year < 1980;
+----+-------------------------------------------+
| id | title |
+----+-------------------------------------------+
| 2 | Москва слезам не верит |
| 3 | Ирония судьбы |
| 4 | Сталкер |
| 5 | Ёжик в тумане |
| 7 | Солярис |
+----+-------------------------------------------+
5 rows in set (0.00 sec)
Частая ситуация новичка: набрал запрос, нажал Enter, а ответа нет, только ->. Ничего не сломалось, клиент ждёт точку с запятой. Поставь её и нажми Enter ещё раз.
Открытая кавычка
Похожая ловушка с кавычками. Если открыть строку ' и не закрыть её, клиент считает, что строка продолжается, и вместо -> печатает '>. Всё, что ты наберёшь дальше, даже точку с запятой и следующую команду, он примет за текст внутри строки. Для двойной кавычки приглашение будет ">.
Выход такой: закрой кавычку, набрав ', а потом сбрось команду через \c. Клиент забудет набранное и вернёт mysql>. Тот же \c выручит, если ты передумал посреди длинного запроса.
Таблица или карточки: ; и \G
Посмотрим на залы обычным способом:
SELECT * FROM halls;
+----+----------------+-------+
| id | name | seats |
+----+----------------+-------+
| 1 | Большой | 120 |
| 2 | Малый | 40 |
| 3 | VIP | 12 |
+----+----------------+-------+
3 rows in set (0.00 sec)
Когда колонок много, таблица не влезает в экран и строки переносятся в кашу. Тогда вместо ; команду заканчивают на \G, и клиент печатает каждую строку отдельной карточкой, по полю на строку:
SELECT * FROM halls\G
*************************** 1. row ***************************
id: 1
name: Большой
seats: 120
*************************** 2. row ***************************
id: 2
name: Малый
seats: 40
*************************** 3. row ***************************
id: 3
name: VIP
seats: 12
3 rows in set (0.00 sec)
\G работает и как конец команды: точка с запятой после него не нужна. Её можно поставить даже на отдельной строке, после ->.
Первые команды SHOW
Команды SHOW спрашивают сервер о нём самом. SHOW TABLES мы уже видели в прошлом уроке. Устройство таблицы покажет SHOW COLUMNS:
SHOW COLUMNS FROM halls;
+-------+-------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------------+------+-----+---------+-------+
| id | int | NO | PRI | NULL | |
| name | varchar(30) | NO | | NULL | |
| seats | smallint unsigned | NO | | NULL | |
+-------+-------------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
Каждая строка описывает колонку: имя, тип, можно ли оставить пустой (Null), ключ (PRI значит первичный ключ) и значение по умолчанию. Типы int, varchar и smallint unsigned разберём в уроках про числа и строки.
Как выйти
Команда exit (или quit, или \q) закрывает соединение. Клиент прощается:
mysql> exit
Bye
Сервер при этом работает дальше. Остановить контейнер можно командой docker stop mysql, запустить снова docker start mysql. Данные останутся в томе mysqldata.
Что запомнить
- Официальный образ
mysql:8.4поднимает сервер одной командойdocker run, пароль root задаёт переменная окружения. - Клиент
mysqlждёт точку с запятой: пока её нет, он печатает->и копит строки в один запрос. - Незакрытая кавычка меняет приглашение на
'>, выручает закрывающая кавычка и\c. \Gвместо;печатает каждую строку карточкой, это удобно для широких таблиц.SHOW DATABASES,SHOW TABLESиSHOW COLUMNSотвечают на вопрос «что здесь вообще есть».
Попробуй сам
В песочнице сервер запущен и подключение открыто. Выполни запросы и сравни таблицу с карточками:
Выведи SELECT * FROM films с ; и с \G: какой вид удобнее, когда колонок семь? Запиши запрос в три строки, как в примере с ->, и убедись, что ответ тот же. Посмотри SHOW COLUMNS для таблицы tickets.
Проверь себя
Задание
Дальше
Сервер есть, но своей базы на нём пока нет, а работаем мы под всемогущим root. В следующем уроке создадим базу данных и отдельного пользователя с ограниченными правами.
домашка