本文基于我在 MySQL 入门阶段的系统学习整理,主要记录数据库与 SQL 的核心概念、常用语法分类以及一些容易忽视的细节,为后续索引、事务与性能优化打基础。
一、数据库的基本认识
1. 数据库与 DBMS
- 数据库(DB):是有组织的存储数据的仓库
- 数据库管理系统(DBMS):则是用来管理数据库的软件(MySQL、Oracle)
- SQL:操作关系型数据库的统一语言(类比机器码:计算机识别的统一语言)
尽管关系型数据库产品众多(MySQL、Oracle、PostgreSQL 等),但SQL 语法是统一标准,这也是关系型数据库易于学习和迁移的重要原因。
2. 关系数据及其特点
- 数据以二维表(行列)的形式组织,可以想象为 excel 的形式
- 表与表之间可以通过外键建立关系
- 结构清晰、规范统一、易于维护
二、SQL 语句
SQL 语句分为四类:DDL、DML、DQL、DCL
| 分类 | 全称 | 说明 |
|---|---|---|
| DDL | Data Definition Language | 数据定义语言,用来定义数据库对象(数据库,表,字段) |
| DML | Data Manipulation Language | 数据操作语言,对数据库表中数据进行增删改 |
| DQL | Data Query Language | 数据查询语言,查询数据库中表的记录 |
| DCL | Data Control | 数据控制语言,用来创建数据库用户、控制数据库访问权限 |
注意:
SQL 不区分大小写,每个语句以分号结尾
DML 中对数据进行删除用的是 delete,而 DDL 中的删除是 drop
三、表结构设计与数据类型选择
1. 常见数据类型
- 数值类型:
int、bigint、decimal - 字符串类型:
char(定长,性能更优)、varchar(变长,更灵活) - 日期时间类型:
date、datetime
2. 表结构设计原则
主键明确,通常使用自增
id字段大小合理,避免浪费
年龄等字段避免负数(无符号或约束)
尽量为字段添加 comment,提高可读性
四、DML:数据增删改
插入数据
- 字段顺序必须和插入值一一对应
- 字符串和日期类型需要使用引号
修改/删除数据
UPDATE/DELETE一定要注意 WHERE 条件,不加条件会影响整张表,这是开发中的高危操作
五、DQL:数据查询
1. 查询的基本语法
1 | SELECT 字段 |
执行顺序:选表、where 过滤、分组、分组过滤、选择字段、排序、分页
2. where 和 having 的区别
WHERE:在分组 之前 过滤数据HAVING:在分组 之后 过滤数据WHERE不能直接使用聚合函数,HAVING可以
3. 分页查询
1 | LIMIT 起始索引, 查询条数 |
起始索引从 0 开始
计算公式:
(页码 − 1) × 每页条数超出范围不会报错,只会返回空结果集
六、约束与外键:保证数据正确性
常见约束
NOT NULL:非空UNIQUE:唯一PRIMARY KEY:主键FOREIGN KEY:外键
外键的意义
- 保证表与表之间的数据一致性
- 防止“脏数据”出现(如员工引用不存在的部门)
实际项目中,是否使用物理外键需要权衡性能与一致性,很多互联网项目选择逻辑外键。
七、多表关系与查询方式
表关系
- 一对多(部门-员工)
- 多对多(学生-课程,需要中间表)
- 一对一(表拆分优化)
多表查询方式
- 内连接 / 左外连接 / 右外连接
- 自连接
- 子查询(标量 / 列 / 行 / 表子查询)
八、事务基础(为后续深入做铺垫)
事务的特性(ACID)
- 原子性
- 一致性
- 隔离性
- 持久性
并发事务问题
- 脏读
- 不可重复读
- 幻读
MySQL 默认隔离级别是 Repeatable Read,在安全性和性能之间取得平衡。
九、今日小结
- 建表过程中,最后一个字段后没有
,其余字段均有, - 每条语句以
;结尾 - 对于数据行的删除用关键字 delete,对于表、数据库、视图的删除用关键字 drop
- 约束条件在数据类型后
- DQL 的执行顺序:选表、where 过滤、分组、分组后过滤、选择字段、排序、分页
- 联合查询是合并两个结果集,子查询是在结果集的基础上在进行查询,子查询的结果集可以作为条件也可以作为表,也可以作为选择字段
- 涉及子查询的复杂查询,可以分步查询,实现目标。
- 并发事务的三大问题:脏读、不可重复读、幻读