跳至主要内容

MySQL 教程:初学者全面指南

了解什么是 MySQL,以及如何在最受欢迎的数据库管理系统之一中入门。
· 15分钟 阅读

使用 AI 探索

数据是我们日益数字化社会的基石。从移动应用和银行系统到搜索引擎和下一代 AI 聊天机器人(如 ChatGPT),如果没有数据,这些工具都无法实现。您是否想过,这些数据都存储在哪里?答案正是:数据库。

数据库是结构化数据的有序集合,通常存储在计算机系统中。全球很大一部分数据都存储在关系型数据库中。

在本教程中,我们将聚焦 MySQL,这是一种流行的关系型数据库管理系统(RDBMS)。在 Oracle 的支持下,MySQL 是一款开源、可靠、可扩展且用户友好的数据库,被科技领域一些最重要的公司使用,包括 Meta、Netflix 和 Airbnb。

读完本文后,您将可以开始使用这一成熟且广受欢迎的工具:从在您的计算机上安装并创建数据库,到执行基本的 SQL 查询以及更高级的操作。准备好迎接挑战了吗?让我们开始吧!

先决条件与基础概念

数据库有许多类型,各自适合存储不同类型的数据。近年来,为应对数据格式日益多样化的趋势,出现了新型数据库。尽管所谓的 NoSQL 数据库兴起,关系型数据库仍是最受欢迎的数据库类型。

关系型数据库旨在以预定义的行和列构成的表集合来存储数据,并通过一个或多个关系将这些表连接起来。

创建、管理并与数据库交互的标准方式是 SQL(结构化查询语言)。SQL 是市场上一些最受欢迎系统的基石,包括 PostgreSQL、SQLite 和 MySQL。

为便于跟进本教程,我们建议您具备 SQL 的基础理解。一个很好的起点是我们的SQL 入门课程。您还需要在计算机上安装 MySQL,下面我们来介绍 MySQL 的安装方法。

设置 MySQL

安装这个工具的过程很简单。您只需根据计算机的操作系统,前往官方网站下载相应的安装程序,不论是 macOS、Windows 还是 Linux。

在 macOS 上安装

下载 MySQL 的安装包后,按照安装向导的说明进行操作。您可以选择标准安装,也可以单击“Customize”按钮自定义要安装的组件。

MySQL Package Installer Wizard: Customize.

MySQL 安装包向导:自定义。来源:MySQL

成功安装新的 MySQL 服务器后,请完成配置步骤:选择密码的默认加密类型、设置 root 密码,并启用(或禁用)开机启动 MySQL 服务器。

使用安装包安装时,文件会被安装到 /usr/local 下与安装版本和平台名称相匹配的目录中。

在 Windows 上安装

在 Windows 中安装 MySQL 十分直接。推荐的方法是下载 Windows Installer,让它安装并配置特定版本的 MySQL。如果您使用默认安装,Windows 将自动以本地主机方式启动 MySQL。

在 Linux 上安装

Linux 支持多种安装 MySQL 的解决方案。MySQL 建议您使用 Oracle 提供的发行版本,其提供多种可用的安装方法,详见文档。

理解 MySQL

在开始使用 MySQL 之前,值得先了解它的工作方式。让我们来分析一些核心概念。

MySQL 架构

与许多其他流行的关系型数据库一样,MySQL 采用客户端-服务器架构设计。

在这种计算模型下,服务器用于托管数据、管理数据库权限和配置,并处理大部分由客户端发起的资源和服务请求。

在最常见的客户端-服务器架构中,通常有一个集中式服务器和多个客户端。任何计算机在被设置为提供服务后都可以充当服务器。但服务器通常是性能强大、体量较大的机器,因为它们更适合处理大量请求和数据。

相较之下,客户端可以位于任何类型的计算机上。

Client-server architecture.

客户端-服务器架构。来源:DataCamp

在 MySQL 中,这两个组件分别是 MySQL 客户端和 MySQL 服务器。

数据类型

数据类型用于确定某一列可以存储的值。这是一种元数据,帮助 SQL 理解每一列期望的数据类型,以及如何针对特定列处理查询。

MySQL 支持三大类常见的 SQL 数据类型:

  • 数值类型
  • 字符串类型
  • 日期与时间类型

