Операции импорта и экспорта в MySQL

MySQLMySQLBeginner
Практиковаться сейчас

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

В этом практическом занятии (лабораторной работе) вы научитесь выполнять операции импорта и экспорта данных в MySQL. В частности, вы узнаете, как импортировать данные из CSV-файла в таблицу MySQL с использованием оператора LOAD DATA INFILE. Это включает создание CSV-файла с именем employees.csv с данными о сотрудниках, подключение к серверу MySQL, создание базы данных и таблицы, а затем использование команды LOAD DATA INFILE для импорта данных.

В рамках практического занятия (лабораторной работы) вы пройдете по этапам создания файла employees.csv, подключения к серверу MySQL от имени пользователя root, создания базы данных company и таблицы employees, а также выполнения оператора LOAD DATA INFILE с соответствующими параметрами для импорта данных из CSV-файла в таблицу. Также в практическом занятии (лабораторной работе) кратко описаны компоненты оператора LOAD DATA INFILE.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL mysql(("MySQL")) -.-> mysql/BasicKeywordsandStatementsGroup(["Basic Keywords and Statements"]) mysql/BasicKeywordsandStatementsGroup -.-> mysql/use_database("Database Selection") mysql/BasicKeywordsandStatementsGroup -.-> mysql/create_database("Database Creation") mysql/BasicKeywordsandStatementsGroup -.-> mysql/create_table("Table Creation") mysql/BasicKeywordsandStatementsGroup -.-> mysql/select("Data Retrieval") mysql/BasicKeywordsandStatementsGroup -.-> mysql/insert("Data Insertion") mysql/BasicKeywordsandStatementsGroup -.-> mysql/delete("Data Deletion") subgraph Lab Skills mysql/use_database -.-> lab-550909{{"Операции импорта и экспорта в MySQL"}} mysql/create_database -.-> lab-550909{{"Операции импорта и экспорта в MySQL"}} mysql/create_table -.-> lab-550909{{"Операции импорта и экспорта в MySQL"}} mysql/select -.-> lab-550909{{"Операции импорта и экспорта в MySQL"}} mysql/insert -.-> lab-550909{{"Операции импорта и экспорта в MySQL"}} mysql/delete -.-> lab-550909{{"Операции импорта и экспорта в MySQL"}} end

Импорт данных из CSV с использованием LOAD DATA INFILE

На этом этапе вы научитесь импортировать данные из CSV-файла в таблицу MySQL с использованием оператора LOAD DATA INFILE. Это очень эффективный способ загрузки больших объемов данных в базу данных.

Прежде чем мы начнем, создадим простой CSV-файл с именем employees.csv, содержащий данные о сотрудниках. Откройте терминал и используйте nano для создания файла:

nano ~/project/employees.csv

Теперь вставьте следующие данные в файл employees.csv:

1,John,Doe,[email protected],Sales
2,Jane,Smith,[email protected],Marketing
3,Peter,Jones,[email protected],Engineering
4,Mary,Brown,[email protected],HR

Нажмите Ctrl+X, затем Y, а затем Enter, чтобы сохранить файл.

Далее нам нужно подключиться к серверу MySQL. Откройте терминал и выполните следующую команду, чтобы подключиться к серверу MySQL как пользователь root. Вам может потребоваться ввести пароль для пользователя root, который обычно пустой в настройках виртуальной машины LabEx по умолчанию.

mysql -u root -p

Если вас попросят ввести пароль, а вы его не устанавливали, просто нажмите Enter.

Теперь создадим базу данных с именем company и таблицу с именем employees в этой базе данных. Выполните следующие SQL-инструкции в оболочке MySQL:

CREATE DATABASE IF NOT EXISTS company;
USE company;

CREATE TABLE IF NOT EXISTS employees (
    id INT PRIMARY KEY,
    first_name VARCHAR(50),
    last_name VARCHAR(50),
    email VARCHAR(100),
    department VARCHAR(50)
);

Теперь, когда база данных и таблица созданы, мы можем использовать оператор LOAD DATA INFILE для импорта данных из файла employees.csv. Выполните следующую SQL-инструкцию в оболочке MySQL:

LOAD DATA INFILE '/home/labex/project/employees.csv'
INTO TABLE employees
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 ROWS;

Разберем эту инструкцию на части:

  • LOAD DATA INFILE '/home/labex/project/employees.csv': Указывает путь к CSV-файлу. Важно: Используйте абсолютный путь к файлу.
  • INTO TABLE employees: Указывает таблицу, в которую будут импортированы данные.
  • FIELDS TERMINATED BY ',': Указывает, что поля в CSV-файле разделены запятыми.
  • ENCLOSED BY '"': Указывает, что поля заключены в двойные кавычки (если это применимо). В нашем случае это не строго необходимо, но это хорошая практика.
  • LINES TERMINATED BY '\n': Указывает, что каждая строка в CSV-файле представляет новую запись, и строки разделены символом новой строки.
  • IGNORE 1 ROWS: Это важно, если ваш CSV-файл имеет строку заголовка. Это сообщает MySQL пропустить первую строку файла. В нашем файле employees.csv нет строки заголовка, поэтому мы должны удалить эту строку.

