第 1 章 数据库原理
1.1 数据的分类
数据按照结构分为三类:结构化数据、半结构化数据、非结构化数据
- 结构化数据可以使用二维表逻辑表达;格式固定、长度有限,适合关系型数据库存储。 特点:以行为单位,一行代表一个实体;先定义结构,再录入数据。 示例:学生信息表。
- 半结构化数据介于结构化与非结构化中间,自描述结构,结构和数据混合在一起。 特点:先有数据,再有结构。 示例:JSON、XML、HTML、部分 NoSQL 数据库。
- 非结构化数据没有固定格式,无法用二维表表达,整体存储。 示例:音视频、图片、二进制文件。
1.2 数据管理发展历史
数据管理经历人工管理、文件系统、数据库系统三个阶段。
- 人工管理阶段(50 年代中期以前)计算机用于科学计算;存储只有磁带、纸带;无专门管理软件,批处理。
- 文件系统阶段(50 后期‑60 中期)磁盘出现,数据以文件形式长期保存;支持批处理 + 联机实时处理。
- 优点:数据长期保存,有一定独立性。
- 缺点:接口不统一、不支持并发访问、缺少安全控制;数据冗余高,数据之间关联弱。
- 数据库系统阶段(60 年代后期至今)大容量低价磁盘出现;通过 DBMS 数据库管理系统统一管理数据;高共享、低冗余、数据高独立性。
1.3 数据库、DBMS、DBA 概念
- 数据库 (Database):长期保存在计算机、有组织、可共享、统一管理的大量数据集合。
- DBMS 数据库管理系统:操纵、管理数据库的大型软件;负责建库、使用、维护,保障数据库安全性、完整性。
- DBA 数据库管理员:负责数据库全生命周期(设计、测试、部署、运维);目标保障系统稳定、安全、完整、高可用。
- 应用程序:调用数据库完成业务功能的软件。
DBMS 主要特点
- 复杂数据模型,低冗余,支持数据共享;
- 具备物理独立性、逻辑独立性;
- 提供统一查询访问接口;
- 数据和应用解耦;
- 内置并发控制、备份恢复、完整性、安全性保障。
DBMS 七大基本功能
- 数据定义 DDL:定义数据库三级模式、约束;定义信息存放在数据字典。
- 数据操作 DML:实现数据增删改查。
- 数据组织、存储、管理:管理数据字典、用户数据,优化存取效率。
- 数据库运行管理:并发控制、安全权限、完整性校验、事务自动恢复,保障系统正常运行。
- 数据库维护:数据导入导出、转储、重组、性能监控。
- 数据库保护:恢复、并发控制、完整性控制、安全性控制。
- 通信:操作系统交互、网络环境下跨系统互操作。
DBMS 三代发展
- 层次数据库:树状结构,一对多关系;代表 IBM IMS。
- 网状数据库:网状模型,支持多对多关系。
- 关系型数据库 RDBMS:使用二维表格模型。
常见 RDBMS:Oracle、MySQL/MariaDB、SQL Server、PostgreSQL、DB2。
RDBMS 核心术语
- 数据库:关联表的集合
- 表 (table):矩阵,类似电子表格
- 列 (column):同一类型数据集合
- 行 (row / 元组):一条实体记录
- 冗余:重复存储,牺牲性能换取安全性
- 主键 primary key:唯一标识一行,一张表仅一个主键
- 外键 foreign key:用于两张表之间关联
- 复合键:多个列组成索引键
- 索引 index:类似书籍目录,加速查询
- 参照完整性:禁止引用不存在实体,保证数据一致性
1.4 关系型数据库理论
1.4.1 E‑R 实体联系模型
E‑R 图三要素:
- 实体 (Entity,矩形):现实客观事物;同类为实体集。
- 属性 (Attribute,椭圆):实体的特征。
- 联系 (Relationship,菱形):实体之间关联。
1.4.2 实体三种联系
- 一对一 (1:1):A 对应唯一 B,B 对应唯一 A。例:人‑身份证。
- 一对多 (1:n):一个 A 对应多个 B,一个 B 只属于一个 A。例:班级‑学生。
- 多对多 (m:n):A 多条对应 B 多条。例:学生‑课程;数据库需要中间关联表实现多对多。
1.4.3 CRUD
数据库基础操作:
表格
| 缩写 | 英文 | 含义 | SQL 关键字 |
|---|---|---|---|
| C | Create | 新增 | INSERT |
| R | Read | 查询 | SELECT |
| U | Update | 更新 | UPDATE |
| D | Delete | 删除 | DELETE |
1.4.4 范式(数据库规范化)
范式目的:减少数据冗余,提升一致性,范式越高冗余越低。常用:1NF、2NF、3NF,开发一般满足3NF 即可。
- 1NF 第一范式:原子性,字段值不可再拆分;单元格只能存单个值,不能是列表。
- 2NF 第二范式:消除部分依赖(针对复合主键),所有非主键字段必须完全依赖整个主键,不能只依赖主键一部分。
- 3NF 第三范式:消除传递依赖,非主键字段不能互相依赖,不能间接推导。
范式升级规则:满足 3NF 必须先满足 2NF;满足 2NF 必须先满足 1NF。
1.4.5 SQL
SQL 结构化查询语言,关系数据库通用语言;数据库 C/S 架构,客户端发送 SQL 语句,服务端执行返回结果。
第 2 章 MySQL 安装和基本使用
2.1 MySQL 介绍
- 历史起源创始人 Monty Widenius;女儿名字 My,数据库命名 MySQL;孙女名字 Maria,衍生 MariaDB。
- 时间线:1995 MySQL 发布 → 2008 Sun 10 亿美金收购 MySQL → 2009 Oracle 收购 Sun,MySQL 归 Oracle。
- 重要版本节点:
- MySQL4.0:集成 InnoDB 引擎
- MySQL5.0:存储过程、触发器、视图
- MySQL5.5:InnoDB 成为默认存储引擎
- MySQL5.7:大规模性能优化
- MySQL8.0:字符集默认
utf8mb4。
- MySQL 三大分支 1)官方 MySQL:Oracle 维护; 2)MariaDB:Monty 创建,社区驱动,高度兼容 MySQL; 3)Percona Server:Percona 公司,XtraDB 引擎,侧重性能、诊断、在线备份。
- MySQL 特性
- 开源协议,可二次开发;
- 标准 SQL 支持,跨平台,多编程语言驱动;
- 插件式存储引擎,按需选择引擎;
- 单进程多线程模型。
2.2 MySQL 多实例
一台服务器运行多套 MySQL 服务,不同实例监听不同端口(3306、3307、3308),各自独立配置与数据。
- ✅优点:节约硬件、便于测试对比、集中管理备份。
- ❌缺点:资源互相抢占;主机宕机全部实例不可用,存在单点风险。 部署:可使用相同 MySQL 二进制版本,也可不同版本。
2.3 MySQL 组成与常用工具
MySQL 是 C/S 架构,分为服务端、客户端、配套工具。
服务端程序
mysqld:MySQL 核心服务程序。mysqld_safe:安全启动脚本。mysqld_multi:多实例管理工具。
客户端与工具
mysql:交互式 CLI 命令行客户端。mysqldump:逻辑备份工具。mysqladmin:服务管理工具。mysqlimport:数据导入。- myisamchk /myisampack:MyISAM 引擎专用工具。
配置文件
- 主配置:
/etc/my.cnf;包含!includedir /etc/my.cnf.d引入子配置目录 /etc/my.cnf.d/:拆分配置,client.cnf 客户端、mysql‑server.cnf 服务端配置。- 配置读取优先级:
/etc/my.cnf→/etc/mysql/my.cnf→ 用户家目录~/.my.cnf。
2.4 mysql 客户端使用
2.4.1 mysql 命令常用选项
mysql -u用户名 -p密码 -h主机IP -P端口 -Ssocket文件 -D数据库名-e "sql语句":非交互式,执行 SQL 直接退出;适合脚本调用。-E:垂直展示结果;‑H输出 html;‑X输出 xml。‑‑prompt修改命令提示符。
2.4.2 mysql 内交互命令(客户端本地命令,反斜杠 \ 开头)
\? 帮助 \c 清空当前输入 \r 重连 \d 修改语句结束符 \G 垂直输出结果 \q / exit 退出 \. source 执行sql脚本 \s 查看服务器状态信息 \! 执行操作系统shell命令 use 数据库名 切换数据库 tee / notee 开启/关闭输出保存到文件区分:客户端命令(本地执行) vs SQL 服务端命令(发给 mysqld 服务端执行,分号;结尾)。
help contents可以查看服务端 SQL 帮助目录。
2.5 mysqladmin 管理工具
mysqladmin 是本地管理 mysqld 服务的工具,常用功能:
mysqladmin version:查看客户端 + 服务端版本。mysqladmin status / extended‑status:查看运行状态。mysqladmin create / drop 库名:创建、删除数据库。mysqladmin password 新密码:修改 root 密码。mysqladmin shutdown:关闭 MySQL 服务(不能启动)。mysqladmin processlist:查看会话线程。mysqladmin ping:检测数据库服务是否存活。flush‑privileges(reload):刷新权限。
2.6 mycli(第三方增强客户端)
python 开发,语法高亮、自动补全;pip 安装,增强体验。
第 3 章 SQL 语言
3.1 数据库对象
数据库包含多种对象:database 数据库、table 表、index 索引、view 视图、procedure 存储过程、function 存储函数、trigger 触发器、event 事件调度器、user 用户、权限。
3.2 SQL 发展历史
1970 年 Codd 提出关系模型;1974 诞生 SEQUEL,后续改名 SQL;1986 ANSI 标准化 SQL;后续迭代 SQL‑89、SQL‑92、SQL‑1999 等版本。
各数据库不完全 100% 标准兼容;Oracle 有 PL/SQL,SQL Server 有 T‑SQL 方言。
3.3 SQL 书写规范
- SQL 关键字不区分大小写;库名、表名在 Linux 下区分大小写。
- 默认以分号
;作为语句结束符;支持跨行写。 - 注释:
-- 单行注释 /* 多行注释 */ # mysql风格单行注释3.4 SQL 语句五大分类(完整定义、关键字 + 示例)
表格
| 分类 | 全称 | 作用 | 关键字 |
|---|---|---|---|
| DDL | 数据定义语言 Data Definition Language | 定义 / 修改 / 删除数据库对象的结构(库、表、索引、视图等,不操作表里行数据) | CREATE、ALTER、DROP |
| DML | 数据操纵语言 Data Manipulation Language | 操作表内部的行记录数据,增、删、改表数据,不修改表结构 | INSERT、DELETE、UPDATE |
| DQL | 数据查询语言 Data Query Language | 查询表数据,不会修改库和数据,使用频率最高 | SELECT |
| DCL | 数据控制语言 Data Control Language | 用户权限管理,授权、回收权限 | GRANT、REVOKE |
| TCL | 事务控制语言 Transaction Control Language | 管理事务,保证数据一致性,提交、回滚事务 | BEGIN、COMMIT、ROLLBACK、SAVEPOINT |
重要区分:
- DDL:改结构(库、表长什么样);执行会隐式提交事务,DDL 执行完事务自动提交,不能 rollback 回滚 DDL 操作。
- DML:改表里的行数据;InnoDB 引擎下 DML 可以被事务控制,可以回滚。
- DQL:只查不改。
- DCL:管账号权限。
- TCL:专门管事务。
① DDL 数据定义语言(操作对象结构:库、表、索引、视图)
⚠️注意:DDL 执行会隐式提交事务,执行完不能回滚!谨慎执行 drop!
-- 1. CREATE 创建对象 CREATE DATABASE IF NOT EXISTS testdb DEFAULT CHARACTER SET utf8mb4; CREATE TABLE student ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(20) NOT NULL, age INT ); CREATE INDEX idx_stu_name ON student(name); CREATE VIEW v_student AS SELECT id,name FROM student; -- 2. ALTER 修改对象结构 ALTER DATABASE testdb CHARACTER SET utf8mb4; ALTER TABLE student ADD COLUMN gender CHAR(1); ALTER TABLE student MODIFY COLUMN age TINYINT; ALTER TABLE student CHANGE COLUMN gender sex CHAR(1); ALTER TABLE student DROP COLUMN sex; ALTER TABLE student RENAME TO stu; --3. DROP 删除对象,数据彻底丢失 DROP DATABASE IF EXISTS testdb; DROP TABLE IF EXISTS student; DROP INDEX idx_stu_name ON student; DROP VIEW IF EXISTS v_student;② DML 数据操纵语言(操作表行记录,增删改)
InnoDB 引擎,DML 支持事务,可以 COMMIT 提交 / ROLLBACK 回滚;不修改表结构。
-- INSERT 插入数据 INSERT INTO student(name,age) VALUES ('张三',18); INSERT INTO student(name,age) VALUES ('李四',19),('王五',20); -- UPDATE 更新,⚠️不加WHERE更新全表 UPDATE student SET age=22 WHERE id=1; -- DELETE 删除行,⚠️不加WHERE删除全表 DELETE FROM student WHERE id=2; DELETE FROM student;补充:
TRUNCATE TABLE student属于 DDL,清空全表,重建表,隐式提交,不可回滚,速度快于 delete。
③ DQL 数据查询语言 SELECT(只读查询)
SELECT [字段|*] FROM 表名 [WHERE 行过滤] [GROUP BY 分组] [HAVING 分组后过滤] [ORDER BY 排序] [LIMIT 行数]; --示例 SELECT * FROM student; SELECT id,name FROM student WHERE age>18; SELECT age,COUNT(*) FROM student GROUP BY age HAVING COUNT(*)>1; SELECT * FROM student ORDER BY age DESC LIMIT 2;WHERE:分组之前过滤原始行;HAVING:GROUP BY之后过滤分组结果。
④ DCL 数据控制语言(权限管理)
-- GRANT授予权限 GRANT SELECT,INSERT ON testdb.* TO 'user1'@'localhost' IDENTIFIED BY '123456'; GRANT ALL PRIVILEGES ON *.* TO 'admin'@'%' IDENTIFIED BY 'Admin@123'; -- REVOKE回收权限 REVOKE INSERT ON testdb.* FROM 'user1'@'localhost'; REVOKE ALL PRIVILEGES ON *.* FROM 'admin'@'%'; FLUSH PRIVILEGES; --刷新权限生效 --删除用户属于DDL:DROP USER 'user1'@'localhost';⑤ TCL 事务控制语言(仅 InnoDB 支持,MyISAM 不支持事务)
表格
| 关键字 | 作用 |
|---|---|
BEGIN/START TRANSACTION | 开启事务 |
COMMIT | 提交事务,修改永久生效,不可回滚 |
ROLLBACK | 回滚整个事务,撤销全部未提交 DML |
SAVEPOINT 名字 | 事务内创建保存点 |
ROLLBACK TO SAVEPOINT 名字 | 回滚到指定保存点,之前操作保留 |
--普通事务示例 BEGIN; INSERT INTO student(name,age) VALUES ('小明',17); UPDATE student SET age=18 WHERE name='小明'; COMMIT; --提交;或者 ROLLBACK;回滚全部操作 --保存点局部回滚 BEGIN; INSERT INTO student(name,age) VALUES ('A',16); SAVEPOINT sp1; INSERT INTO student(name,age) VALUES ('B',17); SAVEPOINT sp2; INSERT INTO student(name,age) VALUES ('C',18); ROLLBACK TO SAVEPOINT sp2; --撤销C,保留A、B COMMIT; --查看自动提交开关 SHOW VARIABLES LIKE 'autocommit';重要:DDL 会触发隐式
COMMIT;MyISAM 引擎不支持事务。
3.5 字符集与排序规则 collation
- MySQL8.0 默认字符集:utf8mb4,完整支持 4 字节 Unicode(包含全部 emoji 表情)。旧版本默认 latin1。
- 字符集:定义文字怎么二进制存储。
- 排序规则 collation:定义字符的比较、排序规则,依附字符集。
查看命令:
show charset; --查看全部支持字符集 show collation; --查看排序规则 show variables like 'character%'; --查看当前系统字符集变量配置文件my.cnf.d/mysql‑server.cnf修改character‑set‑server修改服务端默认字符集。
3.6 SQL 帮助系统
help contents; --查看全部帮助分类 help Data Definition; --查看DDL分类帮助 help CREATE DATABASE; --查看具体语法帮助