MySQL 数据库入门教程:从零开始成为数据库小能手
目录
-
(图片来源网络,侵删)- 什么是数据库?
- 什么是MySQL?
- 为什么学习MySQL?
- 数据库的几个核心概念
-
- 安装MySQL
- 安装图形化管理工具(推荐:MySQL Workbench)
- 连接到你的MySQL服务器
-
- 什么是SQL?
- SQL的分类(DDL, DML, DQL, DCL)
- 数据库操作
- 表操作
-
- CRUD:创建数据
- Read:查询数据
- Update:更新数据
- Delete:删除数据
-
(图片来源网络,侵删)- 条件查询
- 排序
- 聚合函数
- 分组查询
- 多表查询(JOIN)
-
- 常见数据类型
- 常见约束
-
- 什么是索引?
- 为什么要用索引?
- 如何创建索引?
-
- 回顾
- 下一步该学什么?
第一部分:初识数据库
什么是数据库?
想象一下你的手机通讯录,你可以在里面添加、修改、删除和查找联系人,这个通讯录就是一个最简单的“数据库”,它是一个有组织地、可共享地、统一管理的数据集合。

在计算机中,数据库就是长期储存在计算机内、有组织的、可共享的大量数据的集合,数据库管理系统(DBMS,Database Management System)是用于管理数据库的软件,比如MySQL、Oracle、SQL Server等。
什么是MySQL?
MySQL 是目前最流行的关系型数据库管理系统之一,它使用结构化查询语言进行数据管理,MySQL 是开源的、免费的(社区版),性能出色,因此被广泛应用于网站后端(如WordPress, Facebook, Twitter等)。
为什么学习MySQL?
- 行业需求:Web开发、数据分析、后端工程师等岗位的必备技能。
- 数据存储:几乎所有应用程序都需要存储数据,而数据库是标准解决方案。
- 学习基础:理解数据如何被组织和管理,是学习更高级技术(如大数据、人工智能)的基础。
数据库的几个核心概念
- 数据库:一个存储数据的容器,可以包含多个表。
- 表:数据库中存储具体数据的结构化集合,由行和列组成。
- 行:表中的一条记录,代表一个完整的数据实体,用户表中的一行代表一个用户。
- 列:表中的一个字段,定义了数据的属性,用户表中的
name列代表用户的姓名。 - 主键:表中唯一标识每一行记录的列,主键的值必须是唯一的,不能为空。
第二部分:环境搭建
安装MySQL
根据你的操作系统选择对应的安装包进行安装:
- Windows: 访问 MySQL 官网下载页面,下载 MySQL Installer for Windows,运行安装程序,按照向导一步步操作即可,建议选择 "Full" 安装,它会自动帮你配置好。
- macOS: 最简单的方式是使用 Homebrew:
brew install mysql
- Linux (Ubuntu/Debian):
sudo apt update sudo apt install mysql-server
安装完成后,可以尝试在终端输入 mysql --version 检查是否安装成功。
安装图形化管理工具(推荐:MySQL Workbench)
虽然我们可以通过命令行操作MySQL,但图形化界面更直观,方便初学者学习。
- MySQL Workbench: MySQL官方提供的免费工具,功能强大,下载地址:MySQL Workbench Download
- 其他工具:Navicat, DBeaver, DataGrip 等。
连接到你的MySQL服务器
- 打开 MySQL Workbench。
- 点击主界面上的 号,创建一个新的连接。
- 在 "Setup New Connection" 窗口中:
- Connection Name: 给你的连接起个名字,"Local MySQL"。
- Hostname: 如果是连接本机,通常是
localhost或0.0.1。 - Port: 默认是
3306。 - Username: 默认的管理员用户是
root,安装时如果没改过密码,这里可以为空。
- 点击 "Test Connection" 进行测试,如果成功,点击 "OK" 保存。
- 双击你创建的连接,即可进入MySQL主界面,在这里可以执行SQL语句。
第三部分:SQL语言基础
什么是SQL?
SQL(Structured Query Language,结构化查询语言)是一种专门用来与数据库通信的语言,我们所有的增删改查操作都是通过SQL语句来完成的。
SQL的分类
- DDL (Data Definition Language - 数据定义语言):用于定义和管理数据库的结构。
CREATE(创建)ALTER(修改)DROP(删除)
- DML (Data Manipulation Language - 数据操作语言):用于操作数据库中的数据。
INSERT(插入)UPDATE(更新)DELETE(删除)
- DQL (Data Query Language - 数据查询语言):用于查询数据(这是最常用的部分)。
SELECT(查询)
- DCL (Data Control Language - 数据控制语言):用于控制数据库的访问权限。
GRANT(授权)REVOKE(撤销权限)
数据库操作
在 MySQL Workbench 的查询编辑器中执行以下语句:
-- 1. 创建一个名为 `mydb` 的数据库 CREATE DATABASE mydb; -- 2. 查看所有数据库 SHOW DATABASES; -- 3. 使用(切换到) `mydb` 数据库 USE mydb; -- 4. 删除 `mydb` 数据库 (慎用!) -- DROP DATABASE mydb;
表操作
我们将在 mydb 数据库中创建一个 students 表。
-- 1. 创建一个 `students` 表
CREATE TABLE students (
id INT PRIMARY KEY AUTO_INCREMENT, -- id列,整数类型,主键,自动递增
name VARCHAR(50) NOT NULL, -- 姓名列,可变字符串,最大50,不能为空
age INT, -- 年龄列,整数类型
gender VARCHAR(10), -- 性别列,可变字符串
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP -- 创建时间,默认为当前时间
);
-- 2. 查看 `mydb` 数据库中的所有表
SHOW TABLES;
-- 3. 查看 `students` 表的结构
DESC students;
-- 4. 删除 `students` 表 (慎用!)
-- DROP TABLE students;
第四部分:数据操作(增删改查)
这是SQL的核心,我们围绕 students 表进行操作。
CRUD:创建数据 (INSERT)
-- 插入一条完整的记录
INSERT INTO students (name, age, gender) VALUES ('张三', 18, '男');
-- 插入另一条记录
INSERT INTO students (name, age, gender) VALUES ('李四', 19, '女');
-- 插入多条记录
INSERT INTO students (name, age, gender) VALUES
('王五', 20, '男'),
('赵六', 18, '女');
Read:查询数据 (SELECT)
-- 查询所有学生的所有信息 SELECT * FROM students; -- 查询所有学生的姓名和年龄 SELECT name, age FROM students; -- 查询所有学生的姓名和年龄,并为列起别名 SELECT name AS '学生姓名', age AS '学生年龄' FROM students; -- 查询所有学生,按年龄降序排列(大的在前) SELECT * FROM students ORDER BY age DESC; -- 查询所有学生,按年龄升序排列(小的在前) SELECT * FROM students ORDER BY age ASC;
Update:更新数据 (UPDATE)
注意:UPDATE 操作一定要加 WHERE 条件,否则会更新整个表!
-- 将 '张三' 的年龄改为 20 UPDATE students SET age = 20 WHERE name = '张三'; -- 将 '李四' 的年龄改为 21,性别改为 '男' UPDATE students SET age = 21, gender = '男' WHERE name = '李四';
Delete:删除数据 (DELETE)
注意:DELETE 操作一定要加 WHERE 条件,否则会清空整个表!
-- 删除 '王五' 这条记录 DELETE FROM students WHERE name = '王五'; -- 删除年龄小于 19 的所有学生 DELETE FROM students WHERE age < 19;
第五部分:数据查询进阶
条件查询 (WHERE)
WHERE 子句用于过滤记录,常用运算符:
- , 或
<>(不等于),>,<,>=,<= AND(与),OR(或),NOT(非)BETWEEN ... AND ...(在...之间)IN (value1, value2, ...)(在列表中)LIKE(模糊查询)- 代表任意多个字符
_:代表单个字符
-- 查询年龄等于 18 的学生
SELECT * FROM students WHERE age = 18;
-- 查询年龄大于 18 的男生
SELECT * FROM students WHERE age > 18 AND gender = '男';
-- 查询年龄在 18 到 20 之间的学生
SELECT * FROM students WHERE age BETWEEN 18 AND 20;
-- 查询姓名是 '张三' 或 '李四' 的学生
SELECT * FROM students WHERE name IN ('张三', '李四');
-- 查询所有姓 '张' 的学生
SELECT * FROM students WHERE name LIKE '张%';
-- 查询名字是两个字,且第一个字是 '张' 的学生
SELECT * FROM students WHERE name LIKE '张_';
排序 (ORDER BY)
-- 按年龄升序排列 SELECT * FROM students ORDER BY age ASC; -- 先按性别升序排列,再按年龄降序排列 SELECT * FROM students ORDER BY gender ASC, age DESC;
聚合函数
对列进行计算,返回一个单一的值。
COUNT(): 计算数量SUM(): 计算总和AVG(): 计算平均值MAX(): 计算最大值MIN(): 计算最小值
-- 计算学生总数 SELECT COUNT(*) FROM students; -- 计算所有学生的平均年龄 SELECT AVG(age) FROM students; -- 计算最大年龄和最小年龄 SELECT MAX(age) AS max_age, MIN(age) AS min_age FROM students;
分组查询 (GROUP BY)
通常与聚合函数一起使用,用于将结果集按一个或多个列进行分组。
-- 创建一个 `scores` 表用于演示
CREATE TABLE scores (
id INT PRIMARY KEY AUTO_INCREMENT,
student_name VARCHAR(50),
subject VARCHAR(50),
score INT
);
INSERT INTO scores (student_name, subject, score) VALUES
('张三', '数学', 90),
('张三', '语文', 85),
('李四', '数学', 88),
('李四', '语文', 92),
('王五', '数学', 78),
('王五', '语文', 80);
-- 查询每个学生的平均成绩
SELECT student_name, AVG(score) AS average_score
FROM scores
GROUP BY student_name;
-- 查询每个科目(subject)的最高分
SELECT subject, MAX(score) AS highest_score
FROM scores
GROUP BY subject;
多表查询(JOIN)
当数据分布在多个相关联的表中时,需要使用 JOIN 来合并查询结果。
假设我们有 students 和 scores 两个表,它们通过 student_name 关联。
INNER JOIN(内连接):只返回两个表中匹配的记录。LEFT JOIN(左连接):返回左表(FROM指定的表)的所有记录,以及右表中匹配的记录,如果右表没有匹配,则结果中右表的列为NULL。
-- 内连接:查询每个学生的姓名和对应的成绩 SELECT s.name, sc.subject, sc.score FROM students s INNER JOIN scores sc ON s.name = sc.student_name; -- 左连接:查询所有学生,即使他们没有成绩记录 SELECT s.name, sc.subject, sc.score FROM students s LEFT JOIN scores sc ON s.name = sc.student_name;
第六部分:数据类型与约束
常见数据类型
- 数值类型
INT: 整数,如age INT。DECIMAL(M, D): 精确的小数,M是总位数,D是小数位数,如price DECIMAL(10, 2)表示最多10位,其中2位是小数。FLOAT: 单精度浮点数,不精确,用于科学计算。
- 字符串类型
VARCHAR(N): 可变长度的字符串,N是最大长度,如name VARCHAR(50),节省空间。CHAR(N): 固定长度的字符串,N是长度,如gender CHAR(1),查询速度更快。
- 日期时间类型
DATE: 只存储日期,如2025-10-27。DATETIME: 存储日期和时间,如2025-10-27 10:30:00。TIMESTAMP: 存储时间戳,范围较小,常用于记录数据的创建和修改时间。
常见约束
约束是表中对列的强制规则,以保证数据的完整性和准确性。
PRIMARY KEY: 主键,唯一标识表中的每一行。不能为空,且唯一。FOREIGN KEY: 外键,用于在两个表之间建立链接,一个表中的外键指向另一个表的主键。NOT NULL: 列不能为空。UNIQUE: 列的值必须唯一,但可以为空。DEFAULT: 为列设置默认值。AUTO_INCREMENT: 自动递增,通常用于主键。
第七部分:索引与优化(入门)
什么是索引?
索引类似于书的目录,如果没有目录,要找到某个章节,你可能需要一页一页地翻,有了目录,你就可以快速定位到章节页码。
数据库索引就是一种提高查询效率的数据结构,它对表中的一列或多列进行排序,并创建一个指向这些值的指针。
为什么要用索引?
- 加速查询:极大地提高了数据检索的速度,特别是对于大型表。
- 保证唯一性:通过创建唯一索引,可以确保某列的数据是唯一的。
如何创建索引?
-- 为 students 表的 name 列创建一个普通索引 CREATE INDEX idx_name ON students (name); -- 为 students 表的 age 和 gender 列创建一个复合索引 CREATE INDEX idx_age_gender ON students (age, gender); -- 查看表的索引 SHOW INDEX FROM students; -- 删除索引 DROP INDEX idx_name ON students;
索引的代价:
- 占用磁盘空间。
- 在增加、删除、更新数据时,需要同时维护索引,会降低写操作的速度。
使用原则:只为经常用于 WHERE、JOIN、ORDER BY 子句的列创建索引。
第八部分:总结与学习路径
回顾
恭喜你!你已经完成了MySQL的入门学习,现在你应该掌握:
- 数据库的基本概念。
- 如何安装和配置MySQL环境。
- 使用SQL进行数据库和表的基本操作。
- 核心的 CRUD(增删改查)操作。
- 使用
WHERE、ORDER BY、GROUP BY和JOIN进行复杂查询。 - 了解数据类型和约束的重要性。
- 知道索引是什么以及为什么需要它。
下一步该学什么?
- 事务:学习
BEGIN,COMMIT,ROLLBACK,理解ACID特性,确保数据操作的原子性。 - 视图:学习创建虚拟表,简化复杂查询。
- 存储过程和函数:学习编写可复用的SQL代码块。
- 数据库设计:学习范式(1NF, 2NF, 3NF),设计出结构更合理、性能更好的数据库。
- 权限管理:学习如何创建用户并分配不同的权限。
- 实战项目:尝试用MySQL为你自己的小项目(如博客、待办事项列表)搭建后端数据库。
MySQL是一个庞大而强大的工具,本教程只是一个起点,保持好奇心,多动手实践,你将成为一名出色的数据库开发者!