Попробуем оператор LOAD DATA INFILE еще раз, на этот раз без клаузы IGNORE 1 ROWS:

LOAD DATA INFILE '/home/labex/project/employees.csv'
INTO TABLE employees
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n';

Чтобы убедиться, что данные были импортированы правильно, выполните следующую SQL-инструкцию:

SELECT * FROM employees;

Вы должны увидеть данные из файла employees.csv, отображающиеся в оболочке MySQL.

Наконец, выйдите из оболочки MySQL:

exit

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

На этом этапе вы научитесь экспортировать результаты запроса в MySQL в CSV-файл. Это полезно для создания отчетов, передачи данных другим приложениям или резервного копирования данных.

Мы будем использовать командную строку mysql с опцией -e для выполнения запроса и перенаправления вывода в файл. Также мы будем использовать некоторые опции для форматирования вывода в виде CSV-файла.

Сначала подключимся к серверу MySQL. Откройте терминал и выполните следующую команду, чтобы подключиться к серверу MySQL как пользователь root:

mysql -u root -p

Если вас попросят ввести пароль, а вы его не устанавливали, просто нажмите Enter.

Добавим несколько записей в таблицу employees, чтобы иметь больше данных для экспорта. Выполните следующие SQL-инструкции в оболочке MySQL:

USE company;
INSERT INTO employees (id, first_name, last_name, email, department) VALUES
(5, 'Alice', 'Johnson', '[email protected]', 'Sales'),
(6, 'Bob', 'Williams', '[email protected]', 'Marketing');

Теперь выйдите из оболочки MySQL:

exit

Теперь экспортируем все данные из таблицы employees в CSV-файл с именем employees_export.csv в директории ~/project. Выполните следующую команду в терминале:

mysql -u root -p -e "USE company; SELECT * FROM employees;" \
  --batch --raw --skip-column-names \
  | sed 's/\t/","/g; s/^/"/; s/$/"/;' > ~/project/employees_export.csv

Разберем эту команду на части:

  • mysql -u root -p -e "USE company; SELECT * FROM employees;": Эта часть выполняет SQL-запрос SELECT * FROM employees в базе данных company. Вам будет предложено ввести пароль для пользователя root в MySQL.
  • --batch: Эта опция указывает mysql работать в пакетном режиме, который подходит для неинтерактивного использования.
  • --raw: Эта опция указывает mysql выводить данные без какого-либо форматирования.
  • --skip-column-names: Эта опция указывает mysql не выводить имена столбцов.
  • sed 's/\t/","/g; s/^/"/; s/$/"/;': Эта часть использует команду sed для форматирования вывода в виде CSV-файла.
    • s/\t/","/g: Заменяет символы табуляции (которые являются стандартными разделителями полей в выводе mysql) на ",".
    • s/^/"/: Добавляет двойную кавычку в начале каждой строки.
    • s/$/"/: Добавляет двойную кавычку в конце каждой строки.
  • > ~/project/employees_export.csv: Это перенаправляет вывод команды в файл с именем employees_export.csv в директории ~/project.

Теперь проверим содержимое файла employees_export.csv. Используйте nano для открытия файла:

nano ~/project/employees_export.csv

Вы должны увидеть данные из таблицы employees, отформатированные в виде CSV-файла, где каждое поле заключено в двойные кавычки и разделено запятыми.

Нажмите Ctrl+X, чтобы выйти из nano.

Исправление проблем с кодировкой при импорте

На этом этапе вы научитесь решать проблемы с кодировкой при импорте данных из CSV-файла в MySQL. Проблемы с кодировкой могут возникнуть, если кодировка символов в CSV-файле не соответствует кодировке символов в таблице MySQL. Это может привести к импорту искаженных или неверных данных.

Сначала создадим CSV-файл с некоторыми специальными символами, которые могут вызвать проблемы с кодировкой. Мы будем использовать имя с ударением. Откройте терминал и используйте nano для создания файла:

nano ~/project/employees_encoding.csv

Теперь вставьте следующие данные в файл employees_encoding.csv:

1,René,Doe,[email protected],Sales
2,Jane,Smith,[email protected],Marketing

Нажмите Ctrl+X, затем Y, а затем Enter, чтобы сохранить файл.

Теперь попробуем импортировать эти данные в таблицу employees без указания кодировки. Сначала нам нужно очистить существующие данные из таблицы. Подключитесь к серверу MySQL:

mysql -u root -p

Если вас попросят ввести пароль, а вы его не устанавливали, просто нажмите Enter.

Выполните следующие SQL-инструкции в оболочке MySQL:

USE company;
TRUNCATE TABLE employees;

Это удалит все существующие строки из таблицы employees.

Теперь выйдите из оболочки MySQL:

exit

Теперь попробуем импортировать файл employees_encoding.csv с использованием той же команды LOAD DATA INFILE, которую мы использовали ранее:

mysql -u root -p -e "USE company; LOAD DATA INFILE '/home/labex/project/employees_encoding.csv' INTO TABLE employees FIELDS TERMINATED BY ',' ENCLOSED BY '\"' LINES TERMINATED BY '\n';"

