数据库基础

目录

前置知识

一、数据库概论

[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 第三阶段(新型数据库))

3、关系型数据库

4、非关系型数据库(NoSQL)

优点

缺点

[对比 Redis 和 Memcached](#对比 Redis 和 Memcached)

[5.关系型 vs 非关系型数据库对比](#5.关系型 vs 非关系型数据库对比)

6、小结

二、数据库安装

[2.1 环境准备](#2.1 环境准备)

2.2、源码解压与依赖

[2.3、CMake 编译配置](#2.3、CMake 编译配置)

[2.4、配置 MySQL](#2.4、配置 MySQL)

权限管理

[修改配置文件 /etc/my.cnf](#修改配置文件 /etc/my.cnf)

2.5、环境变量设置

2.6、数据库初始化

2.7、服务管理

2.8、账号密码管理

[三、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)

  • 定义:操作和管理数据库的软件。

  • 主要功能:

    1. 建库与维护(建表、转储与恢复、重组、性能监视)

    2. 数据定义(数据结构、存储结构、保密模式)

    3. 数据操作(查询、统计、更新)

    4. 运行管理(并发控制、存取控制、维护)

    5. 通信(与其他软件交互,如 Access 和 Office 组件)

数据库系统 是一个人机系统,由硬件、OS、数据库、DBMS、应用软件和数据库用户组成 用户可以通过DBMS或应用程序操作数据库

1.5 数据库系统(DBS)

  • 组成:硬件 + 操作系统 + 数据库 + DBMS + 应用软件 + 用户

  • DBA(数据库管理员):负责备份恢复、维护、用户管理。

  • 数据库应用软件:Navicat、人事管理系统、财务系统、图书管理等。

DBMS 工作模式:

  1. 接收请求

  2. 转换为底层指令

  3. 执行数据库操作

  4. 获取结果

  5. 格式化结果

  6. 返回给用户

数据库发展史

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。

  • 应用场景:高并发、缓存、大数据实时计算。

优点
  1. 格式灵活(Key-Value、文档、图片等)

  2. 速度快(基于内存存储)

  3. 高扩展性

  4. 成本低(开源,部署简单)

缺点
  1. 不支持 SQL

  2. 缺少事务处理

  3. 复杂查询支持不足

  4. 大部分数据在内存,成本较高

对比 Redis 和 Memcached
  • 相同点:都存储热点数据,内存运行,速度快。

  • 不同点:Redis 支持持久化,数据可落盘;Memcache 纯内存,断电丢失。

5.关系型 vs 非关系型数据库对比

|------|-------------------------|---------------------|
| 特点 | 关系型数据库 | 非关系型数据库 |
| 数据结构 | 表(二维表) | KV、文档、列式、图形 |
| 优点 | 结构清晰,SQL通用,支持复杂查询 | 格式灵活,速度快,高并发 |
| 缺点 | 表结构固定,I/O 瓶颈 | 无SQL、事务差、复杂查询弱 |
| 代表产品 | MySQL、Oracle、PostgreSQL | Redis、MongoDB、HBase |

6、小结

  1. 主流数据库系统:关系型(MySQL/Oracle/SQL Server)+ 非关系型(Redis/MongoDB)。

  2. DBMS 的作用:桥梁,负责接收请求、转化指令、执行数据库操作并返回结果。

  3. 选型思路:

    • 数据关系清晰、结构化 → 关系型数据库

    • 高并发、非结构化、大数据分析 → 非关系型数据库

    • 实际应用常常 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  跳过 直接登陆密码
  1. 重启 MySQL 服务并直接登录

  2. 修改密码:

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

  • *.* 表示所有数据库和表

    sql 复制代码
    GRANT 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 所有权限
相关推荐
BD_Marathon8 分钟前
搭建MyBatis框架之创建MyBatis的映射文件(五)
java·数据库·mybatis
汤愈韬9 分钟前
防火墙双机热备技术之VRRP
网络·网络协议·网络安全·security·huawei
橘子真甜~17 分钟前
Reids命令原理与应用5 - Redis 主从同步与高可用集群
运维·网络·数据库·redis·缓存·redis集群·redis高可用
2501_9481949818 分钟前
RN for OpenHarmony AnimeHub项目实战:放送时间表页面开发
数据库·redis·缓存
松涛和鸣22 分钟前
DAY52 7-Segment Display/GPIO/Buttons/Interrupts/Timers/PWM
c语言·数据库·单片机·sqlite·html
想摆烂的不会研究的研究生27 分钟前
每日八股——Redis(3)
数据库·redis·后端·缓存
寂寞恋上夜30 分钟前
数据迁移方案怎么写:迁移策略/回滚方案/验证方法(附完整模板)
网络·数据库·oracle·markdown转xmind·deepseek思维导图
陈让然30 分钟前
WSL2 ubuntu18.04扩容
linux·运维·ubuntu
冉冰学姐39 分钟前
SSM校园学习空间预约系统w314l(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面
数据库·学习·ssm 框架·校园学习空间预约系统·师生双角色
HIT_Weston1 小时前
94、【Ubuntu】【Hugo】搭建私人博客:面包屑(二)
linux·运维·ubuntu