MySQL 数据库基础
从数据库操作到 Python 实战 —— 掌握数据增删改查的完整链路,理解 ORM 编程思想
MySQL 概述
🐬什么是 MySQL?
MySQL 是全球最流行的开源关系型数据库管理系统(RDBMS),由 Oracle 公司维护。它使用 SQL(结构化查询语言)来管理数据。
功能强大
支持事务、索引、存储过程等高级特性
跨平台
Windows、Linux、macOS 均可运行
速度快
经过优化的查询引擎,毫秒级响应
成本低
开源免费,社区版足够学习和中小项目使用
多语言支持
Python、Java、PHP、Node.js 等均可操作
大容量
单表可存储数十亿条记录
下载安装 MySQL
📥安装流程
mysql.com
选择 Server Only
Path 添加 bin
net start mysql
# 启动 MySQL 服务 net start mysql # 关闭 MySQL 服务 net stop mysql # 登录 MySQL mysql -u root -p
操作 MySQL 数据库
🗄️数据库的 CRUD 操作
-- 创建数据库 CREATE DATABASE mydb; -- 选择/使用数据库 USE mydb; -- 查看所有数据库 SHOW DATABASES; -- 删除数据库(⚠️ 不可恢复!) DROP DATABASE mydb;
DROP DATABASE 操作会永久删除数据库及其所有数据,执行前请务必确认!生产环境中应先做备份。
MySQL 数据类型
🔢数字类型 — 整数
| 类型 | 大小 | 有符号范围 | 适用场景 |
|---|---|---|---|
TINYINT | 1 字节 | -128 ~ 127 | 状态码、布尔值 |
SMALLINT | 2 字节 | -32768 ~ 32767 | 年龄、小计数 |
INT | 4 字节 | -21亿 ~ 21亿 | ⭐ 最常用,用户ID等 |
BIGINT | 8 字节 | 极大范围 | 订单号、大数据量ID |
📝字符串类型
CHAR(10) 就像一个固定10格的停车场,不管停几辆车,都占10个位。VARCHAR(10) 则像弹性车位,停多少辆占多少位(但最多10个)。
| 类型 | 长度 | 特点 | 适用场景 |
|---|---|---|---|
CHAR(M) | 0~255 | 固定长度,读取快 | 身份证号、手机号 |
VARCHAR(M) | 0~65535 | 可变长度,节省空间 | ⭐ 用户名、邮箱 |
TEXT | ~64KB | 大段文本 | 文章内容、评论 |
LONGTEXT | ~4GB | 超大文本 | 日志、全文内容 |
📅日期和时间类型
| 类型 | 格式 | 范围 | 适用场景 |
|---|---|---|---|
DATE | YYYY-MM-DD | 1000~9999年 | 生日、入职日期 |
TIME | HH:MM:SS | ±838小时 | 时长记录 |
DATETIME | YYYY-MM-DD HH:MM:SS | 1000~9999年 | ⭐ 创建时间、更新时间 |
TIMESTAMP | YYYY-MM-DD HH:MM:SS | 1970~2038年 | 自动记录修改时间 |
操作数据表
📋创建数据表
CREATE TABLE tb_users ( id INT PRIMARY KEY AUTO_INCREMENT, username VARCHAR(50) NOT NULL, email VARCHAR(100), age TINYINT DEFAULT 0, createtime DATETIME DEFAULT CURRENT_TIMESTAMP );
常用列属性
PRIMARY KEY | 主键,唯一标识每行 |
AUTO_INCREMENT | 自动递增编号 |
NOT NULL | 不允许为空 |
DEFAULT | 设置默认值 |
查看 / 修改 / 删除
-- 查看表结构 DESC tb_users; -- 添加列 ALTER TABLE tb_users ADD phone VARCHAR(20); -- 删除表 DROP TABLE tb_users;
PRIMARY KEY 就像每个学生的学号——全校唯一,不能重复,也不能为空。AUTO_INCREMENT 就是让学号自动排号,入学一个编一个。
数据表记录的增删改查
✏️SQL 四大操作
-- ① 增(INSERT):插入一条记录 INSERT INTO tb_users (username, email, age) VALUES ('张三', 'zhangsan@email.com', 22); -- ② 查(SELECT):查询所有记录 SELECT * FROM tb_users; -- 查询特定条件 SELECT username, age FROM tb_users WHERE age > 20; -- ③ 改(UPDATE):修改记录 UPDATE tb_users SET age = 23 WHERE username = '张三'; -- ④ 删(DELETE):删除记录 DELETE FROM tb_users WHERE id = 1;
UPDATE 和 DELETE 操作一定要带 WHERE 条件!否则会修改/删除所有记录。这是初学者最常犯的错误。
查询操作进阶
🔍WHERE 子句常用运算符
| 运算符 | 示例 |
|---|---|
= > < >= <= | age >= 18 |
!= 或 <> | status != 0 |
BETWEEN...AND | id BETWEEN 1 AND 10 |
IN | id IN (4, 5, 6) |
LIKE | name LIKE '张%' |
IS NULL | email IS NULL |
| 统计函数 | 功能 |
|---|---|
COUNT(*) | 统计行数 |
SUM(字段) | 求和 |
AVG(字段) | 平均值 |
MAX(字段) | 最大值 |
MIN(字段) | 最小值 |
LIKE '张%' 就像在通讯录里搜索"姓张的人"——% 是万能通配符,代表任意多个字符。_(下划线)则代表恰好一个字符。
使用 Python 操作 MySQL — 本章核心
📦第一步:安装 PyMySQL
PyMySQL 是一个纯 Python 实现的 MySQL 客户端库,无需额外的 C 依赖。
pip install pymysql
🔄Python 操作数据库的完整流程
connect()
cursor()
execute()
commit()
close()
① connect() = 走进银行,拿号排队
② cursor() = 走到柜台窗口,面对工作人员
③ execute() = 告诉工作人员你要办什么业务
④ commit() = 确认办理,签字盖章
⑤ close() = 办完走人,离开银行
🔌连接对象 & 游标对象
连接对象方法
cursor() | 获取游标对象 |
commit() | 提交事务 |
rollback() | 回滚事务 |
close() | 关闭连接 |
游标对象方法
execute(sql) | 执行一条SQL |
executemany() | 批量执行 |
fetchone() | 取一条结果 |
fetchmany(n) | 取 n 条结果 |
fetchall() | 取全部结果 |
🐍PyMySQL 完整代码示例
🔗 建立数据库连接
import pymysql # 建立数据库连接 db = pymysql.connect( host='localhost', # 数据库地址 user='root', # 用户名 password='123456', # 密码 database='mydb', # 数据库名 charset='utf8mb4' # 字符编码(推荐utf8mb4) ) # 获取游标对象 cursor = db.cursor()
➕ 插入数据(INSERT)
# 方式1:直接拼接(⚠️ 有SQL注入风险,仅学习用) sql = "INSERT INTO books (name, price) VALUES ('Python入门', 59.9)" cursor.execute(sql) # 方式2:参数化查询(✅ 推荐!安全防注入) sql = "INSERT INTO books (name, price) VALUES (%s, %s)" cursor.execute(sql, ('Flask实战', 69.8)) # 批量插入 data = [ ('Django教程', 79.0), ('MySQL必知必会', 49.5), ('数据分析实战', 89.0) ] cursor.executemany(sql, data) db.commit() # ⚠️ 别忘了提交!
🔍 查询数据(SELECT)
# 查询所有记录 cursor.execute("SELECT * FROM books") results = cursor.fetchall() for row in results: print(f"书名: {row[1]}, 价格: {row[2]}") # 查询单条记录 cursor.execute("SELECT * FROM books WHERE id = %s", (1,)) book = cursor.fetchone() print(book) # 返回元组: (1, 'Python入门', 59.9) # 条件查询 cursor.execute("SELECT name, price FROM books WHERE price > %s", (60,)) expensive = cursor.fetchall()
✏️ 修改数据(UPDATE)
sql = "UPDATE books SET price = %s WHERE name = %s" cursor.execute(sql, (55.0, 'Python入门')) db.commit() print(f"受影响的行数: {cursor.rowcount}")
🗑️ 删除数据(DELETE)
sql = "DELETE FROM books WHERE id = %s" cursor.execute(sql, (3,)) db.commit()
🛡️ 完整的异常处理模板
import pymysql db = pymysql.connect( host='localhost', user='root', password='123456', database='mydb', charset='utf8mb4' ) try: cursor = db.cursor() # 执行你的 SQL 操作 cursor.execute("INSERT INTO books (name, price) VALUES (%s, %s)", ('新书', 99.0)) db.commit() # 成功则提交 print("操作成功!") except Exception as e: db.rollback() # 出错则回滚,撤销所有更改 print(f"操作失败: {e}") finally: cursor.close() # 关闭游标 db.close() # 关闭连接
try → commit / except → rollback / finally → close 结构是操作数据库的黄金模板,务必牢记!它能保证:操作成功时数据持久化,失败时数据不会处于半更新状态。
ORM 编程
🔄什么是 ORM?
对象关系映射(Object Relational Mapping)—— 让你用 Python 对象的方式操作数据库,而不用写 SQL 语句。
INSERT INTO users...。
数据库概念
⟷
⟷
Python 概念
# 传统 SQL 写法 cursor.execute("INSERT INTO users (name, age) VALUES ('李四', 25)") # ORM 写法 —— 像操作普通 Python 对象一样! user = User(name='李四', age=25) session.add(user) session.commit()
✅ ORM 优点
• 数据模型集中管理,便于维护
• 自动处理数据消毒和事务
• 天然的 MVC 架构(Model 层)
• 代码简洁,语义清晰
• 不用手写复杂 SQL
❌ ORM 缺点
• 学习成本较高
• 复杂查询性能不如原生 SQL
• 抽象了底层,不利于理解 SQL 原理
• 对非标准操作支持有限
本章小结
🎯知识脉络回顾
MySQL 基础
安装 · 数据库 · 数据表
SQL 语句
增删改查 · 查询进阶
Python + MySQL
PyMySQL · CRUD
ORM 思想
对象映射 · 框架准备
📌 必须记住的 SQL
CREATE DATABASE / TABLE
INSERT INTO ... VALUES
SELECT ... FROM ... WHERE
UPDATE ... SET ... WHERE
DELETE FROM ... WHERE
📌 必须记住的 Python 模板
pymysql.connect() → 连接
db.cursor() → 获取游标
cursor.execute(sql) → 执行
db.commit() → 提交
try/except/finally → 异常处理