
文章目录
📖 开篇导读
在之前的课程中,我们学习了文件操作、JSON、CSV等数据持久化方式。但这些方式在处理大量结构化数据、复杂查询、多用户并发时显得力不从心。例如,你想要从一万条记录中快速找出年龄大于18岁的用户,并按照分数排序——如果使用文件操作,需要手动遍历、比较、排序,代码复杂且效率低下。
这时,就需要关系型数据库。数据库是专门用来存储和管理数据的软件,它提供了高效的数据检索、更新、并发控制、事务等功能。MySQL是世界上最流行的开源关系型数据库之一,被广泛应用于Web开发、数据分析、企业应用等领域。
💡 工作场景:
- Web应用:用户信息、商品订单、博客文章等核心数据都存储在数据库中。
- 数据分析:从数据库中提取数据,进行统计和报表生成。
- 数据仓库:作为数据存储中心,供BI工具使用。
本课是数据库的入门课,我们将学习:
- 数据库的基本概念(表、行、列、主键、外键)
- MySQL的安装与配置(Windows和Mac)
- SQL语言基础:DDL(创建表、修改表)、DML(增删改)、DQL(查询)
- 使用命令行客户端操作MySQL
- 常用数据类型和约束
学完本课,你将能够独立安装MySQL,并使用SQL语句对数据库进行增删改查操作,为后续Python操作数据库打下坚实基础。
🎯 学习目标
| 目标编号 | 具体掌握内容 | 对应面试/工作价值 |
|---|---|---|
| 1️⃣ | 理解关系型数据库的基本概念(数据库、表、行、列、主键、外键) | 面试基础 |
| 2️⃣ | 完成MySQL的安装和环境配置(Windows/macOS) | 环境搭建能力 |
| 3️⃣ | 掌握SQL语言的基础语法:DDL(CREATE、ALTER、DROP)和DML(INSERT、UPDATE、DELETE) | 数据定义与操作 |
| 4️⃣ | 熟练掌握查询语句SELECT,包括条件、排序、分组、聚合函数 | 数据查询核心 |
| 5️⃣ | 理解数据类型和约束(主键、非空、唯一、默认值) | 表结构设计 |
| 6️⃣ | 能够使用MySQL命令行客户端或图形化工具(如Navicat)执行SQL | 日常开发必备 |
🔥 面试考点:“什么是主键?”“SQL中WHERE和HAVING的区别?”“INNER JOIN和LEFT JOIN的区别?”“如何设计数据库表?”
📚 知识点理论精讲
一、数据库基本概念
1.1 什么是数据库
数据库(Database)是按照数据结构来组织、存储和管理数据的仓库。它提供了数据持久化、高效检索、安全控制、并发访问等功能。
1.2 关系型数据库
关系型数据库(RDBMS)使用表(Table)来存储数据,表之间通过关系(如外键)连接。常用的关系型数据库有:MySQL、PostgreSQL、Oracle、SQL Server。
1.3 核心术语
| 术语 | 含义 | 类比 |
|---|---|---|
| 数据库(Database) | 数据的容器 | 一个Excel文件 |
| 表(Table) | 特定类型数据的集合 | Excel中的一个Sheet |
| 行(Row) | 表中的一条记录 | 表格中的一行 |
| 列(Column) | 表的一个字段 | 表格中的一列 |
| 主键(Primary Key) | 唯一标识每一行的列 | 身份证号 |
| 外键(Foreign Key) | 关联其他表的列 | 学生表的班级ID指向班级表 |
1.4 SQL语言
SQL(Structured Query Language)是操作关系型数据库的标准语言,分为三类:
- DDL(Data Definition Language):定义数据结构,如
CREATE、ALTER、DROP - DML(Data Manipulation Language):操作数据,如
INSERT、UPDATE、DELETE - DQL(Data Query Language):查询数据,如
SELECT
二、MySQL安装与配置
2.1 Windows安装
- 从官网下载MySQL Community Server Installer(https://dev.mysql.com/downloads/mysql/)
- 运行安装程序,选择“Developer Default”
- 设置root密码(务必记住)
- 选择“MySQL Server”、“MySQL Workbench”等组件
- 完成后,配置环境变量:将
C:\Program Files\MySQL\MySQL Server 8.0\bin添加到系统PATH
2.2 macOS安装
# 使用Homebrew安装
brew install mysql
# 启动服务
brew services start mysql
# 运行安全脚本(设置root密码)
mysql_secure_installation
2.3 验证安装
打开命令行(cmd或terminal),输入:
mysql -u root -p
输入密码后进入MySQL命令行,显示mysql>提示符。
2.4 图形化工具推荐
- MySQL Workbench:官方工具,功能全面。
- Navicat for MySQL:商业软件,界面友好。
- DBeaver:开源通用数据库工具。
三、基础SQL语句
3.1 数据库操作
-- 查看所有数据库
SHOW DATABASES;
-- 创建数据库
CREATE DATABASE school;
-- 使用数据库
USE school;
-- 删除数据库(慎用)
DROP DATABASE school;
3.2 表操作
创建表
CREATE TABLE students (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(50) NOT NULL,
age INT,
grade VARCHAR(20),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
查看表结构
DESC students;
SHOW CREATE TABLE students;
修改表
-- 添加列
ALTER TABLE students ADD COLUMN email VARCHAR(100);
-- 修改列类型
ALTER TABLE students MODIFY COLUMN age TINYINT;
-- 删除列
ALTER TABLE students DROP COLUMN email;
-- 重命名表
ALTER TABLE students RENAME TO pupil;
删除表
DROP TABLE students;
3.3 数据类型
| 类型 | 说明 | 示例 |
|---|---|---|
INT | 整数 | 年龄、ID |
VARCHAR(n) | 可变长度字符串,最大n个字符 | 姓名、地址 |
TEXT | 长文本 | 文章内容 |
DATE | 日期(YYYY-MM-DD) | 生日 |
DATETIME | 日期和时间 | 创建时间 |
TIMESTAMP | 时间戳,自动更新 | 最后修改 |
DECIMAL(m,d) | 定点数,m总位数,d小数位 | 价格、金额 |
BOOLEAN | 布尔值,实际是TINYINT(1) | 是否删除 |
3.4 约束
| 约束 | 说明 |
|---|---|
PRIMARY KEY | 主键,唯一且非空 |
FOREIGN KEY | 外键,引用其他表的主键 |
NOT NULL | 不能为空 |
UNIQUE | 值必须唯一 |
DEFAULT | 默认值 |
AUTO_INCREMENT | 自动递增(整数类型) |
四、数据操作语言(DML)
4.1 插入数据(INSERT)
-- 插入所有列
INSERT INTO students (name, age, grade) VALUES ('张三', 18, '高一');
-- 插入多行
INSERT INTO students (name, age, grade) VALUES
('李四', 19, '高二'),
('王五', 18, '高一');
-- 插入部分列(其他列使用默认值)
INSERT INTO students (name) VALUES ('赵六');
4.2 更新数据(UPDATE)
-- 更新所有行的grade
UPDATE students SET grade = '高三';
-- 条件更新
UPDATE students SET age = 20 WHERE name = '张三';
-- 多列更新
UPDATE students SET age = 21, grade = '毕业班' WHERE id = 1;
4.3 删除数据(DELETE)
-- 删除所有行(慎用)
DELETE FROM students;
-- 条件删除
DELETE FROM students WHERE id = 5;
-- 删除表中所有行,更快但无法回滚(不带WHERE的DELETE可以回滚)
TRUNCATE TABLE students;
五、数据查询语言(DQL)
5.1 基础查询
-- 查询所有列
SELECT * FROM students;
-- 查询指定列
SELECT name, age FROM students;
-- 使用别名
SELECT name AS 姓名, age AS 年龄 FROM students;
-- 去重
SELECT DISTINCT grade FROM students;
5.2 条件查询(WHERE)
-- 比较运算符
SELECT * FROM students WHERE age >= 18;
SELECT * FROM students WHERE name = '张三';
-- 逻辑运算符
SELECT * FROM students WHERE age > 18 AND grade = '高二';
SELECT * FROM students WHERE age < 18 OR grade = '高三';
-- 范围查询
SELECT * FROM students WHERE age BETWEEN 18 AND 20;
SELECT * FROM students WHERE name IN ('张三', '李四');
-- 模糊查询(LIKE)
SELECT * FROM students WHERE name LIKE '张%'; -- 以张开头的
SELECT * FROM students WHERE name LIKE '%三'; -- 以三结尾的
SELECT * FROM students WHERE name LIKE '%三%'; -- 包含三的
-- 空值判断
SELECT * FROM students WHERE grade IS NULL;
SELECT * FROM students WHERE grade IS NOT NULL;
5.3 排序(ORDER BY)
-- 升序(默认)
SELECT * FROM students ORDER BY age;
-- 降序
SELECT * FROM students ORDER BY age DESC;
-- 多列排序
SELECT * FROM students ORDER BY grade ASC, age DESC;
5.4 限制结果(LIMIT)
-- 前5条
SELECT * FROM students LIMIT 5;
-- 从第3条开始取2条(分页)
SELECT * FROM students LIMIT 2 OFFSET 2;
-- 等价写法
SELECT * FROM students LIMIT 2, 2;
5.5 聚合函数
| 函数 | 作用 |
|---|---|
COUNT(*) | 统计行数 |
SUM(列) | 求和 |
AVG(列) | 平均值 |
MAX(列) | 最大值 |
MIN(列) | 最小值 |
SELECT COUNT(*) FROM students;
SELECT AVG(age) FROM students WHERE grade = '高一';
SELECT grade, COUNT(*) FROM students GROUP BY grade;
5.6 分组(GROUP BY)
-- 按年级分组,统计每级人数
SELECT grade, COUNT(*) AS 人数 FROM students GROUP BY grade;
-- 带条件的分组(使用HAVING筛选分组后结果)
SELECT grade, AVG(age) AS 平均年龄
FROM students
GROUP BY grade
HAVING AVG(age) > 18;
WHERE vs HAVING:WHERE在分组前过滤,HAVING在分组后过滤。
5.7 多表查询(JOIN)
假设有两张表:
-- 学生表 students (id, name, class_id)
-- 班级表 classes (id, name)
内连接(INNER JOIN)
SELECT students.name, classes.name AS class_name
FROM students
INNER JOIN classes ON students.class_id = classes.id;
左连接(LEFT JOIN)
返回左表所有记录,右表没有匹配的为NULL。
SELECT students.name, classes.name
FROM students
LEFT JOIN classes ON students.class_id = classes.id;
六、索引与性能优化简介
索引是提高查询速度的数据结构,类似于书的目录。使用CREATE INDEX创建索引。
CREATE INDEX idx_name ON students(name);
注意:索引会加速查询,但会减慢增删改操作,占用额外空间,需要合理使用。
💻 代码案例实操
案例1:创建数据库和表
-- 1. 创建数据库
CREATE DATABASE school_db;
USE school_db;
-- 2. 创建学生表
CREATE TABLE students (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(50) NOT NULL,
age INT NOT NULL,
gender ENUM('男', '女') DEFAULT '男',
grade VARCHAR(20),
created_at DATETIME DEFAULT NOW()
);
-- 3. 创建成绩表(关联学生)
CREATE TABLE scores (
id INT AUTO_INCREMENT PRIMARY KEY,
student_id INT NOT NULL,
subject VARCHAR(50),
score DECIMAL(5,2),
FOREIGN KEY (student_id) REFERENCES students(id) ON DELETE CASCADE
);
-- 查看创建的表
SHOW TABLES;
DESC students;
案例2:插入与查询
-- 插入学生
INSERT INTO students (name, age, gender, grade) VALUES
('张三', 18, '男', '高一'),
('李四', 19, '女', '高一'),
('王五', 18, '男', '高二');
-- 插入成绩
INSERT INTO scores (student_id, subject, score) VALUES
(1, '数学', 85.5),
(1, '语文', 78.0),
(2, '数学', 92.0),
(2, '语文', 88.5),
(3, '数学', 76.0);
-- 查询所有学生信息
SELECT * FROM students;
-- 查询男生
SELECT * FROM students WHERE gender = '男';
-- 查询年龄大于18的学生
SELECT name, age FROM students WHERE age > 18;
-- 查询每个学生的平均分
SELECT s.name, AVG(sc.score) AS avg_score
FROM students s
JOIN scores sc ON s.id = sc.student_id
GROUP BY s.id;
案例3:更新与删除
-- 将高一学生的年级改为“高一(下)”
UPDATE students SET grade = '高一(下)' WHERE grade = '高一';
-- 删除成绩低于60分的记录(假设有)
DELETE FROM scores WHERE score < 60;
-- 删除学生张三(由于外键ON DELETE CASCADE,成绩也会自动删除)
DELETE FROM students WHERE name = '张三';
案例4:复杂查询——分组统计与排序
-- 按年级统计学生人数,并按人数降序
SELECT grade, COUNT(*) AS count
FROM students
GROUP BY grade
ORDER BY count DESC;
-- 查询平均分大于80的年级
SELECT s.grade, AVG(sc.score) AS avg_score
FROM students s
JOIN scores sc ON s.id = sc.student_id
GROUP BY s.grade
HAVING avg_score > 80;
案例5:使用索引优化
-- 为name列创建索引
CREATE INDEX idx_student_name ON students(name);
-- 查询使用索引
EXPLAIN SELECT * FROM students WHERE name = '李四';
-- 删除索引
DROP INDEX idx_student_name ON students;
⚠️ 易错点避坑总结
| 序号 | 坑点描述 | 后果 | 解决方案 |
|---|---|---|---|
| 1 | 忘记选择数据库(USE database) | “No database selected”错误 | 执行SQL前先USE database; |
| 2 | 字符串值忘记加引号 | 语法错误 | 字符串和日期用单引号包裹 |
| 3 | UPDATE/DELETE没有WHERE条件 | 误操作所有行 | 执行前先SELECT确认范围,或开启安全模式 |
| 4 | INT类型长度指定不必要 | 混淆显示宽度与存储范围 | 直接用INT,范围足够 |
| 5 | VARCHAR长度设置不合理 | 过长浪费空间,过短数据被截断 | 根据业务合理设置(如姓名20,地址255) |
| 6 | 外键约束导致删除失败 | 无法删除有子记录的主表数据 | 使用ON DELETE CASCADE或先删除子记录 |
| 7 | LIKE查询以%开头 | 无法使用索引,性能差 | 避免必要情况使用,或考虑全文索引 |
| 8 | HAVING和WHERE混淆 | 逻辑错误 | WHERE在分组前,HAVING在分组后 |
| 9 | 使用保留字作为表名/列名 | 语法错误 | 用反引号包裹,如`order` |
| 10 | 字符集不一致导致乱码 | 中文显示为问号 | 建库时指定CHARACTER SET utf8mb4 |
📝 课后实战练习题
第1题:创建数据库和表
创建数据库company,在其中创建employees表,包含以下字段:id(主键自增)、name(不为空)、age、department、salary(DECIMAL(10,2))、hire_date(DATE)。使用SQL语句完成。
第2题:插入数据
向employees表中插入至少5条模拟数据,涵盖不同部门、不同年龄。
第3题:查询练习
编写以下查询:
- 查询所有员工的姓名和工资。
- 查询年龄大于30岁的员工。
- 查询工资在5000到10000之间的员工。
- 查询部门为“技术部”的员工按工资降序排列。
- 统计每个部门的平均工资。
第4题:更新与删除
- 将所有员工的工资增加10%。
- 删除年龄大于60岁的员工。
- 将“销售部”的员工部门名称改为“市场部”。
第5题:聚合与分组
- 查询最高工资、最低工资、平均工资。
- 按部门统计员工人数和平均工资,只显示平均工资大于8000的部门。
第6题:多表查询(创建两张关联表)
创建departments表(id, name),并在employees表中增加dept_id外键。插入部门数据,更新员工的外键。然后使用JOIN查询员工的姓名和部门名称。
第7题:索引与性能
为employees表的name列创建索引,并使用EXPLAIN分析查询SELECT * FROM employees WHERE name = '张三';的执行计划。
🧠 知识点思维导图总结
🔜 下节课预告
掌握了SQL基础后,我们就可以用Python来操作MySQL数据库了。下一节课我们将学习如何使用mysql-connector-python连接MySQL,执行增删改查,并封装数据库操作工具类。
第39课:Python操作MySQL:增删改查、事务处理与工具类封装
内容包括:
mysql-connector-python安装与连接- 执行DDL/DML/DQL
- 参数化查询防SQL注入
- 事务提交与回滚
- 封装DB工具类
- 连接池简介
数据库编程是后端开发的核心,学完后你将能够开发数据驱动的应用程序。
🌟 学习鼓励:数据库是程序员的必修课。本课内容较多,建议你一边学习一边在MySQL命令行中动手练习,不要只看不练。多写SQL语句,特别是
SELECT的各种子句组合,以及多表连接。掌握好SQL,才能为后续的Python数据库编程打下坚实基础。
🔗《50节课 Python 从入门到精通》系列课程导航
🌟 感谢您耐心阅读到这里!
💡 如果本文对您有所启发欢迎:
👍 点赞📌 收藏 📤 分享给更多需要的伙伴。
🗣️ 期待在评论区看到您的想法, 共同进步。
🔔 关注我,持续获取更多干货内容~
🤗 我们下篇文章见~
6839

被折叠的 条评论
为什么被折叠?