下表概览了 MySQL 中的主要数据类型。

数值数据类型

数据类型

描述

TINYINT

非常小的整数。

SMALLINT

小整数。

MEDIUMINT

中等大小的整数。

INT 或 INTEGER

标准整数。

BIGINT

大整数。

FLOAT

单精度浮点数。

DOUBLE

双精度浮点数。

DECIMAL 或 NUMERIC

定点数。

日期与时间数据类型

数据类型

描述

DATE

YYYY-MM-DD 格式的日期值。

TIME

HH:MM:SS 格式的时间值。

DATETIME

YYYY-MM-DD HH:MM:SS 格式的日期与时间值。

TIMESTAMP

YYYY-MM-DD HH:MM:SS 格式的时间戳值。

YEAR

YYYY 或 YY 格式的年份值。

字符串数据类型

数据类型

描述

CHAR

定长字符串。

VARCHAR

变长字符串。

TINYTEXT

非常小的文本字符串。

TEXT

较小的文本字符串。

MEDIUMTEXT

中等大小的文本字符串。

LONGTEXT

较大的文本字符串。

ENUM

只能从预定义值列表中选择一个值的字符串对象。

SET

可从预定义值列表中选择零个或多个值的字符串对象。

访问 MySQL

在您的计算机上安装 MySQL 后,您可以从终端开始使用它。要启动 MySQL,您可以使用用户名及其关联的密码进行访问。在此示例中,我们将使用 root 账户以及安装过程中设置的 root 密码访问 MySQL。由于我们在运行 MySQL 的同一台机器上登录,因此无需在主机(-h)参数中提供信息:

> mysql -uroot -p

如果您想添加新用户,请输入:

> CREATE USER 'username' IDENTIFIED BY 'password';

创建新用户后,您可以使用此命令进入 MySQL,随后将显示一条欢迎信息,并出现 mysql> 提示符:

> mysql -u username -p 
Welcome to the MySQL monitor.  Commands end with; or \g.
Your MySQL connection id is 25
Server version: 8.1.0 MySQL Community Server - GPL

Copyright (c) 2000, 2023, 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>

如何创建 MySQL 数据库

创建数据库

现在是时候在 MySQL 中创建您的第一个数据库了。在本教程中,我们将创建一个名为“datacamp_courses”的数据库,其中包含一些 DataCamp 课程的信息。该数据库在本地托管。

要创建数据库,请使用以下命令:

mysql> CREATE DATABASE datacamp_courses;

要检查数据库是否已创建,请输入以下命令,将显示包含所有可用数据库的表:

mysql> SHOW databases;
+--------------------+
| Database           |
+--------------------+
| datacamp_courses   |
| mysql              |
+--------------------+
5 rows in set (0,00 sec)

现在,您可以准备访问这个全新的数据库了。

mysql> USE datacamp_courses;
Database changed

创建表

到目前为止,您已经创建了第一个数据库。但它仍然是空的。接下来,我们将创建数据库中的第一张表。我们将创建一张名为“courses”的表,包含 DataCamp 课程目录中若干课程的信息。

现在是在“datacamp_courses”数据库中创建您的第一张表的时刻。我们希望创建一张包含DataCamp 课程目录中部分课程信息的表。

该表的主键应为 course_id(注意仅此处为加粗说明),其数据类型为整数。主键是一种约束,要求该列的值非空且唯一。它使您能够唯一标识表中的某个实例或一组实例。

其余列提供有关课程名称、授课讲师、课程技术方向和 URL 的信息。

要创建“datatacamp_courses”数据库中的第一张表,请使用以下命令:

mysql> CREATE TABLE courses (
  course_id int NOT NULL,
  course_name varchar(250) NOT NULL,
  instructor_name varchar(250) NOT NULL,
  technology varchar(50) NOT NULL,
  topic varchar(50) NOT NULL,
  PRIMARY KEY (course_id)
);

基本 SQL 查询

您已经拥有第一个数据库和第一张表。太好了!现在是时候向表中添加一些数据。

让我们使用 INSERT 语句添加几行在我们目录中颇受欢迎的课程。下面的代码将实现这一点。

