Запуск MySQL та MariaDB-запитів з Linux CLI

Під час адміністрування баз даних часто виникає потреба швидко виконати SQL-запит і уважно проаналізувати результат. Зазвичай це роблять через MySQL або MariaDB shell, але командний рядок Linux дає більше гнучкості: ви можете виконувати запити напряму, зберігати результати у файли, передавати їх в інші утиліти та автоматизувати процеси.

У цьому гайді ви побачите, як виконувати MySQL/MariaDB-запити без входу в інтерактивну консоль і як ефективно працювати з результатами — від простих вибірок до складних багаторядкових запитів.

Підготовка тестових баз даних

Перед тим як переходити до прикладів, підготуємо бази даних, з якими будемо працювати протягом усього гайду. Це дозволить вам повторювати всі кроки локально та експериментувати без ризику для робочих даних.

Ми використаємо:

  1. tecmintdb — для простих запитів;
  2. employees — для складніших прикладів із JOIN та агрегаціями.

Створення бази даних tecmintdb

mysql -u root -p -e "CREATE DATABASE IF NOT EXISTS tecmintdb;"

Ця команда створює базу даних tecmintdb, якщо вона ще не існує.

Створення та наповнення таблиці tutorials

sudo mysql -u root -p tecmintdb << 'EOF'
CREATE TABLE IF NOT EXISTS tutorials (
    tut_id INT NOT NULL AUTO_INCREMENT,
    tut_title VARCHAR(100) NOT NULL,
    tut_author VARCHAR(40) NOT NULL,
    submission_date DATE,
    PRIMARY KEY (tut_id)
);

INSERT INTO tutorials (tut_title, tut_author, submission_date) VALUES
('Getting Started with Linux', 'John Smith', '2024-01-15'),
('Advanced Bash Scripting', 'Sarah Johnson', '2024-02-20'),
('MySQL Database Administration', 'Mike Williams', '2024-03-10'),
('Apache Web Server Configuration', 'Emily Brown', '2024-04-05'),
('Python for System Administrators', 'David Lee', '2024-05-12'),
('Docker Container Basics', 'Lisa Anderson', '2024-06-18'),
('Kubernetes Orchestration', 'Robert Taylor', '2024-07-22'),
('Linux Security Hardening', 'Jennifer Martinez', '2024-08-30');
EOF

Тут ми:

  • створюємо таблицю tutorials;
  • одразу додаємо тестові записи.

Перевірка даних у таблиці tutorials

sudo mysql -u root -p -e "USE tecmintdb; SELECT * FROM tutorials;"

Цей запит дозволяє переконатися, що таблиця створена коректно і всі дані успішно вставлені.

Створення бази даних employees

Тепер підготуємо складнішу структуру, яку будемо використовувати для прикладів із JOIN та підзапитами.

sudo mysql -u root -p -e "CREATE DATABASE IF NOT EXISTS employees;"

Таблиця employees

sudo mysql -u root -p employees << 'EOF'
CREATE TABLE IF NOT EXISTS employees (
    emp_no INT NOT NULL AUTO_INCREMENT,
    birth_date DATE NOT NULL,
    first_name VARCHAR(14) NOT NULL,
    last_name VARCHAR(16) NOT NULL,
    gender ENUM('M','F') NOT NULL,
    hire_date DATE NOT NULL,
    PRIMARY KEY (emp_no)
);

INSERT INTO employees (emp_no, birth_date, first_name, last_name, gender, hire_date) VALUES
(10001, '1953-09-02', 'Georgi', 'Facello', 'M', '1984-06-02'),
(10002, '1964-06-02', 'Bezalel', 'Simmel', 'F', '1984-11-21'),
(10003, '1959-12-03', 'Parto', 'Bamford', 'M', '1984-08-28'),
(10004, '1954-05-01', 'Chirstian', 'Koblick', 'M', '1984-12-01'),
(10005, '1955-01-21', 'Kyoichi', 'Maliniak', 'M', '1984-09-15'),
(10006, '1953-04-20', 'Anneke', 'Preusig', 'F', '1985-02-18'),
(10007, '1957-05-23', 'Tzvetan', 'Zielinski', 'F', '1985-03-20'),
(10008, '1958-02-19', 'Saniya', 'Kalloufi', 'M', '1984-07-11'),
(10009, '1952-04-19', 'Sumant', 'Peac', 'F', '1985-02-18'),
(10010, '1963-06-01', 'Duangkaew', 'Piveteau', 'F', '1984-08-24');
EOF

Це основна таблиця зі співробітниками. Вона містить персональні дані та дату прийняття на роботу, які знадобляться для фільтрації та аналітики.

Таблиця salaries

sudo mysql -u root -p employees << 'EOF'
CREATE TABLE IF NOT EXISTS salaries (
    emp_no INT NOT NULL,
    salary INT NOT NULL,
    from_date DATE NOT NULL,
    to_date DATE NOT NULL,
    PRIMARY KEY (emp_no, from_date),
    FOREIGN KEY (emp_no) REFERENCES employees(emp_no) ON DELETE CASCADE
);
...
EOF

Таблиця зберігає історію зарплат.

Зовнішній ключ гарантує цілісність даних і автоматичне очищення записів при видаленні співробітника.

Таблиця departments

