MySQL零基础入门到实战:环境搭建、SQL核心语法与Python连接指南
这次我们来看一套完整的 MySQL 学习路径。对于想从零开始掌握数据库技术的开发者、数据分析师或运维人员来说,MySQL 是绕不开的核心技能。它不仅是众多互联网公司的首选数据库,也是学习 SQL 语言和关系型数据库原理的最佳实践入口。本文不空谈概念,直接聚焦于如何从零开始,高效、系统地掌握 MySQL,涵盖从环境搭建、核心语法到实战应用的完整闭环。
这套教程的核心在于“可执行”。我们将按照“先跑起来,再深入理解”的思路,带你完成 MySQL 的安装、基础操作、数据管理、复杂查询乃至与编程语言(如 Python)的交互。无论你是在 Windows、macOS 还是 Linux 环境下,都能找到对应的部署和操作指南。文章的重点是提供清晰的步骤、可复现的代码示例以及常见问题的排查方法,确保你看完就能动手,动手就能出结果。
接下来,我们会先快速了解 MySQL 的核心特性和学习路线图,然后一步步完成环境准备、数据库操作、SQL 语法精讲和实战应用。如果你关心如何快速搭建一个可用的 MySQL 学习环境,如何写出高效的查询语句,以及如何将数据库技能应用到实际项目中,这篇文章值得你收藏并跟着操作一遍。
1. 核心能力速览
在深入细节之前,我们先通过一个表格快速了解 MySQL 以及本教程涵盖的核心要点,帮助你判断是否适合继续深入学习。
| 能力项 | 说明 |
|---|---|
| 技术栈 | 关系型数据库管理系统 (RDBMS),使用标准 SQL 语言。 |
| 开源与许可 | 基于 GPL 开源许可,社区版可免费用于商业和个人项目。 |
| 核心功能 | 数据存储、事务处理、索引优化、用户权限管理、主从复制、高可用集群等。 |
| 适用场景 | Web 应用后端数据存储、数据分析与报表、内容管理系统 (CMS)、电商平台、日志记录等。 |
| 学习门槛 | 对初学者友好,SQL 语法直观。进阶涉及性能调优、架构设计,需要经验积累。 |
| 跨平台支持 | 支持 Windows、macOS、Linux 等多种操作系统。 |
| 编程语言支持 | 原生支持通过多种语言连接和操作,包括 PHP、Python、Java、C++、Perl 等。 |
| 本文实战内容 | 从安装配置、数据库/表操作、CRUD、复杂查询、数据类型、到 Python 连接 MySQL。 |
| 最终学习目标 | 能够独立设计数据库结构,编写高效 SQL,进行基本的数据管理和应用开发集成。 |
2. 适用人群与学习目标
本教程主要面向以下几类读者:
- 零基础的开发者:希望为后端开发、全栈开发补充数据库技能。
- 转行或入门的数据分析师:需要掌握 SQL 以进行数据提取、清洗和分析。
- 学生或自学者:计划系统学习一门实用且市场需求大的数据库技术。
- 运维人员:需要了解数据库基础,以便进行日常的维护和简单故障排查。
通过学习,你将能够达成以下目标:
- 环境搭建:在本地计算机上成功安装并启动 MySQL 服务。
- 基础操作:熟练使用命令行或图形化工具创建数据库、数据表。
- 数据操纵:掌握数据的增、删、改、查 (CRUD) 等核心操作。
- 复杂查询:运用聚合函数、分组、连接 (JOIN)、子查询等解决复杂数据检索问题。
- 理解数据类型:根据业务场景选择合适的数值、日期、字符串等数据类型。
- 初步应用集成:了解如何使用 Python 等编程语言连接并操作 MySQL 数据库。
3. 环境准备与安装指南
学习的第一步是拥有一个可运行的 MySQL 环境。我们提供三种主流操作系统的安装指引,并推荐一种无需本地安装的云端学习环境。
3.1 Windows 系统安装
对于 Windows 用户,最推荐的方式是下载官方 MySQL Installer,它提供了图形化安装界面,可以一并安装 MySQL Server、Workbench(图形化管理工具)等组件。
下载安装包: 访问 MySQL 官方网站的下载页面,选择 “MySQL Installer for Windows”。通常建议下载体积较大的完整安装包(如
mysql-installer-web-community-*.msi),它包含所有组件。运行安装程序:
- 运行下载的
.msi文件。 - 在安装类型(Choosing a Setup Type)中,对于学习者,选择
Developer Default即可,它会安装最常用的服务器和客户端工具。 - 跟随向导,在 “Check Requirements” 步骤安装必要的依赖(如 Visual C++ Redistributable)。
- 在 “Product Configuration” 阶段,为 MySQL Server 进行配置:
- 设置Root 账户密码,务必牢记。
- 选择默认的 “Standalone MySQL Server / Classic MySQL Replication” 配置类型。
- 其他设置如端口号(默认 3306)、Windows 服务名等可保持默认。
- 运行下载的
验证安装: 安装完成后,可以在开始菜单找到 “MySQL 8.0 Command Line Client” 或 “MySQL Shell”。打开命令行客户端,输入刚才设置的 root 密码。如果成功进入并显示
mysql>提示符,说明安装成功。
# 在 MySQL 命令行客户端中看到的成功登录提示 mysql>3.2 macOS 系统安装
macOS 用户可以通过 Homebrew 包管理器快速安装,这是最简洁高效的方式。
安装 Homebrew(如果尚未安装): 打开终端 (Terminal),执行以下命令:
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"使用 Homebrew 安装 MySQL: 在终端中执行以下命令:
brew install mysql启动 MySQL 服务: 安装完成后,使用以下命令启动服务:
brew services start mysql你可以使用
brew services list来查看 MySQL 服务状态。安全初始化与登录: 首次安装后,建议运行安全初始化脚本设置 root 密码:
mysql_secure_installation按照提示操作即可。之后,可以使用以下命令登录:
mysql -u root -p输入你设置的密码,进入
mysql>提示符。
3.3 Linux 系统安装 (以 Ubuntu/Debian 为例)
Linux 系统通常使用包管理器进行安装。
更新软件包列表:
sudo apt update安装 MySQL Server:
sudo apt install mysql-server -y启动并启用服务:
sudo systemctl start mysql sudo systemctl enable mysql运行安全初始化:
sudo mysql_secure_installation此脚本会引导你设置 root 密码、移除匿名用户、禁止 root 远程登录等,是重要的安全步骤。
登录 MySQL:
sudo mysql -u root -p输入你设置的密码即可。
3.4 备选方案:使用 GitHub Codespaces 或 Docker(免安装)
如果你不想在本地安装,或者环境配置总出问题,强烈推荐使用GitHub Codespaces或Docker来获得一个开箱即用的 MySQL 学习环境。
- GitHub Codespaces:在 GitHub 上创建一个包含
devcontainer.json配置文件的仓库,配置中指定 MySQL 镜像。Codespaces 会为你启动一个完整的云端开发容器,里面已经预装并运行了 MySQL,你可以通过终端直接连接使用。这是“白嫖”云端学习环境的绝佳方式。 - Docker:如果你本地有 Docker,一行命令即可启动一个 MySQL 实例:
之后通过docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:latestdocker exec进入容器使用 MySQL 客户端。
4. 数据库与表的基本操作
环境就绪后,我们开始最核心的操作:创建数据库 (Database) 和数据表 (Table)。
4.1 连接 MySQL 与基本命令
无论通过哪种方式安装,最终你都需要连接到 MySQL 服务器。最常用的工具是命令行客户端。
# 连接命令基本格式 mysql -h 主机名 -P 端口 -u 用户名 -p # 例如,连接本地默认端口的 root 用户 mysql -u root -p # 然后输入密码成功连接后,你会看到mysql>提示符。记住,在 MySQL 命令行中,每条 SQL 语句必须以分号;结尾,否则 MySQL 会认为语句没有结束,等待你继续输入。
4.2 Database 级别的操作
数据库是表的集合,是数据组织的最高层级。
-- 1. 查看当前服务器上有哪些数据库 SHOW DATABASES; -- 2. 创建一个新的数据库,名为 `my_learning_db` CREATE DATABASE my_learning_db; -- 3. 选择(使用)一个数据库,后续的操作都将在这个数据库上进行 USE my_learning_db; -- 4. 查看当前正在使用哪个数据库 SELECT DATABASE(); -- 5. 删除一个数据库(谨慎操作!数据将丢失) -- DROP DATABASE my_learning_db;关于 SQL 语句大小写:SQL 关键字(如CREATE,SELECT,USE)不区分大小写。但数据库名、表名、列名是否区分大小写取决于操作系统和 MySQL 的配置。为了一致性和可移植性,建议约定:SQL 关键字用大写,自定义的名称(数据库、表、列)用小写或蛇形命名法(如user_profile)。
4.3 Table 的创建与操作
表是实际存储数据的地方,由行(记录)和列(字段)组成。创建表时需要定义每个列的名称和数据类型。
-- 假设我们要创建一个 `employees` 员工表 CREATE TABLE employees ( id INT PRIMARY KEY AUTO_INCREMENT, -- 员工ID,主键,自动增长 name VARCHAR(100) NOT NULL, -- 姓名,可变长字符串,非空 department VARCHAR(50), -- 部门 salary DECIMAL(10, 2), -- 薪水,共10位,2位小数 hire_date DATE, -- 入职日期 email VARCHAR(100) UNIQUE -- 邮箱,唯一约束 ); -- 查看当前数据库中的所有表 SHOW TABLES; -- 查看某个表的结构(有哪些列,什么类型) DESCRIBE employees; -- 或使用缩写 DESC employees; -- 删除表(谨慎!) -- DROP TABLE employees;数据类型选择是关键:INT用于整数,VARCHAR(n)用于可变长度字符串,DECIMAL(m, n)用于精确小数,DATE用于日期。选择合适的数据类型能节省空间并提升性能。
5. 数据的增删改查 (CRUD)
CRUD 是数据库最基础、最频繁的操作,对应 Create(创建/插入)、Read(读取/查询)、Update(更新)、Delete(删除)。
5.1 插入数据 (INSERT)
-- 向 employees 表插入一条数据 INSERT INTO employees (name, department, salary, hire_date, email) VALUES ('张三', '技术部', 15000.00, '2023-05-10', 'zhangsan@example.com'); -- 插入多条数据 INSERT INTO employees (name, department, salary, hire_date, email) VALUES ('李四', '市场部', 12000.00, '2022-08-15', 'lisi@example.com'), ('王五', '技术部', 18000.00, '2021-03-22', 'wangwu@example.com'), ('赵六', '人事部', 10000.00, '2023-11-30', 'zhaoliu@example.com');5.2 查询数据 (SELECT)
SELECT是 SQL 中最强大、最常用的语句。
-- 1. 查询所有列的所有数据 SELECT * FROM employees; -- 2. 查询特定的列 SELECT name, department, salary FROM employees; -- 3. 使用 WHERE 子句进行条件过滤 SELECT * FROM employees WHERE department = '技术部'; SELECT * FROM employees WHERE salary > 13000; -- 4. 使用 AND/OR 组合多个条件 SELECT * FROM employees WHERE department = '技术部' AND salary > 16000; SELECT * FROM employees WHERE department = '市场部' OR department = '人事部'; -- 5. 使用 ORDER BY 对结果排序 SELECT * FROM employees ORDER BY salary DESC; -- 按薪水降序 SELECT * FROM employees ORDER BY hire_date ASC; -- 按入职日期升序(默认) -- 6. 使用 LIMIT 限制返回结果数量 SELECT * FROM employees ORDER BY salary DESC LIMIT 2; -- 查询薪水最高的前2名5.3 更新数据 (UPDATE)
-- 将李四的薪水更新为 13000 UPDATE employees SET salary = 13000.00 WHERE name = '李四'; -- 为技术部所有员工加薪 10% UPDATE employees SET salary = salary * 1.10 WHERE department = '技术部'; -- 注意:UPDATE 语句一定要有 WHERE 条件,否则会更新表中所有行!5.4 删除数据 (DELETE)
-- 删除姓名为赵六的记录 DELETE FROM employees WHERE name = '赵六'; -- 删除所有记录(清空表) -- DELETE FROM employees; -- 注意:DELETE 语句也一定要有 WHERE 条件!清空表更推荐使用 TRUNCATE TABLE employees;(更快且重置自增ID)6. SQL 进阶:数据处理与函数
掌握了 CRUD 后,我们需要更强大的工具来处理数据。
6.1 字符串处理函数
-- 假设我们有一个 `products` 表,其中 `product_name` 列值为 ‘Apple iPhone 15 Pro’ SELECT product_name, CONCAT('商品:', product_name) AS concat_str, -- 拼接字符串 LOWER(product_name) AS lower_case, -- 转小写 UPPER(product_name) AS upper_case, -- 转大写 SUBSTRING(product_name, 7, 6) AS sub_str, -- 从第7个字符开始取6个字符 (‘iPhone’) REPLACE(product_name, 'Apple', '苹果') AS replaced_str, -- 替换 CHAR_LENGTH(product_name) AS str_length -- 字符长度 FROM products;6.2 数据的聚合与分组 (GROUP BY)
聚合函数用于对一组值进行计算并返回单个值。
-- 常用的聚合函数 SELECT COUNT(*) AS total_employees, -- 统计总记录数 AVG(salary) AS average_salary, -- 计算平均薪水 MAX(salary) AS max_salary, -- 最高薪水 MIN(salary) AS min_salary, -- 最低薪水 SUM(salary) AS total_salary_expense -- 薪水总支出 FROM employees; -- 结合 GROUP BY 进行分组统计 SELECT department, COUNT(*) AS headcount, AVG(salary) AS avg_salary_in_dept FROM employees GROUP BY department; -- 按部门分组计算 -- 使用 HAVING 对分组后的结果进行过滤(WHERE 用于分组前过滤行,HAVING 用于分组后过滤组) SELECT department, AVG(salary) AS avg_salary FROM employees GROUP BY department HAVING AVG(salary) > 12000; -- 只显示平均薪水大于12000的部门6.3 结果排序与限制 (ORDER BY, LIMIT)
ORDER BY和LIMIT经常一起使用,用于获取“Top N”或“最新 N 条”数据。
-- 获取薪水最高的3名员工信息 SELECT name, department, salary FROM employees ORDER BY salary DESC LIMIT 3; -- 获取最早入职的2名员工 SELECT name, hire_date FROM employees ORDER BY hire_date ASC LIMIT 2;7. MySQL 数据类型精讲
为列选择正确的数据类型至关重要,它影响数据完整性、存储效率和查询性能。
7.1 数值类型
- 整数类型:
TINYINT,SMALLINT,MEDIUMINT,INT(或INTEGER),BIGINT。根据数值范围选择,INT是最常用的。CREATE TABLE numbers ( id INT PRIMARY KEY, small_num SMALLINT, big_num BIGINT ); - 定点数类型:
DECIMAL(M, D)。用于存储精确的小数,如货币金额。M是总位数,D是小数点后的位数。price DECIMAL(10, 2) -- 例如 99999999.99 - 浮点数类型:
FLOAT,DOUBLE。用于存储近似值,范围更大但可能有精度损失,适用于科学计算。
7.2 日期与时间类型
DATE:仅存储日期,格式 ‘YYYY-MM-DD’。TIME:仅存储时间,格式 ‘HH:MM:SS’。DATETIME:存储日期和时间,格式 ‘YYYY-MM-DD HH:MM:SS’。与时区无关。TIMESTAMP:存储时间戳(从 ‘1970-01-01 00:00:00’ UTC 开始的秒数)。与时区有关,存入和取出时会根据服务器时区转换。范围比DATETIME小。CREATE TABLE events ( event_id INT, event_date DATE, start_time TIME, created_at DATETIME DEFAULT CURRENT_TIMESTAMP, -- 默认当前时间 updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP -- 自动更新 );
7.3 字符串类型
CHAR(N):固定长度字符串,长度不足会补空格。适用于长度固定的数据(如国家代码、MD5哈希值)。查询速度略快。VARCHAR(N):可变长度字符串,最多存储 N 个字符。适用于长度变化大的数据(如用户名、地址)。最常用。TEXT:用于存储大文本数据,如文章内容。有TINYTEXT,TEXT,MEDIUMTEXT,LONGTEXT等变体。CREATE TABLE user_profiles ( username VARCHAR(50) UNIQUE, bio TEXT, country_code CHAR(2) );
8. 约束与表关系
约束用于保证数据的完整性和一致性。
8.1 常用约束
NOT NULL:该列不能存储 NULL 值。UNIQUE:该列每行的值必须唯一。PRIMARY KEY:主键,唯一标识表中的每一行。相当于NOT NULL和UNIQUE的结合。一个表只能有一个主键。FOREIGN KEY:外键,用于关联另一个表,保证引用完整性。DEFAULT:为该列设置默认值。AUTO_INCREMENT:自动递增,通常用于主键 ID。
CREATE TABLE orders ( order_id INT PRIMARY KEY AUTO_INCREMENT, customer_id INT NOT NULL, order_amount DECIMAL(10, 2) NOT NULL DEFAULT 0.00, order_date DATETIME DEFAULT CURRENT_TIMESTAMP, status VARCHAR(20) DEFAULT 'pending', UNIQUE KEY unique_order_per_customer (customer_id, order_date), -- 联合唯一约束 FOREIGN KEY (customer_id) REFERENCES customers(id) -- 外键约束,关联 customers 表 );8.2 表关系:JOIN 操作
实际应用中,数据分散在多个相关联的表中。JOIN用于根据相关列合并这些表。
假设有users表和orders表:
-- users 表 CREATE TABLE users ( id INT PRIMARY KEY, name VARCHAR(100) ); -- orders 表 CREATE TABLE orders ( id INT PRIMARY KEY, user_id INT, amount DECIMAL(10, 2), FOREIGN KEY (user_id) REFERENCES users(id) ); -- 插入示例数据 INSERT INTO users (id, name) VALUES (1, 'Alice'), (2, 'Bob'); INSERT INTO orders (id, user_id, amount) VALUES (101, 1, 99.99), (102, 1, 50.00), (103, 3, 25.00); -- 注意 user_id=3 在 users 表中不存在 -- INNER JOIN (内连接):只返回两个表中匹配的行 SELECT users.name, orders.id, orders.amount FROM users INNER JOIN orders ON users.id = orders.user_id; -- 结果:Alice 的两条订单。Bob 和 user_id=3 的订单不会出现。 -- LEFT JOIN (左连接):返回左表 (users) 的所有行,即使右表 (orders) 中没有匹配。 SELECT users.name, orders.id, orders.amount FROM users LEFT JOIN orders ON users.id = orders.user_id; -- 结果:Alice 的两条订单,Bob 的订单信息为 NULL。 -- RIGHT JOIN (右连接):返回右表 (orders) 的所有行,即使左表 (users) 中没有匹配。 SELECT users.name, orders.id, orders.amount FROM users RIGHT JOIN orders ON users.id = orders.user_id; -- 结果:Alice 的两条订单,以及 user_id=3 的订单(用户名为 NULL)。9. 使用 Python 连接与操作 MySQL
将 MySQL 与编程语言结合是实际开发的必备技能。这里以 Python 为例,使用mysql-connector-python库。
9.1 安装连接器
pip install mysql-connector-python9.2 基础连接与操作示例
import mysql.connector from mysql.connector import Error def connect_and_query(): try: # 1. 建立连接 connection = mysql.connector.connect( host='localhost', # 数据库主机地址 user='root', # 用户名 password='your_password', # 密码 database='my_learning_db' # 要连接的数据库名 ) if connection.is_connected(): print("成功连接到 MySQL 数据库") # 2. 创建游标对象,用于执行 SQL cursor = connection.cursor() # 3. 执行查询 cursor.execute("SELECT * FROM employees") records = cursor.fetchall() # 获取所有结果 print("员工列表:") for row in records: print(row) # 4. 执行插入 insert_query = """ INSERT INTO employees (name, department, salary, hire_date, email) VALUES (%s, %s, %s, %s, %s) """ data = ('孙七', '财务部', 11000.00, '2024-01-15', 'sunqi@example.com') cursor.execute(insert_query, data) connection.commit() # 提交事务,使插入生效 print("插入成功,受影响行数:", cursor.rowcount) except Error as e: print(f"数据库操作错误: {e}") finally: # 5. 关闭连接 if connection.is_connected(): cursor.close() connection.close() print("MySQL 连接已关闭") if __name__ == "__main__": connect_and_query()关键点:
- 使用参数化查询 (
%s占位符) 来防止 SQL 注入攻击。 - 执行
INSERT,UPDATE,DELETE后,必须调用connection.commit()提交事务。 - 务必在
finally块或使用with语句关闭游标和连接,释放资源。
10. 常见问题与排查方法
在学习和使用 MySQL 过程中,你可能会遇到以下问题:
| 问题现象 | 可能原因 | 排查方式 | 解决方案 |
|---|---|---|---|
| 连接被拒绝 (Access denied) | 用户名或密码错误;用户无权限从该主机连接。 | 检查连接字符串中的用户名、密码、主机名。登录后执行SELECT USER();和SHOW GRANTS;。 | 使用正确的凭据。或用 root 登录后为用户授权:GRANT ALL ON database.* TO 'username'@'host'; FLUSH PRIVILEGES; |
| 无法连接到本地服务器 (Can’t connect to MySQL server) | MySQL 服务未启动;端口被占用或防火墙阻止。 | 检查服务状态 (sudo systemctl status mysql或 Windows 服务管理器)。用 `netstat -an | grep 3306` 查看端口。 |
| 执行 SQL 文件报错 | 文件编码问题;SQL 语法错误;未选择数据库。 | 在命令行使用source命令或mysql -u root -p database_name < file.sql导入。查看具体错误信息。 | 确保 SQL 文件是 UTF-8 编码。在导入前用USE database_name;选择数据库。逐段检查 SQL 语法。 |
| 插入中文数据变成乱码 | 数据库、表或连接的字符集不兼容。 | 执行SHOW VARIABLES LIKE 'character_set%';和SHOW CREATE TABLE your_table;查看字符集。 | 创建数据库/表时指定字符集:CREATE DATABASE db_name CHARACTER SET utf8mb4;。连接时设置字符集:在连接字符串或启动后执行SET NAMES 'utf8mb4';。 |
| ERROR 1054: Unknown column | 查询中引用了不存在的列名。 | 仔细检查 SQL 语句中的列名拼写。使用DESC table_name;确认表结构。 | 修正列名。注意大小写敏感性(取决于系统配置)。 |
| 执行缓慢 | 表数据量大且无索引;查询语句未优化;服务器负载高。 | 使用EXPLAIN分析查询语句:EXPLAIN SELECT * FROM ...。查看慢查询日志。 | 为WHERE,JOIN,ORDER BY涉及的列创建索引。优化查询逻辑,避免SELECT *。分析服务器资源。 |
| 忘记 root 密码 | 安装后未记录或密码遗失。 | - | Linux/macOS: 停止服务,以安全模式启动mysqld_safe --skip-grant-tables &,然后无密码登录修改。Windows: 通过服务管理器停止服务,在配置文件中添加skip-grant-tables,重启服务后修改。完成后务必移除该配置并重启。 |
11. 最佳实践与学习建议
- 动手实践:数据库是实践性极强的技能。务必在本地或云端搭建环境,对每一个 SQL 语句都亲自敲一遍,观察结果。
- 理解而非死记:理解数据库、表、行、列、主键、外键、索引这些核心概念,比死记 SQL 语法更重要。
- 善用官方文档:MySQL 官方文档是终极参考。遇到不熟悉的函数或语法,第一时间查阅。
- 从简单到复杂:先掌握单表的 CRUD,再学习多表连接 (JOIN),最后研究子查询、事务、存储过程等高级特性。
- 注重数据安全:
- 永远不要在生产环境使用弱密码或默认密码。
- 应用程序连接数据库时,使用权限最低的专用用户,而非 root。
- 对用户输入进行严格的验证和转义,或使用参数化查询,防止 SQL 注入。
- 管理你的学习资料:将常用的 SQL 语句、配置步骤、问题解决方案整理成笔记或 Cheatsheet(速查表),方便日后回顾。
- 项目驱动学习:尝试用 MySQL 为一个小型个人项目(如博客系统、记账工具)设计数据库,这是检验和巩固知识的最佳方式。
MySQL 的学习曲线前期平缓,后期在性能优化和高可用架构方面会变得陡峭。但只要你扎实掌握了本文涵盖的基础和核心操作,就已经具备了解决绝大多数日常数据存储和处理任务的能力,并能以此为基石,向更专业的数据库开发或管理方向迈进。建议你将本文作为操作手册,在遇到具体问题时回来查阅相关章节,边用边学,效果最佳。