После ввода пароля подключитесь к серверу MySQL еще раз:

mysql -u root -p

И проверьте данные:

USE company;
SELECT * FROM employees;

Вы, возможно, заметите, что first_name первого сотрудника отображается неправильно. Это связано с проблемой кодировки. Выйдите из оболочки MySQL:

exit

Чтобы исправить это, нам нужно указать кодировку символов CSV-файла при использовании LOAD DATA INFILE. Одна из распространенных кодировок - utf8. Измените оператор LOAD DATA INFILE, добавив клаузулу CHARACTER SET utf8:

mysql -u root -p -e "USE company; LOAD DATA INFILE '/home/labex/project/employees_encoding.csv' INTO TABLE employees CHARACTER SET utf8 FIELDS TERMINATED BY ',' ENCLOSED BY '\"' LINES TERMINATED BY '\n';"

Теперь подключитесь к серверу MySQL еще раз:

mysql -u root -p

И проверьте данные:

USE company;
SELECT * FROM employees;

Теперь вы должны увидеть, что first_name первого сотрудника отображается правильно как "René".

Наконец, выйдите из оболочки MySQL:

exit

В этом примере мы использовали utf8. Однако, в зависимости от кодировки вашего CSV-файла, вам может потребоваться использовать другую кодировку символов. Среди распространенных кодировок есть latin1, utf8mb4 и gbk.

Валидация импортированных данных

На этом этапе вы научитесь валидировать данные, которые были импортированы в таблицу MySQL. Валидация данных представляет собой важный этап для обеспечения точности и целостности ваших данных. Мы рассмотрим некоторые базовые методы валидации с использованием SQL-запросов.

Сначала добавим в таблицу employees некоторые потенциально проблемные данные. Откройте терминал и используйте nano для создания файла:

nano ~/project/employees_validation.csv

Теперь вставьте следующие данные в файл employees_validation.csv. Обратите внимание, что последняя строка содержит некорректный формат электронной почты и отсутствует отдел:

3,Invalid,Email,invalid_email,Sales
4,Missing,Department,[email protected],

Нажмите Ctrl+X, затем Y, а затем Enter, чтобы сохранить файл.

Теперь импортируем эти данные в таблицу employees. Подключитесь к серверу MySQL:

mysql -u root -p

Если вас попросят ввести пароль, а вы его не устанавливали, просто нажмите Enter.

Выполните следующие SQL-инструкции в оболочке MySQL:

USE company;
LOAD DATA INFILE '/home/labex/project/employees_validation.csv'
INTO TABLE employees
CHARACTER SET utf8
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n';

Теперь, когда данные импортированы, выполним несколько проверок валидации.

1. Проверка на некорректный формат электронной почты:

Мы можем использовать регулярное выражение для проверки на некорректный формат электронной почты. Выполните следующий SQL-запрос:

SELECT * FROM employees WHERE email NOT LIKE '%@%.%';

Этот запрос вернет все строки, в которых столбец email не содержит символы @ и ., которые являются обязательными для корректного адреса электронной почты. В результате вы должны увидеть строку с invalid_email.

2. Проверка на отсутствие отдела:

Мы можем проверить на отсутствие отдела, ищем пустые строки в столбце department. Выполните следующий SQL-запрос:

SELECT * FROM employees WHERE department = '';

Этот запрос вернет все строки, в которых столбец department пуст. В результате вы должны увидеть строку с отсутствующим отделом.

3. Проверка на дубликаты идентификаторов:

Хотя в этом примере мы не ввели дубликаты идентификаторов, это распространенная проверка валидации. Вы можете использовать следующий запрос для поиска дубликатов идентификаторов:

SELECT id, COUNT(*) FROM employees GROUP BY id HAVING COUNT(*) > 1;

Этот запрос вернет все идентификаторы, которые встречаются более одного раза в таблице employees.

4. Проверка на несоответствие типов данных:

MySQL обычно обрабатывает несоответствия типов данных во время процесса импорта, но все же стоит проверить. Например, если у вас есть числовой столбец, который должен содержать только положительные значения, вы можете проверить на наличие отрицательных значений.

Это лишь несколько примеров того, как можно валидировать импортированные данные с использованием SQL-запросов. Конкретные проверки валидации, которые вам нужно выполнить, будут зависеть от структуры и содержания ваших данных.

Наконец, выйдите из оболочки MySQL:

exit

Резюме

В этом практическом занятии вы научились импортировать данные из CSV-файла в таблицу MySQL с использованием оператора LOAD DATA INFILE. Это включало создание CSV-файла (employees.csv) с данными о сотрудниках, подключение к серверу MySQL, создание базы данных (company) и таблицы (employees), а затем использование команды LOAD DATA INFILE для импорта данных. В команде указываются путь к файлу, имя таблицы, разделители полей и строк, а также количество строк для пропуска.

В практическом занятии также подчеркнута важность указания правильного пути к файлу и понимания различных клаузул в операторе LOAD DATA INFILE для успешного импорта данных.