介绍
在本实验中,你将学习在 MySQL 数据库中导入和导出数据的基本技能。你将练习使用 LOAD DATA INFILE 命令将数据从 CSV (Comma-Separated Values) 文件加载到表中,这是一种快速高效的大批量数据插入方法。
你还将学习相反的过程:将数据从表中导出到新的 CSV 文件。此外,本实验还涵盖了在导入后执行基本数据验证检查以确保数据质量。完成本实验后,你将熟练掌握数据在 MySQL 中的进出操作。
在本实验中,你将学习在 MySQL 数据库中导入和导出数据的基本技能。你将练习使用 LOAD DATA INFILE 命令将数据从 CSV (Comma-Separated Values) 文件加载到表中,这是一种快速高效的大批量数据插入方法。
你还将学习相反的过程:将数据从表中导出到新的 CSV 文件。此外,本实验还涵盖了在导入后执行基本数据验证检查以确保数据质量。完成本实验后,你将熟练掌握数据在 MySQL 中的进出操作。
在导入数据之前,你需要一个目的地。这包括创建一个数据库来存放你的数据,以及创建一个结构与你打算导入的数据相匹配的表。
首先,从你的桌面打开终端。
以 root 用户连接到 MySQL 服务器。在此实验环境中,你可以使用 sudo 来连接而无需密码。
sudo mysql -u root
连接成功后,你将看到 MySQL 提示符 (mysql>),这表明你现在正在直接与数据库服务器进行交互。
接下来,创建一个名为 company 的新数据库。IF NOT EXISTS 子句是一个好习惯,可以防止在数据库已创建的情况下出现错误。
CREATE DATABASE IF NOT EXISTS company;
现在,切换到你新创建的数据库,以便所有后续命令都应用于它。
USE company;
最后,创建一个名为 employees 的表来存储员工数据。表的结构必须与你稍后要导入的 CSV 文件中的列相匹配。
CREATE TABLE IF NOT EXISTS employees (
id INT PRIMARY KEY,
first_name VARCHAR(50),
last_name VARCHAR(50),
email VARCHAR(100),
department VARCHAR(50)
);
INT PRIMARY KEY: 将 id 列定义为整数类型和主键,这意味着每个值都必须是唯一的。VARCHAR(50): 定义一个可以存储最多 50 个字符的可变长度字符串的列。你可以通过运行以下命令来验证表是否已成功创建:
SHOW TABLES;
你应该会在输出中看到 employees 表。
+-------------------+
| Tables_in_company |
+-------------------+
| employees |
+-------------------+
1 row in set (0.00 sec)
保持 MySQL shell 打开,因为你将在下一步继续使用它。
数据库和表准备就绪后,你就可以从外部文件导入数据了。LOAD DATA INFILE 语句是从文本文件批量加载数据到表中的一种非常高效的方式。
本实验的设置脚本已在 /tmp 目录下创建了一个名为 employees.csv 的文件。导入之前,检查文件内容是一个好习惯。
重要提示: 你需要为这个命令打开一个新的终端标签页,因为你当前的终端正在运行 MySQL shell。点击终端窗口中的 + 图标来打开一个新的标签页。在新终端中,运行:
cat /tmp/employees.csv
输出显示了四行逗号分隔的数据:
1,John,Doe,john.doe@example.com,Sales
2,Jane,Smith,jane.smith@example.com,Marketing
3,Peter,Jones,peter.jones@example.com,Engineering
4,Mary,Brown,mary.brown@example.com,HR
现在,切换回带有 MySQL shell (mysql>) 的原始终端标签页。使用 LOAD DATA INFILE 命令导入文件。
LOAD DATA INFILE '/tmp/employees.csv'
INTO TABLE employees
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n';
让我们分解一下这个命令:
LOAD DATA INFILE '/tmp/employees.csv': 指定源文件的完整绝对路径。INTO TABLE employees: 指定数据目标表。FIELDS TERMINATED BY ',': 告知 MySQL 逗号分隔了每行中的数据字段(列)。LINES TERMINATED BY '\n': 告知 MySQL 文件中的每一新行代表一个新行。命令执行后,MySQL 将报告导入的行数。要验证导入是否成功,请查询表以查看其内容。
SELECT * FROM employees;
输出应该显示 CSV 文件中的四条记录,这些记录现在已存储在你的 employees 表中。
+----+------------+-----------+---------------------------+-------------+
| id | first_name | last_name | email | department |
+----+------------+-----------+---------------------------+-------------+
| 1 | John | Doe | john.doe@example.com | Sales |
| 2 | Jane | Smith | jane.smith@example.com | Marketing |
| 3 | Peter | Jones | peter.jones@example.com | Engineering |
| 4 | Mary | Brown | mary.brown@example.com | HR |
+----+------------+-----------+---------------------------+-------------+
4 rows in set (0.00 sec)
导出数据与导入数据同样重要。你可能需要创建报告、与其他系统共享数据,或者在电子表格程序中进行分析。SELECT ... INTO OUTFILE 语句允许你将任何查询的结果直接保存到文件中。
首先,让我们在 MySQL shell 中向表中添加另外两名员工。
INSERT INTO employees (id, first_name, last_name, email, department) VALUES
(5, 'Alice', 'Johnson', 'alice.johnson@example.com', 'Sales'),
(6, 'Bob', 'Williams', 'bob.williams@example.com', 'Marketing');
现在,将整个 employees 表导出到一个名为 employees_export.csv 的新文件中。首先,确保你仍在正确的数据库中:
SELECT id, first_name, last_name, email, department
FROM company.employees
INTO OUTFILE '/tmp/employees_export.csv'
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n';
SELECT ...: 这是一个标准的查询,用于指定要导出的数据。INTO OUTFILE '/tmp/employees_export.csv': 指定输出文件的完整路径。出于安全考虑,MySQL 要求此文件尚不存在。FIELDS TERMINATED BY ',': 使用逗号分隔字段。ENCLOSED BY '"': 将每个字段值用双引号括起来,这是一种常见的 CSV 格式。LINES TERMINATED BY '\n': 在每行末尾添加一个换行符。运行命令后,切换到你的另一个终端标签页(或打开一个新的)并查看新创建文件的内容。
cat /tmp/employees_export.csv
你将看到表中所有六行数据,格式为 CSV 文件。
"1","John","Doe","john.doe@example.com","Sales"
"2","Jane","Smith","jane.smith@example.com","Marketing"
"3","Peter","Jones","peter.jones@example.com","Engineering"
"4","Mary","Brown","mary.brown@example.com","HR"
"5","Alice","Johnson","alice.johnson@example.com","Sales"
"6","Bob","Williams","bob.williams@example.com","Marketing"
导入数据后,验证数据以确保其质量和完整性至关重要。现实世界中的数据通常很混乱,包含错误、缺失值或不正确的格式。本步骤将向你展示如何使用简单的 SQL 查询来查找常见问题。
设置脚本创建了 employees_validation.csv,其中包含一个无效的电子邮件和一个缺失的部门值。首先,在你的 MySQL shell 中清空 employees 表。
TRUNCATE TABLE employees;
现在,导入验证文件。
LOAD DATA INFILE '/tmp/employees_validation.csv'
INTO TABLE employees
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n';
加载了“脏”数据后,让我们运行一些验证检查。
1. 查找无效的电子邮件格式
一个非常基础的有效电子邮件检查是看它是否包含 @ 符号和 . 符号。我们可以使用 NOT LIKE 来查找不符合此检查的行。
SELECT * FROM employees WHERE email NOT LIKE '%@%.%';
此查询将找到电子邮件为 invalid_email 的行,因为它缺少必需的符号。
+----+------------+-----------+---------------+------------+
| id | first_name | last_name | email | department |
+----+------------+-----------+---------------+------------+
| 3 | Invalid | Email | invalid_email | Sales |
+----+------------+-----------+---------------+------------+
1 row in set (0.00 sec)
2. 查找缺失的部门
你可以通过检查空字符串 '' 来查找值缺失的行。
SELECT * FROM employees WHERE department = '';
此查询将找到 CSV 文件中部门留空的行。
+----+------------+------------+--------------------------------+------------+
| id | first_name | last_name | email | department |
+----+------------+------------+--------------------------------+------------+
| 4 | Missing | Department | missing.department@example.com | |
+----+------------+------------+--------------------------------+------------+
1 row in set (0.00 sec)
这些简单的查询是进行初步数据质量检查的强大工具。在识别出有问题的行之后,你可以决定是使用 UPDATE 语句修复它们,还是使用 DELETE 删除它们。
你现在已完成本实验。你可以退出 MySQL shell。
exit
在本实验中,你学习了将数据导入和导出 MySQL 数据库的基础操作。你首先通过创建一个新的数据库和表来设置一个合适的数据库环境。然后,你使用了 LOAD DATA INFILE 命令从 CSV 文件高效地导入数据。
接下来,你练习了使用 SELECT ... INTO OUTFILE 语句将数据从表导出到新的 CSV 文件,这是用于报告和数据共享的常见任务。最后,你学习了如何使用 SQL 查询执行基本的数据验证,以检查导入后的格式错误和缺失值。这些技能对于任何使用 MySQL 的开发者或管理员来说都是必不可少的。