数据库基础

目录

前置知识

一、数据库概论

[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 所有权限
相关推荐
UpYoung!40 分钟前
【Altium Designer2025版】电子设计自动化(EDA)软件——Altium Designe保姆级下载安装详细图文指南(附安装包)
运维·eda·电子工程·altium designer·电路仿真·电子设计·电子设计自动化
可可苏饼干41 分钟前
容器与 Docker
运维·笔记·学习·docker·容器
AI架构师易筋42 分钟前
RAG 与向量数据库是如何工作的:从图书馆比喻到系统架构
数据库
black_blank43 分钟前
综合组网实验
网络·智能路由器·php
鲸沉梦落44 分钟前
网络原理-初识
java·网络
爬山算法1 小时前
Redis(160)Redis的安全问题如何解决?
数据库·redis·安全
可可苏饼干1 小时前
MySQL 索引
运维·数据库·学习·mysql
落日漫游1 小时前
Redis集群与MySQL的对比
数据库·redis·mysql
无代码专家1 小时前
数字化转型下的订单管理全流程优化方案
大数据·运维·人工智能