INSERT INTO 
    courses (course_id, course_name, instructor_name, technology, topic) VALUES 
    (1, 'Introduction to SQL', 'Izzy Weber', 'SQL','Data Manipulation'), 
    (2, 'Database Design', 'Lis Sulmont', 'SQL', 'Data Engineering'), 
    (3, 'Data Manipulation with pandas', 'Richie Cotton', 'R','Programming'),
    (4, 'Generative AI Concepts', 'Daniel Tedesco', 'Theory', 'AI & Machine Learning');

为检查这些行是否已正确添加,让我们使用 SELECT 语句查看表中的所有行:

SELECT * FROM courses;
+-----------+-------------------------------+-----------------+------------+-----------------------+
| course_id | course_name                   | instructor_name | technology | topic                 |
+-----------+-------------------------------+-----------------+------------+-----------------------+
|         1 | Introduction to SQL           | Izzy Weber      | SQL        | Data Manipulation     |
|         2 | Database Design               | Lis Sulmont     | SQL        | Data Engineering      |
|         3 | Data Manipulation with pandas | Richie Cotton   | R          | Programming           |
|         4 | Generative AI Concepts        | Daniel Tedesco  | Theory     | AI & Machine Learning |
+-----------+-------------------------------+-----------------+------------+-----------------------+
4 rows in set (0,00 sec)

您可能已经注意到,我们刚刚添加的数据中存在一个错误。Data Manipulation with pandas 课程的技术方向应为 Python,而不是 R。让我们使用 UPDATE 语句并结合 WHERE 子句来指定要更新的行,修复这个错误。

UPDATE courses SET technology = 'Python' WHERE course_id = 3;
SELECT * FROM courses;
+-----------+-------------------------------+-----------------+------------+-----------------------+
| course_id | course_name                   | instructor_name | technology | topic                 |
+-----------+-------------------------------+-----------------+------------+-----------------------+
|         1 | Introduction to SQL           | Izzy Weber      | SQL        | Data Manipulation     |
|         2 | Database Design               | Lis Sulmont     | SQL        | Data Engineering      |
|         3 | Data Manipulation with pandas | Richie Cotton   | Python     | Programming           |
|         4 | Generative AI Concepts        | Daniel Tedesco  | Theory     | AI & Machine Learning |
+-----------+-------------------------------+-----------------+------------+-----------------------+
4 rows in set (0,00 sec)

最后,您可能希望删除表中的某条记录。比如,让我们删除课程 Generative AI Concepts:

DELETE from courses WHERE course_name = 'Generative AI Concepts';
SELECT * FROM courses;
+-----------+-------------------------------+-----------------+------------+-------------------+
| course_id | course_name                   | instructor_name | technology | topic             |
+-----------+-------------------------------+-----------------+------------+-------------------+
|         1 | Introduction to SQL           | Izzy Weber      | SQL        | Data Manipulation |
|         2 | Database Design               | Lis Sulmont     | SQL        | Data Engineering  |
|         3 | Data Manipulation with pandas | Richie Cotton   | Python     | Programming       |
+-----------+-------------------------------+-----------------+------------+-------------------+
3 rows in set (0,00 sec)

进阶主题

索引

默认情况下,当 MySQL 需要查找某些行时,会从第一行开始,按从头到尾的顺序读取。当您的数据库拥有数百万行时,这种行为可能会带来问题,因为过程会非常缓慢。

加速 MySQL 在表中查找行的一个好方法是创建索引。索引是您表中某个组件的结构,MySQL 使用它来更快地检索具有特定列的行。

让我们在课程表中为“course_id”列创建一个名为“idx_course”的索引。

CREATE INDEX idx_course
ON courses (course_id);

连接(Join)

到目前为止,我们只使用了课程表。但当您同时使用多张表时,才能真正发挥关系型数据库(如 MySQL)的全部潜力。

用于组合多张表的“魔法工具”就是 JOIN 操作。假设我们的数据库中还有第二张名为“instructors”的表,包含 DataCamp 课程讲师的基本信息。以下脚本将创建该表并添加一些(虚构的)记录:

