SQL与MySQL基础讲义
本讲义适用于 SQL 与 MySQL 入门课程
目录
第一章:数据库基本概念
1.1 什么是数据库?
数据库(Database,DB) 是按照一定的数据模型组织、存储和管理数据的仓库。
通俗理解:数据库就像是一个电子化的文件柜,用于存储电子化的数据。我们可以通过数据库来高效地存储、查询、更新和管理数据。
1.2 数据库管理系统(DBMS)
数据库管理系统(Database Management System,DBMS) 是用于建立、使用和维护数据库的大型软件。
常见的 DBMS 有:
- MySQL - 开源、轻量级
- Oracle - 功能强大、商业收费
- SQL Server - 微软产品
- PostgreSQL - 开源、功能丰富
- SQLite - 轻量级、嵌入式
1.3 关系型数据库(RDBMS)
关系型数据库 是基于关系模型(二维表)的数据库。
核心概念:
| 概念 | 说明 |
|---|---|
| 表(Table) | 数据以二维表格的形式存储 |
| 行(Row) | 代表一条记录 |
| 列(Column) | 代表一个字段或属性 |
| 主键(Primary Key) | 唯一标识表中每一条记录的列 |
| 外键(Foreign Key) | 用于关联两个表的键 |
1.4 MySQL 简介
MySQL 是最流行的开源关系型数据库管理系统之一。
MySQL 的特点:
- 开源免费(社区版)
- 跨平台(Windows、Linux、macOS)
- 支持多种存储引擎(InnoDB、MyISAM)
- 高并发处理能力
- 简单易用
第二章:SQL 概述
2.1 什么是 SQL?
SQL(Structured Query Language,结构化查询语言) 是用于操作关系型数据库的标准语言。
简单来说,SQL 就是我们与数据库”沟通”的指令。通过 SQL,我们可以:
- 查询数据
- 插入、更新、删除数据
- 创建和管理数据库对象(表、索引等)
- 设置权限
2.2 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 | 权限控制 |
| TCL | Transaction Control Language | COMMIT, ROLLBACK | 事务控制 |
2.3 SQL 书写规范
- SQL 语句以分号
;结尾 - 关键字不区分大小写(建议大写)
- 可以使用空格和缩进增强可读性
-- 例子:查询用户表中的所有数据
SELECT * FROM users;
第三章:增删改查(CRUD)
💻 配套案例:案例1:数据库与表操作 案例2:增删改查
CRUD 是数据库操作的四个核心功能:
- Create(创建/插入)
- Read(读取/查询)
- Update(更新)
- Delete(删除)
3.1 插入数据(INSERT)
语法:
INSERT INTO 表名 (字段1, 字段2, ...) VALUES (值1, 值2, ...);
示例:
-- 插入一条用户记录
INSERT INTO users (name, email, age) VALUES ('张三', 'zhangsan@example.com', 25);
-- 插入多条记录
INSERT INTO users (name, email, age) VALUES
('李四', 'lisi@example.com', 30),
('王五', 'wangwu@example.com', 28);
3.2 查询数据(SELECT)
语法:
SELECT 字段1, 字段2, ... FROM 表名 [WHERE 条件];
示例:
-- 查询所有字段
SELECT * FROM users;
-- 查询指定字段
SELECT name, email FROM users;
-- 带条件查询
SELECT * FROM users WHERE age > 25;
3.3 更新数据(UPDATE)
语法:
UPDATE 表名 SET 字段1 = 值1, 字段2 = 值2 WHERE 条件;
示例:
-- 更新单条记录
UPDATE users SET age = 26 WHERE name = '张三';
-- 批量更新
UPDATE users SET age = age + 1 WHERE age < 30;
⚠️ 注意:UPDATE 语句一定要带 WHERE 条件,否则会更新表中所有记录!
3.4 删除数据(DELETE)
语法:
DELETE FROM 表名 WHERE 条件;
示例:
-- 删除指定记录
DELETE FROM users WHERE id = 1;
-- 删除所有年龄小于 20 的用户
DELETE FROM users WHERE age < 20;
⚠️ 注意:DELETE 语句一定要带 WHERE 条件,否则会删除表中所有记录!
第四章:条件查询与排序
💻 配套案例:案例3:条件查询与排序
4.1 WHERE 条件筛选
WHERE 子句用于筛选满足条件的记录。
比较运算符:
| 运算符 | 说明 |
|——–|——|
| = | 等于 |
| <> 或 != | 不等于 |
| > | 大于 |
| < | 小于 |
| >= | 大于等于 |
| <= | 小于等于 |
逻辑运算符: | 运算符 | 说明 | |——–|——| | AND | 并且 | | OR | 或者 | | NOT | 不等于 |
示例:
-- 查询年龄大于 25 的用户
SELECT * FROM users WHERE age > 25;
-- 查询年龄在 25-30 之间的用户
SELECT * FROM users WHERE age >= 25 AND age <= 30;
-- 查询姓张或者年龄小于 25 的用户
SELECT * FROM users WHERE name LIKE '张%' OR age < 25;
4.2 排序(ORDER BY)
ORDER BY 子句用于对结果集进行排序。
语法:
SELECT 字段 FROM 表名 ORDER BY 字段1 [ASC|DESC], 字段2 [ASC|DESC];
- ASC(默认):升序排列
- DESC:降序排列
4.3 分页(LIMIT)
LIMIT 子句用于限制返回的记录数量,常用于分页。
语法:
SELECT 字段 FROM 表名 LIMIT 数量;
SELECT 字段 FROM 表名 LIMIT 偏移量, 数量;
第五章:聚合函数与分组
💻 配套案例:案例4:聚合统计与分组
5.1 聚合函数
聚合函数用于对一组值进行计算,返回单个值。
| 函数 | 说明 |
|---|---|
| COUNT() | 统计记录数 |
| SUM() | 求和 |
| AVG() | 求平均值 |
| MAX() | 最大值 |
| MIN() | 最小值 |
⚠️ 注意:聚合函数会自动忽略 NULL 值。
5.2 分组(GROUP BY)
GROUP BY 子句用于将数据按照一个或多个字段进行分组。
示例:
-- 按性别分组,统计每组人数
SELECT gender, COUNT(*) FROM users GROUP BY gender;
5.3 HAVING 子句
HAVING 子句用于对分组后的结果进行筛选。
WHERE vs HAVING:
- WHERE:在分组前筛选原始数据
- HAVING:在分组后筛选分组结果
第六章:多表关联查询(JOIN)
💻 配套案例:案例5:多表关联查询
6.1 为什么要用 JOIN?
在实际的数据库设计中,我们通常会将数据分散到多个表中存储,然后通过 JOIN 将这些表关联起来查询。
6.2 JOIN 的类型
┌─────────────┐
│ Table A │
│ (左表) │
└──────┬──────┘
│
┌─────────────────┼─────────────────┐
│ │ │
▼ ▼ ▼
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ INNER JOIN │ │ LEFT JOIN │ │ RIGHT JOIN │
│ (内连接) │ │ (左连接) │ │ (右连接) │
│ │ │ │ │ │
│ A∩B │ │ A │ │ B │
└─────────────┘ └─────────────┘ └─────────────┘
6.3 INNER JOIN(内连接)
返回两个表中都存在的记录。
6.4 LEFT JOIN(左连接)
返回左表中的所有记录,以及右表中匹配的记录。如果右表中没有匹配,则返回 NULL。
6.5 RIGHT JOIN(右连接)
返回右表中的所有记录,以及左表中匹配的记录。
第七章:MySQL 核心特性
7.1 存储引擎
存储引擎是 MySQL 底层负责数据存储和检索的组件。
| 特性 | InnoDB | MyISAM |
|---|---|---|
| 事务支持 | ✅ | ❌ |
| 行级锁 | ✅ | ❌ |
| 表级锁 | ❌ | ✅ |
| 外键 | ✅ | ❌ |
| 适用场景 | 高并发、数据安全 | 只读、静态表 |
建议:对于大多数应用场景,使用 InnoDB 存储引擎。
7.2 索引
索引是帮助 MySQL 高效获取数据的数据结构,类似于书籍的目录。
索引的作用:
- 大幅提高查询速度
- 加快数据检索
- 确保数据的唯一性
⚠️ 注意:索引虽好,但不要滥用。过多的索引会增加写操作的开销。
7.3 事务
事务是数据库操作的最小工作单元,将一组 SQL 语句作为一个整体执行。
事务的四大特性(ACID):
| 特性 | 说明 |
|---|---|
| 原子性(Atomicity) | 事务中的所有操作要么全部成功,要么全部失败回滚 |
| 一致性(Consistency) | 事务执行前后,数据库的完整性约束不被破坏 |
| 隔离性(Isolation) | 并发执行的事务之间互不干扰 |
| 持久性(Durability) | 事务一旦提交,其对数据的修改就是永久性的 |
第八章:Python 操作 MySQL
💻 配套案例:案例6:Python操作MySQL
8.1 安装 pymysql
pip install pymysql
8.2 连接数据库
import pymysql
# 创建数据库连接
db = pymysql.connect(
host="localhost",
user="root",
password="123456",
database="my_database"
)
8.3 执行查询(SELECT)
cursor = db.cursor()
cursor.execute("SELECT * FROM users")
results = cursor.fetchall()
for row in results:
print(row)
8.4 执行插入(INSERT)
sql = "INSERT INTO users (name, email, age) VALUES (%s, %s, %s)"
values = ("张三", "zhangsan@example.com", 25)
cursor.execute(sql, values)
db.commit()
8.5 使用 with 语句自动管理连接
import pymysql
with pymysql.connect(
host="localhost",
user="root",
password="123456",
database="my_database"
) as db:
with db.cursor() as cursor:
cursor.execute("SELECT * FROM users")
results = cursor.fetchall()
# 离开 with 块后连接会自动关闭
课后练习
📝 更多习题:课后习题
-
练习 1:创建一个学生表,包含 id、name、age、gender、score 字段,并插入 5 条数据。
-
练习 2:查询年龄大于 20 的学生,按成绩降序排列。
-
练习 3:按性别分组,统计每个性别的平均成绩。
-
练习 4:创建一个订单表和一个客户表,使用 JOIN 查询客户及其订单。
-
练习 5:使用 Python 编写一个程序,实现对学生表的增删改查操作。
讲义版本:v1.0 更新时间:2026-03-19