目录
[1.1 数据](#1.1 数据)
[1.2 表](#1.2 表)
[1.3 数据库](#1.3 数据库)
[1.4 数据库管理系统(DBMS)](#1.4 数据库管理系统(DBMS))
[1.5 数据库系统(DBS)](#1.5 数据库系统(DBS))
[2.1 第一阶段(层次型/网状型)](#2.1 第一阶段(层次型/网状型))
[2.2 第二阶段(关系型)](#2.2 第二阶段(关系型))
[2.3 第三阶段(新型数据库)](#2.3 第三阶段(新型数据库))
[对比 Redis 和 Memcached](#对比 Redis 和 Memcached)
[5.关系型 vs 非关系型数据库对比](#5.关系型 vs 非关系型数据库对比)
[2.1 环境准备](#2.1 环境准备)
[2.3、CMake 编译配置](#2.3、CMake 编译配置)
[2.4、配置 MySQL](#2.4、配置 MySQL)
[修改配置文件 /etc/my.cnf](#修改配置文件 /etc/my.cnf)
[三、MySQL 数据库管理](#三、MySQL 数据库管理)
[3.1 数据库基本操作](#3.1 数据库基本操作)
[3.1.1 查看数据库信息](#3.1.1 查看数据库信息)
[3.1.2 切换数据库](#3.1.2 切换数据库)
[3.1.3 查看数据库中的表](#3.1.3 查看数据库中的表)
[3.1.4 查看表结构](#3.1.4 查看表结构)
[3.2. 常用数据类型](#3.2. 常用数据类型)
[3.3. 数据库文件存储结构](#3.3. 数据库文件存储结构)
[3.4. SQL 语句分类](#3.4. SQL 语句分类)
[3.5. DDL 操作(数据库和表管理)](#3.5. DDL 操作(数据库和表管理))
[3.5.1 创建数据库](#3.5.1 创建数据库)
[3.5.2 创建数据表](#3.5.2 创建数据表)
[3.5.3 删除表](#3.5.3 删除表)
[3.5.4 删除数据库](#3.5.4 删除数据库)
[3.5.5 修改表结构(ALTER)](#3.5.5 修改表结构(ALTER))
[3.6. DML 操作(表数据管理)](#3.6. DML 操作(表数据管理))
[3.6.1 插入数据](#3.6.1 插入数据)
[3.6.2 更新数据](#3.6.2 更新数据)
[3.6.3 删除数据](#3.6.3 删除数据)
[3.6.4 清空表](#3.6.4 清空表)
[3.7. DQL 操作(数据查询)](#3.7. DQL 操作(数据查询))
[3.7.1 查询数据](#3.7.1 查询数据)
[3.7.2 限制查询结果](#3.7.2 限制查询结果)
[3.7.3 竖向显示结果](#3.7.3 竖向显示结果)
[3.8. 表高级操作](#3.8. 表高级操作)
[3.8.1 临时表](#3.8.1 临时表)
[3.8.2 克隆表](#3.8.2 克隆表)
[3.9. 用户管理](#3.9. 用户管理)
[3.9.1 创建用户](#3.9.1 创建用户)
[3.9.2 查看用户](#3.9.2 查看用户)
[3.9.3 删除用户](#3.9.3 删除用户)
[3.9.4 修改密码](#3.9.4 修改密码)
[3.9.5 忘记 root 密码处理](#3.9.5 忘记 root 密码处理)
[3.10. 用户授权管理](#3.10. 用户授权管理)
[3.10.1 授权用户](#3.10.1 授权用户)
[3.10.2 查看授权](#3.10.2 查看授权)
[3.10.3 撤销权限](#3.10.3 撤销权限)
[3.11. 权限说明](#3.11. 权限说明)
前置知识
-
LAMP / LNMP 架构
-
LAMP = Linux + Apache + MySQL/MariaDB + PHP
-
LNMP = Linux + Nginx + MySQL/MariaDB + PHP
-
-
数据库的定位
-
在企业架构中,数据库用于 存储和管理核心数据
-
示例:
-
微信:聊天文字、语音、视频、图片
-
外卖平台(饿了么/美团):订单、支付、商家数据
-
游戏(绝地求生、王者荣耀):玩家信息、装备、战绩
-
-
一、数据库概论
1.1 数据
-
定义:描述客观事物的符号记录(Data),包括数字、文字、图像、声音等。
-
存储方式:
-
以记录形式存储,统一格式。
-
相同类型的数据存放在一起(如"学生"数据不会和"图书"混在一起)。
-
-
例子:班级同学 → 一名同学是一条记录,每条记录有多个属性(学号、姓名、性别)。
-
数据库的保存形式:
- MySQL 服务 → 数据库 → 数据表 → 行(记录) + 列(字段)
1.2 表
-
表结构= 行(记录) + 列(字段)
-
特点:
-
记录由字段组成,字段由字符/数字组成
-
可供不同用户共享
-
具有较小的冗余度和较高的数据独立性
-
1.3 数据库
- 数据库就是 表的集合,是按照一定组织方式存储的 相关数据集合。
1.4 数据库管理系统(DBMS)
-
定义:操作和管理数据库的软件。
-
主要功能:
-
建库与维护(建表、转储与恢复、重组、性能监视)
-
数据定义(数据结构、存储结构、保密模式)
-
数据操作(查询、统计、更新)
-
运行管理(并发控制、存取控制、维护)
-
通信(与其他软件交互,如 Access 和 Office 组件)
-
数据库系统 是一个人机系统,由硬件、OS、数据库、DBMS、应用软件和数据库用户组成 用户可以通过DBMS或应用程序操作数据库
1.5 数据库系统(DBS)
-
组成:硬件 + 操作系统 + 数据库 + DBMS + 应用软件 + 用户
-
DBA(数据库管理员):负责备份恢复、维护、用户管理。
-
数据库应用软件:Navicat、人事管理系统、财务系统、图书管理等。
DBMS 工作模式:
-
接收请求
-
转换为底层指令
-
执行数据库操作
-
获取结果
-
格式化结果
-
返回给用户
数据库发展史
2.1 第一阶段(层次型/网状型)
- IMS(IBM,1969)
2.2 第二阶段(关系型)
-
关系模型(1970)
-
一位叫 E.F. Codd的 IBM 研究员提出了"关系模型(Relational Model)"。
-
核心思想:
-
把数据放在 二维表(行、列)里,而不是像层次型或网状型那样用复杂的指针去连接。
-
用 数学集合和关系代数来描述和操作数据(比如选择、投影、连接)。
-
-
这样数据就更直观、更容易查询和维护。
代表产品
-
System R(IBM 开发):第一个真正实现关系模型的实验性数据库系统。
-
Ingres(加州大学伯克利):另一个早期的关系型数据库系统,后来衍生出了 PostgreSQL。
意义
-
关系型数据库的出现,让 SQL(结构化查询语言)成为主流。
-
现在常见的 MySQL、Oracle、SQL Server 都是关系型数据库的后代。
-
2.3 第三阶段(新型数据库)
-
特点:面向对象、开放性、多平台
-
SQL + NoSQL 混合使用
-
新兴数据库:MariaDB、PostgreSQL、时序数据库
3、关系型数据库
-
数据模型:E-R 模型(实体-关系)
-
行(记录) = 实体
-
列(字段) = 属性
-
表与表之间存在关系(1对1,1对多,多对多)
-
-
主键:唯一、非空,类比学号/身份证号。
-
常见产品:MySQL、Oracle、SQL Server、DB2、PostgreSQL 等。
4、非关系型数据库(NoSQL)
-
定义:Not Only SQL,存储方式不限于表,可存储键值对、文档、列式数据等。
-
典型产品:Redis、Memcached、MongoDB、HBase。
-
应用场景:高并发、缓存、大数据实时计算。
优点
-
格式灵活(Key-Value、文档、图片等)
-
速度快(基于内存存储)
-
高扩展性
-
成本低(开源,部署简单)
缺点
-
不支持 SQL
-
缺少事务处理
-
复杂查询支持不足
-
大部分数据在内存,成本较高
对比 Redis 和 Memcached
-
相同点:都存储热点数据,内存运行,速度快。
-
不同点:Redis 支持持久化,数据可落盘;Memcache 纯内存,断电丢失。
5.关系型 vs 非关系型数据库对比
|------|-------------------------|---------------------|
| 特点 | 关系型数据库 | 非关系型数据库 |
| 数据结构 | 表(二维表) | KV、文档、列式、图形 |
| 优点 | 结构清晰,SQL通用,支持复杂查询 | 格式灵活,速度快,高并发 |
| 缺点 | 表结构固定,I/O 瓶颈 | 无SQL、事务差、复杂查询弱 |
| 代表产品 | MySQL、Oracle、PostgreSQL | Redis、MongoDB、HBase |
6、小结
-
主流数据库系统:关系型(MySQL/Oracle/SQL Server)+ 非关系型(Redis/MongoDB)。
-
DBMS 的作用:桥梁,负责接收请求、转化指令、执行数据库操作并返回结果。
-
选型思路:
-
数据关系清晰、结构化 → 关系型数据库
-
高并发、非结构化、大数据分析 → 非关系型数据库
-
实际应用常常 SQL + NoSQL 混合使用(如:Redis 缓存 + MySQL 持久化)。
-
数据库是数据的有序集合,DBMS 负责管理,发展历程从关系型到非关系型,实际应用常常结合使用来兼顾数据持久化和高并发性能。
二、数据库安装
2.1 环境准备
bash
yum -y install gcc gcc-c++ ncurses ncurses-devel bison cmake
gcc / gcc-c++:编译工具
ncurses / ncurses-devel:字符终端交互库
bison:语法分析器
cmake:MySQL 编译工具
创建 MySQL 专用用户:
bash
useradd -s /sbin/nologin mysql
2.2、源码解压与依赖
bash
tar zxvf mysql-5.7.17.tar.gz -C /opt
tar zxvf boost_1_59_0.tar.gz -C /usr/local/
mv /usr/local/boost_1_59_0 /usr/local/boost
2.3、CMake 编译配置
进入源码目录:
bash
cd /opt/mysql-5.7.17/
执行 cmake(关键参数):
bash
cmake \
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DMYSQL_UNIX_ADDR=/usr/local/mysql/mysql.sock \
-DSYSCONFDIR=/etc \
-DSYSTEMD_PID_DIR=/usr/local/mysql \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci \
-DWITH_EXTRA_CHARSETS=all \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_ARCHIVE_STORAGE_ENGINE=1 \
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
-DWITH_PERFSCHEMA_STORAGE_ENGINE=1 \
-DMYSQL_DATADIR=/usr/local/mysql/data \
-DWITH_BOOST=/usr/local/boost \
-DWITH_SYSTEMD=1
编译安装:
bash
make -j 4 && make install
⚠️ 注意:如果 CMake 出错,解决后需删除 CMakeCache.txt 再重新执行。
2.4、配置 MySQL
权限管理
bash
chown -R mysql:mysql /usr/local/mysql/
chown mysql:mysql /etc/my.cnf
修改配置文件 /etc/my.cnf
bash
[client]
port = 3306
socket=/usr/local/mysql/mysql.sock
default-character-set=utf8
[mysqld]
user = mysql
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
port = 3306
character-set-server=utf8
pid-file = /usr/local/mysql/mysqld.pid
socket=/usr/local/mysql/mysql.sock
bind-address = 0.0.0.0
skip-name-resolve
max_connections=2048
default-storage-engine=INNODB
max_allowed_packet=16M
server-id = 1
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_AUTO_VALUE_ON_ZERO,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,PIPES_AS_CONCAT,ANSI_QUOTES
[mysql]
port = 3306
default-character-set=utf8
socket=/usr/local/mysql/mysql.sock
auto-rehash
2.5、环境变量设置
bash
echo "PATH=$PATH:/usr/local/mysql/bin" >> /etc/profile
source /etc/profile
2.6、数据库初始化
bash
cd /usr/local/mysql/bin/
./mysqld \
--initialize-insecure \
--user=mysql \
--basedir=/usr/local/mysql \
--datadir=/usr/local/mysql/data
2.7、服务管理
bash
cp /usr/local/mysql/usr/lib/systemd/system/mysqld.service /usr/lib/systemd/system/
systemctl daemon-reload
systemctl start mysqld.service
systemctl enable mysqld
netstat -anpt | grep 3306
2.8、账号密码管理
设置 root 密码:
sql
mysqladmin -u root -p password "123456"
登录:
sql
mysql -u root -p123456
三、MySQL 数据库管理
3.1 数据库基本操作
3.1.1 查看数据库信息
sql
SHOW DATABASES;
用途:显示当前 MySQL 服务器上所有数据库列表。
3.1.2 切换数据库
sql
USE 数据库名;
用途:切换当前操作的数据库。
3.1.3 查看数据库中的表
sql
SHOW TABLES;
SHOW TABLES IN 数据库名;
用途:显示当前数据库或指定数据库的所有表。
3.1.4 查看表结构
sql
DESCRIBE 表名;
3.2. 常用数据类型
| 类型 | 说明 | 示例 |
|---|---|---|
| INT | 整型,存储整数 | id INT |
| FLOAT | 单精度浮点,4 字节,可表示小数 | score FLOAT |
| DOUBLE | 双精度浮点,8 字节 | price DOUBLE |
| CHAR(n) | 固定长度字符类型,长度 n,不够补空格 | name CHAR(10) |
| VARCHAR(n) | 可变长度字符类型,最大 n 个字符 | address VARCHAR(50) |
| TEXT | 文本类型 | description TEXT |
| IMAGE | 图片类型 | photo IMAGE |
| DECIMAL(p,s) | 精确数值类型,p=总长度,s=小数位 | salary DECIMAL(5,2) |
-
CHAR存入长度不足时补空格,超出指定长度低版本截取,高版本报错。 -
主键唯一,可由多个字段组成(联合主键)。
3.3. 数据库文件存储结构
-
MySQL 数据目录:
/usr/local/mysql/data -
每个数据库对应一个子目录,每个表对应若干文件:
-
MyISAM :
.frm(表结构)、.MYD(数据)、.MYI(索引) -
InnoDB:
-
独享表空间:
.ibd文件(每表一个文件) -
共享表空间:
ibdata文件(多个表共用)
-
-
3.4. SQL 语句分类
| 分类 | 功能 | 常用语句 |
|---|---|---|
| DDL(数据定义语言) | 创建/修改/删除数据库对象 | CREATE, DROP, ALTER |
| DML(数据操纵语言) | 增删改表数据 | INSERT, UPDATE, DELETE |
| DQL(数据查询语言) | 查询数据 | SELECT |
| DCL(数据控制语言) | 用户权限管理 | GRANT, REVOKE, COMMIT, ROLLBACK |
3.5. DDL 操作(数据库和表管理)
3.5.1 创建数据库
sql
CREATE DATABASE 数据库名;
3.5.2 创建数据表
sql
CREATE TABLE 表名 (
字段1 数据类型 [约束条件],
字段2 数据类型 [约束条件],
...
PRIMARY KEY (主键字段)
);
3.5.3 删除表
sql
DROP TABLE 表名;
DROP TABLE 数据库名.表名; -- 不切换数据库时使用
3.5.4 删除数据库
sql
DROP DATABASE 数据库名;
3.5.5 修改表结构(ALTER)
sql
-- 修改表名
ALTER TABLE 旧表名 RENAME 新表名;
-- 增加字段
ALTER TABLE 表名 ADD 字段名 数据类型 [约束];
-- 修改字段 切记不要做
ALTER TABLE 表名 CHANGE 旧列名 新列名 数据类型 [约束];
ALTER TABLE 表名 MODIFY COLUMN 字段名 数据类型;
-- 删除字段
ALTER TABLE 表名 DROP 字段名;
3.6. DML 操作(表数据管理)
3.6.1 插入数据
sql
INSERT INTO 表名(字段1,字段2,...) VALUES (值1, 值2, ...);
示例 :
3.6.2 更新数据
sql
UPDATE 表名 SET 字段1=值1[,字段2=值2] WHERE 条件;
示例 :
sql
UPDATE KY13 SET passwd=PASSWORD('') WHERE name='zhangsan';
3.6.3 删除数据
sql
DELETE FROM 表名 WHERE 条件;
3.6.4 清空表
sql
-- 方法1: DELETE
DELETE FROM 表名;
-- 方法2: TRUNCATE
TRUNCATE TABLE 表名;
-
DELETE可带WHERE条件,可回滚,速度慢 id 号 -
TRUNCATE不可回滚,速度快,ID 自增重置
3.7. DQL 操作(数据查询)
3.7.1 查询数据
sql
SELECT 字段1,字段2 FROM 表名 WHERE 条件;
SELECT * FROM 表名; -- 查询所有字段
3.7.2 限制查询结果
sql
SELECT * FROM 表名 LIMIT 起始行, 查询条数;
SELECT * FROM 表名 LIMIT 2; -- 显示前2行
SELECT * FROM 表名 LIMIT 2,3; -- 从第2行后显示3行
3.7.3 竖向显示结果
sql
SELECT * FROM 表名\G
3.8. 表高级操作
3.8.1 临时表
sql
CREATE TEMPORARY TABLE 表名 (...);
-
临时表只存在于当前连接,会在连接关闭时自动销毁
-
可进行增删改查操作
3.8.2 克隆表
sql
-- 仅复制表结构
CREATE TABLE 新表 LIKE 旧表;
-- 复制表结构和数据
CREATE TABLE 新表 AS SELECT * FROM 旧表;
3.9. 用户管理
3.9.1 创建用户
sql
CREATE USER '用户名'@'来源地址' IDENTIFIED BY '密码';
-
localhost:本地登录 -
%:允许任意 IP 登录 -
密码可使用明文或加密方式
3.9.2 查看用户
sql
USE mysql;
SELECT User, Host, authentication_string FROM user;
3.9.3 删除用户
sql
DROP USER '用户名'@'来源地址';
3.9.4 修改密码
sql
SET PASSWORD = PASSWORD('新密码'); -- 当前用户
SET PASSWORD FOR '用户'@'来源地址' = PASSWORD('新密码');
3.9.5 忘记 root 密码处理
修改 /etc/my.cnf 添加:
sql
[mysqld]
skip-grant-tables 跳过 直接登陆密码
-
重启 MySQL 服务并直接登录
-
修改密码:
sql
UPDATE mysql.user SET AUTHENTICATION_STRING=PASSWORD('新密码') WHERE user='root';
FLUSH PRIVILEGES; 刷新权限
3.10. 用户授权管理
3.10.1 授权用户
sql
GRANT 权限列表 ON 数据库.表 TO '用户名'@'来源地址' IDENTIFIED BY '密码';
-
权限示例:
SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, ALTER, INDEX, EXECUTE, ALL -
*.*表示所有数据库和表sqlGRANT SELECT ON school.* TO 'wuyaqian'@'localhost' IDENTIFIED BY 'abc123'; GRANT ALL PRIVILEGES ON *.* TO 'zhangxiaohua'@'%' IDENTIFIED BY '123456';3.10.2 查看授权
sql
SHOW GRANTS FOR '用户名'@'来源地址';
3.10.3 撤销权限
sql
REVOKE 权限列表 ON 数据库.表 FROM '用户名'@'来源地址';
REVOKE ALL ON *.* FROM 'lisi'@'%';
3.11. 权限说明
| 权限 | 功能 |
|---|---|
| SELECT | 查询数据 |
| INSERT | 插入数据 |
| UPDATE | 修改数据 |
| DELETE | 删除数据 |
| CREATE | 创建数据库/表 |
| DROP | 删除数据库/表 |
| INDEX | 建立索引 |
| ALTER | 修改表结构 |
| EXECUTE | 执行存储过程 |
| CREATE VIEW | 创建视图 |
| SHOW VIEW | 查看视图 |
| CREATE ROUTINE | 创建存储过程 |
| ALTER ROUTINE | 修改存储过程 |
| EVENT | 创建事件 |
| TRIGGER | 创建触发器 |
| ALL PRIVILEGES | 所有权限 |