mysql> CREATE TABLE instructors (
  instructor_id int NOT NULL,
  instructor_name varchar(250) NOT NULL,
  role varchar(500) NOT NULL,
  number_courses int NOT NULL,
  PRIMARY KEY (instructor_id)
);
INSERT INTO 
    instructors (instructor_id, instructor_name, role, number_courses) VALUES 
    (1, 'Lis Sulmont', 'Data Scientist', 4),
    (2, 'Daniel Tedesco', 'Business Analyst', 1),
    (3, 'Richie Cotton', 'Data Evangelist',5),
    (4, 'Izzy Weber', 'Data Engineer', 2), 
    (5, 'James Chapman', 'Data Analyst',3);

假设您希望合并这两张表,以获取课程信息以及与讲师相关的数据。我们将使用 INNER JOIN,只获取出现在课程表中的课程信息。用于连接的公共列是“instructor_name”。

mysql> SELECT * FROM courses
    -> INNER JOIN instructors
    -> ON courses.instructor_name = instructors.instructor_name;
+-----------+-------------------------------+-----------------+------------+-------------------+---------------+-----------------+-----------------+----------------+
| course_id | course_name                   | instructor_name | technology | topic             | instructor_id | instructor_name | role            | number_courses |
+-----------+-------------------------------+-----------------+------------+-------------------+---------------+-----------------+-----------------+----------------+
|         2 | Database Design               | Lis Sulmont     | SQL        | Data Engineering  |             1 | Lis Sulmont     | Data Scientist  |              4 |
|         3 | Data Manipulation with pandas | Richie Cotton   | Python     | Programming       |             3 | Richie Cotton   | Data Evangelist |              5 |
|         1 | Introduction to SQL           | Izzy Weber      | SQL        | Data Manipulation |             4 | Izzy Weber      | Data Engineer   |              2 |
+-----------+-------------------------------+-----------------+------------+-------------------+---------------+-----------------+-----------------+----------------+
3 rows in set (0,00 sec)

这只是其中一种连接方式,根据您的用例,还有其他同样有用的连接类型。我们的SQL 中的数据连接课程和JOIN 速查表将帮助您入门。

MySQL 最佳实践

安全措施

现代数据库可以存储包含数百万行的表。由于数据体量庞大,且大量应用基于这些数据,保障其安全至关重要。

数据库面临的常见风险包括访问管理不当、弱密码以及 SQL 注入。为应对这些威胁与薄弱环节,可以实施多种策略与措施,包括根据用户配置访问权限、在 SQL 服务器中构建触发器以及部署加密方法。学习 SQL 安全的一个很好的起点是我们的数据库设计课程。

性能优化

随着您在 SQL 编码旅程中不断进步,您会逐渐意识到性能的重要性。一条 SQL 查询可以有不同的写法,它们都能运行,但有些更高效。

有许多策略和技巧可以帮助您提升 SQL 代码的性能,包括子查询以及 WHERE、HAVING、DISTINCT 等 SQL 子句。

但高效不仅是技术问题,也关乎规范与可读性。只需在 SQL 书写方式上做出一些小改动,例如使用别名与注释,您就能带来显著改观,这将帮助您和您的团队成员。

想进一步了解 SQL 性能优化?请查看我们的SQL Server 查询性能优化课程

结语

恭喜您读完本篇 MySQL 教程。我们希望您喜欢这次对 MySQL 及其功能的入门介绍。如果您对数据库管理感兴趣,学习 MySQL 是明智之选。

但这只是您旅程的开始。如果您想进一步学习 MySQL 和更广泛的 SQL,Datacamp 可以满足您的需求。以下是一些可帮助您入门的资源:

Javier Canales Luna

作者

Javier Canales Luna

我是一名自由职业的数据分析师,与全球各地的公司和组织合作开展数据科学项目。我也担任数据科学讲师,拥有2年以上授课经验。我经常用英语和西班牙语撰写与数据科学相关的文章,其中一些已发表在 DataCamp、Towards Data Science 和 Analytics Vidhya 等知名网站上。作为一名具有政治学与法律背景的数据科学家,我的目标是在公共政策、法律与技术的交汇处开展工作,借助思想的力量推动创新解决方案与叙事,帮助我们应对紧迫挑战,尤其是气候危机。我认为自己是自学成才、不断进步的人,坚定支持跨学科合作。学习新事物永远不嫌晚。

主题