sudo mysql -u root -p employees << 'EOF'
CREATE TABLE IF NOT EXISTS departments (
    dept_no CHAR(4) NOT NULL,
    dept_name VARCHAR(40) NOT NULL,
    PRIMARY KEY (dept_no),
    UNIQUE KEY (dept_name)
);
...
EOF

Тут зберігається довідник департаментів, який використовується для побудови складних JOIN-запитів.

Таблиця dept_emp

sudo mysql -u root -p employees << 'EOF'
CREATE TABLE IF NOT EXISTS dept_emp (
    emp_no INT NOT NULL,
    dept_no CHAR(4) NOT NULL,
    from_date DATE NOT NULL,
    to_date DATE NOT NULL,
    PRIMARY KEY (emp_no, dept_no),
    FOREIGN KEY (emp_no) REFERENCES employees(emp_no) ON DELETE CASCADE,
    FOREIGN KEY (dept_no) REFERENCES departments(dept_no) ON DELETE CASCADE
);
...
EOF

Вона повʼязує співробітників із департаментами та дозволяє відстежувати історію переведень.

Перевірка структури бази employees

Перед тим як працювати з таблицями, корисно перевірити, що база даних employees і всі таблиці створені правильно. Це дозволяє переконатися, що структура готова для подальших запитів. 

Зробити це можна за такою командою:

sudo mysql -u root -p -e "USE employees; SHOW TABLES;"

Базове виконання запитів

Щоб швидко отримати перелік усіх баз даних на сервері без входу в MySQL shell, можна використати таку команду:

sudo mysql -u root -p -e "show databases;"

Ви побачите всі доступні бази даних. Це корисно на старті роботи, щоб орієнтуватися, з чим можна працювати.

Збереження результатів запиту у файл

Іноді потрібно виконати запит і одночасно зберегти результати для подальшого аналізу або передачі колегам. Для цього використовують команду з tee:

sudo mysql -u root -p -e "USE employees; SELECT DISTINCT A.first_name, A.last_name FROM employees A JOIN salaries B ON A.emp_no = B.emp_no WHERE hire_date < '1985-01-31';" | tee queryresults.txt

MySQL виконує запит, а tee:

  • показує результат у терміналі;
  • паралельно записує його у файл queryresults.txt.
cat queryresults.txt

Ця команда дозволяє швидко переглянути збережені результати прямо у терміналі.

Вертикальний формат виводу

Якщо таблиця має багато колонок, горизонтальна таблиця може виглядати незручно. Вертикальний формат допомагає краще читати дані:

sudo mysql -u root -p -e "USE employees; SELECT * FROM employees LIMIT 1\G"

Опція \G змінює формат відображення рядка: кожне поле починається з нового рядка, що робить дані більш зручними для перегляду.

Експорт результатів у CSV

Щоб імпортувати дані в Excel або Google Sheets, результати запиту потрібно перевести у CSV:

sudo mysql -u root -p -e "USE employees; SELECT first_name, last_name, hire_date FROM employees WHERE hire_date < '1985-01-31';" | sed 's/\t/,/g' > employees.csv

Команда замінює символи табуляції на коми і створює готовий CSV-файл.

Запуск запитів без введення пароля

Для автоматизації завдань з MySQL можна зберегти облікові дані у конфігураційному файлі:

[client]
user=root
password=your_password_here

chmod 600 ~/.my.cnf

Після цього запити можна виконувати без параметра -p і без введення пароля вручну. Використовуйте цей метод лише на серверах із контрольованим доступом, бо пароль зберігається у відкритому вигляді.

Виконання багаторядкових запитів з файлу

Якщо запит занадто складний для однієї команди, його зручно зберігати у SQL-файлі:

cat > complex_query.sql << 'EOF'
...
EOF

sudo mysql -u root -p < complex_query.sql > top_earners_1985.txt

Такий підхід дозволяє організовано виконувати великі запити, легко повторювати їх і навіть версіонувати через git.

Робота з великими наборами даних

Коли обробляєте великі таблиці або дані з багатьма спеціальними символами, потрібно контролювати формат та памʼять:

sudo mysql -u root -p --batch --raw -e "SELECT description FROM products WHERE category='electronics';" > products.txt

Параметри --batch --raw роблять вивід чистим і придатним для обробки скриптами.

sudo mysql -u root -p --quick -e "SELECT * FROM huge_table;" | gzip > huge_results.txt.gz

Швидкі резервні копії

Для швидкого створення бекапу всієї бази застосуйте:

sudo mysqldump -u root -p employees | gzip > employees_backup_$(date +%Y%m%d).sql.gz

Або бекап лише критичних таблиць:

sudo mysqldump -u root -p employees employees salaries | gzip > critical_tables_$(date +%Y%m%d).sql.gz

Це дозволяє швидко зберегти дані та при необхідності відновити їх без використання складних GUI.

Підсумок

Командний рядок Linux дає змогу працювати з MySQL та MariaDB швидко, гнучко та масштабовано. Ви можете виконувати запити, зберігати результати, автоматизувати звіти й інтегрувати роботу з базами у власні скрипти та пайплайни без потреби у важких GUI-інструментах.

А якщо потрібно отримати навички на практиці — летс гоу на курси від ITEDU. Це провідний навчальний центр у DevOps, системному адмініструванні та суміжних сферах з понад 10-річним досвідом.

Залишити відповідь

Дякуємо, що поділились