【MySQL】数据库基础
本博客讲解的前置条件 :已经在CentOS7上安装了适配版本的MySQL,设置了免密登录,并在 my.cnf 中配置了 port=3306、character-set-server=utf8、default-storage-engine=innodb
本文还需区分两种命令窗口:
- Linux Shel l:提示符常类似 root@主机名 \~# 或 用户@主机名 \~$。这里运行 ls、ps、ss、systemctl 等 Linux 命令。
- MySQL 客户端 :提示符通常是 mysql>。这里运行 SELECT、SHOW、CREATE、INSERT 等 SQL
提示 :不要把 SQL 直接敲进普通 Shell ,也不要把 ls、ps 等 Linux 命令直接敲进 mysql> 。如果不确定自己在哪个环境,先看提示符
安全规则 :实验尽量使用普通实验数据库 ;不要随意删除 /var/lib/mysql 下的文件,不要执行来历不明的 rm -rf,不要为了远程连接把 3306 端口开放给整个公网
文章目录
- 【MySQL】数据库基础
-
- [一、 MySQL是啥](#一、 MySQL是啥)
- [二、 MySQL在Linux上怎么运行](#二、 MySQL在Linux上怎么运行)
-
- [1、 MySQL 服务管理](#1、 MySQL 服务管理)
- [2、 连接本机的MySQL](#2、 连接本机的MySQL)
- [3、 远程连接mysql](#3、 远程连接mysql)
- [4、 数据库、表和Linux文件系统的关系](#4、 数据库、表和Linux文件系统的关系)
- [三、 创建学生信息数据库](#三、 创建学生信息数据库)
-
- [1、 创建数据库](#1、 创建数据库)
- [2、 在 helloworld 中建 student 表](#2、 在 helloworld 中建 student 表)
- [3、 插入、查询和统计学生数据](#3、 插入、查询和统计学生数据)
- [四、 存储引擎:MySQL 如何决定表的数据怎样保存?](#四、 存储引擎:MySQL 如何决定表的数据怎样保存?)
-
- 1、MySQL使用的存储引擎
- [2、 常见引擎的入门比较](#2、 常见引擎的入门比较)
- [五、 SQL 分类:看到命令就知道它大概负责什么](#五、 SQL 分类:看到命令就知道它大概负责什么)
- [六、 小练习](#六、 小练习)
一、 MySQL是啥
1、为什么需要数据库?
我们熟知的普通文件 已经能存数据了,为什么我们还需要额外搞个数据库 呢?
想象你正在做一个学生管理系统。你可以把学生信息放在一个文本文件中:
学号,姓名,年龄,性别
1,张三,20,男
2,李四,21,女
3,王五,19,男
这样当然可以保存数据。小规模、结构简单、几乎没人同时修改的场景,普通文件可能完全够用 。真正的难点出现在数据越来越多、查询越来越复杂、多人同时使用、程序突然崩溃的时候
例如 ,老师想查出所有年龄大于 20 岁的学生;管理员想统计人数;两个工作人员同时修改同一位学生的资料;程序写到一半突然断电。若只用普通文本文件,程序就必须自行负责读取、解析、查找、修改、避免覆盖、权限控制、备份和异常恢复等工作
数据库 提供的不是"另一种文件后缀",而是一整套数据管理方案:它定义数据结构,提供查询语言,协调并发操作,管理权限,并借助日志、事务、索引等机制提高可靠性与查询效率
不是"文件不好、数据库一定更好",而是:当数据需要被持续、可靠、多人协作地管理时,数据库通常更合适。
2、数据库、管理系统和表
一些名词解释
| 术语 | 通俗解释 | 更准确的说法 |
|---|---|---|
| 数据(Data) | 具体的信息,例如张三、20、男 | 被记录和处理的事实 |
| 数据库(Database,DB) | 按一定结构组织的数据集合 | 逻辑上的数据组织与容器 |
| 数据库管理系统(DBMS) | 负责管理数据的专门软件 | 提供定义、查询、更新、权限、事务等能力的软件 |
| MySQL | 我们使用的一种数据库管理系统 | 一种关系型数据库管理系统(RDBMS) |
| 表(Table) | 像电子表格一样按行列组织数据 | 由列定义结构、由行保存记录的数据对象 |
| 存储引擎(Storage Engine) | 决定表的数据怎样存、怎样查、怎样维护 | MySQL 用来实现表级存储与访问机制的组件 |
数据库是逻辑组织, 不等于一个固定的 Linux 文件;但在常见的本地部署中,数据库最终会通过数据文件、索引文件、日志等落到磁盘上
3、mysql是客户端,mysqld是服务器
C/S 是 Client/Server 的缩写 ,中文叫"客户端/服务器"模式。它是一种常见的软件组织方式 :客户端提出请求,服务器接收并处理请求,再把结果返回给客户端
客户端像点餐的顾客,服务器像厨房。顾客说"来一份炒饭",厨房负责真正制作,再把结果交给顾客。顾客手里的菜单并不等于厨房,顾客也不需要自己跑进厨房翻找食材。

在 MySQL 里,mysql 通常指命令行客户端程序 ;mysqld 通常指数据库服务器进程 。客户端负责连接、发送 SQL 和展示结果 ;服务器负责验证连接与权限、处理 SQL,并通过存储引擎访问数据
4、MySQL本质上是一种网络服务
其实客户端与服务器不必在同一台电脑上 。客户端可以连接本机的 MySQL,也可以通过网络连接另一台主机上的 MySQL。为了做到这一点,服务器需要在某个网络地址和端口上等待连接
网络服务可以理解为 :一个持续运行、等待请求、按约定规则提供功能的程序。MySQL 服务器通常通过 TCP 连接接收客户端请求,再使用 MySQL 自己的通信协议交换请求和结果
| 概念 | 通俗解释 | 放在 MySQL 场景里 |
|---|---|---|
| 主机(Host) | 运行程序的计算机或虚拟机 | CentOS 7 云服务器 |
| IP 地址 | 网络中用于定位主机网络接口的地址 | 例如 127.0.0.1 或服务器的某个 IP |
| 端口(Port) | 一台主机上区分不同网络服务的编号 | MySQL 常用 TCP 3306 |
| TCP | 提供可靠、有序的字节传输 | 客户端与服务器建立连接后交换数据 |
| 协议(Protocol) | 通信双方约定的数据格式和规则 | MySQL 客户端与服务器理解彼此请求的规则 |
可以把 IP 地址理解为大楼地址,把端口理解为大楼里的窗口编号。只有地址通常还不够,要想找到正确的服务,还需要端口
特别注意 :127.0.0.1 是回环地址 ,意思是"当前这台机器自己" 。如果你是在云服务器的终端里执行命令,127.0.0.1指向云服务器自己,不是你的 Windows 电脑
二、 MySQL在Linux上怎么运行
1、 MySQL 服务管理
我们目前统一使用root账号进行操作
ps 用于查看进程 。进程可以先理解为"正在运行中的程序实例"
如果能看到 mysqld 相关行,说明系统中存在匹配的服务器进程 ;如果没有 ,不要立即重装,继续检查服务状态和实际服务名

which 用来查找命令对应的可执行文件路径 。mysql 与 mysqld 可能位于不同路径,路径也会因安装方式而不同

类似的指令还有
bash
# 查看mysql服务状态(systemd)
systemctl status mysqld
# 停止mysql
systemctl stop mysqld
# 重启mysql
systemctl restart mysqld
# 登录mysql
mysql -uroot -p
2、 连接本机的MySQL

- h 127.0.0.1:连接当前机器的回环地址
- P 3306:连接 3306 端口。注意这里是大写 P
- u root:使用 root 这个 MySQL 用户名
由于我设置了免密登录,这条命令可能直接进入 mysql>。否则就要输入密码才能进入mysql
更简洁的进入mysql方式(省略 - h、-P,默认连本机 3306)

接下来的两条指令都要在mysql内部运行哦
查询当前 MySQL 数据库的版本号

查看 MySQL 服务监听的端口号

3、 远程连接mysql
bash
mysql -h <服务器IP> -P 3306 -u <用户名> -p
尖括号里的文字是占位符,需要替换成真实值 。-p 通常会提示你输入密码。远程连接成功至少需要检查:
- mysqld 正在运行
- 服务器监听了客户端能到达的地址和端口
- 网络路由可达,防火墙或云安全组允许必要的流量
- MySQL 账号允许从对应来源主机连接,并且认证成功
- 客户端和服务器的版本、协议与配置能够正常协作
因此,"MySQL 是网络服务"并不意味着"只要知道 IP 就一定能连上"。网络连通只是条件之一,账号权限和服务配置同样重要
4、 数据库、表和Linux文件系统的关系
现在让我们把视角从网络连接转向数据存储 。MySQL 服务器收到 SQL 后 ,并不是让程序员自己去编辑某个数据文件,而是由服务器调用存储引擎,按照数据库规则管理数据
bash
逻辑上:
MySQL 服务器
├── 数据库 helloworld
│ └── 表 student
└── 数据库 school
├── 表 teacher
└── 表 course
物理上:
Linux 文件系统
└── MySQL 数据目录
├── 系统数据、元数据或日志
├── helloworld 相关数据文件
└── school 相关数据文件
我们可以这么理解 :建立数据库其实就是Linux下的一个目录,而在数据库内建表,本质上就是Linux下创建对应文件
三、 创建学生信息数据库
接下来的内容主要以展示为主,在之后的文章会有更详细地讲解
1、 创建数据库
在 Linux Shell 运行 mysql ,进入客户端后,确认提示符变成 mysql> ,再执行下边的指令
注意:MySQL 靠分号 "; "判断一条语句结束,所以一定要在语句末尾加分号";"
SHOW DATABASES; 该指令可查看 MySQL 中所有数据库

查到的 4 个,都是 MySQL5.7 自带的系统库,不是我们自己建的库,不能随意删除哦
- information_schema:存放数据库元数据(表、字段、权限这些信息)
- mysql:核心系统库,存账号、密码、权限
- performance_schema:性能监控、统计
- sys:简化性能查询,方便 DBA 看性能
CREATE DATABASE helloworld; 创建一个名叫 helloworld 的数据库

USE helloworld; 切换、选中 helloworld 这个数据库,作为当前操作库

MySQL 里操作表之前,必须先用 USE 选中目标数据库;选中之后,后面建表、查数据都是在这个库里面操作
SHOW VARIABLES LIKE 'datadir'; 查看 MySQL 数据文件存放的物理路径

建好 helloworld 数据库,Linux 里面就会在这个路径下生成一个名叫 helloworld 的文件夹,表的数据文件都存在里面
EXIT; 用于退出 MySQL 交互终端;也可以用 QUIT;,效果完全一样

2、 在 helloworld 中建 student 表
学生表可以看成一张电子表格:每一列代表一种属性,每一行代表一名学生
列需要有数据类型,才能约束和解释数据
| SQL 类型/约束 | 通俗解释 | 本实验用途 |
|---|---|---|
| INT | 整数 | 年龄或编号 |
| VARCHAR(32) | 长度上限为 32 个字符的可变长度文本 | 姓名 |
| PRIMARY KEY | 主键,唯一标识每条记录 | 防止两条记录使用相同的 id |
| AUTO_INCREMENT | 自动递增编号 | 插入新学生时自动生成 id |
| ENGINE=InnoDB | 指定表使用 InnoDB 存储引擎 | 学习事务和常见存储方式 |
创建表
先切换到helloworld数据库

CREATE TABLE student创建一张名叫 student(学生表)的表

- id INT AUTO_INCREMENT PRIMARY KEY
INT :整数类型
AUTO_INCREMENT :自增,不用你手动填 id,新增一行自动 + 1
PRIMARY KEY:主键,唯一、非空,用来唯一区分每一条学生记录 - name VARCHAR(32)
VARCHAR(32):变长字符串,最多存 32 个字符,用来存姓名 - age INT:年龄,整数
- gender VARCHAR(2):性别
- 括号外面两个参数 :
ENGINE=InnoDB :存储引擎。InnoDB 支持事务、外键,现在最常用
DEFAULT CHARSET=utf8:默认字符集 utf8,支持存中文
注意关键字、单词之间至少要有一个空格;同一个单词内部不能插空格 ,比如:
CREATE TABLE:CREATE 和 TABLE 之间必须空格,它们是两个独立关键字
student(:student 和 ( 之间,空格可有可无,写不写都行
检查表是否创建成功
SHOW TABLES 查看表名

student 表已经成功建在 helloworld 数据库里面了!
DESCRIBE; 查看列和类型
DESCRIBE 可以简写为 DESC ,两个效果完全一样:DESC student;

3、 插入、查询和统计学生数据
插入几条记录,每执行一条 INSERT,服务器都会处理这条 SQL,并让存储引擎完成相应的数据变更
由于 id 设置了 AUTO_INCREMENT,所以插入语句中没有手动提供 id

查询所有记录
SELECT 表示查询 , * 表示所有列,FROM student 表示从 student 表读取数据。输出的表格是客户端展示的查询结果

带条件查询与统计
WHERE 用于筛选 ,只写 name、age 就只返回指定列;COUNT(*) 统计记录数



敲入 SQL 的地方是客户端 ;真正解析和执行 SQL 的是 mysqld ;数据由存储引擎管理 ;结果再通过连接返回给客户端
四、 存储引擎:MySQL 如何决定表的数据怎样保存?
1、MySQL使用的存储引擎
同样是 MySQL 表,底层可以使用不同的存储引擎
存储引擎负责实现数据如何组织、读取、更新、索引,以及在一定程度上如何支持事务和锁等机制
可以把 MySQL 想象成一家图书馆的管理机构,而存储引擎像不同的资料管理方案:有的更强调事务与可靠性,有的适合特殊用途。选择哪一种,取决于数据和应用的需求
SHOW ENGINES; 用来查看 MySQL 支持的存储引擎,InnoDB 是默认引擎
Support 表示该引擎的支持状态

查看当前默认引擎

2、 常见引擎的入门比较
| 引擎 | 入门理解 | 需要知道的特点 |
|---|---|---|
| InnoDB | 通用场景常用的默认选择 | 支持事务、行级锁、外键等常见能力;使用日志机制支持恢复 |
| MyISAM | 较早版本中常见的非事务型引擎 | 不支持事务;锁粒度和可靠性特征与 InnoDB 不同 |
| MEMORY | 主要把表数据放在内存中 | 重启后表数据通常不保留;适用场景有限 |
| ARCHIVE | 面向归档类场景的引擎 | 特性和可执行操作有局限,适合特定用途 |
| CSV | 以 CSV 格式组织数据的引擎 | 适用范围有限,不应简单等同于完整的关系型数据库能力 |
为什么选择 InnoDB?,因为有以下优势:
- 事务(Transaction):把一组相关操作当作一个整体提交或回滚。
- 并发控制:多个用户同时操作时,尽量协调读写并减少相互干扰。
- 崩溃恢复:借助日志等机制,在异常退出后恢复到符合规则的状态。
- 索引:帮助更快定位数据,但会占用额外空间,也需要在数据更新时维护。
五、 SQL 分类:看到命令就知道它大概负责什么
SQL 是 Structured Query Language(结构化查询语言)。它是我们向数据库表达需求的语言
| 分类 | 英文全称 | 用途 | 常见命令 |
|---|---|---|---|
| DDL | Data Definition Language | 定义或调整数据库对象结构 | CREATE、ALTER、DROP |
| DML | Data Manipulation Language | 插入、修改、删除数据 | INSERT、UPDATE、DELETE |
| DQL | Data Query Language | 查询数据(常单独列出) | SELECT |
| DCL | Data Control Language | 权限控制 | GRANT、REVOKE |
| 事务控制 | Transaction Control | 控制事务提交与回滚 | COMMIT、ROLLBACK |
DROP、DELETE、UPDATE 都可能造成不可逆的数据变化。学习时先确认当前数据库和 WHERE 条件;没有备份时不要在真实业务数据上练习
六、 小练习
请把这些问题用自己的话解释清楚
为什么普通文件可以存数据,但数据库更适合复杂查询、多用户访问和可靠的数据管理?
-
普通文件可以存数据,但数据库更擅长管理数据
-
比如,你要管理一个学校的学生信息。用普通文件(例如 TXT 文件)也可以记录学生的姓名、学号和成绩。但是,如果你想找出所有成绩超过 80 分的学生、统计每个班级的人数,或者让多个老师同时修改学生信息,就需要自己编写很多额外的程序
-
数据库则专门提供了这些功能:
复杂查询 : 可以通过 SQL 快速筛选、统计和排序数据
多用户访问 : 可以协调多个用户同时读取或修改数据
数据可靠性: 可以通过约束、事务、日志和恢复机制等减少数据错误,并在故障后恢复数据
-
但这并不意味着普通文件绝对做不到这些事情,而是数据库已经提供了专门的管理机制,不需要程序员从头实现所有功能
数据库(DB)、数据库管理系统(DBMS)、MySQL、表和存储引擎分别是什么?
-
DB:数据库(Database)
有组织的数据集合。例如,学校的学生信息、课程信息和成绩信息
-
DBMS:数据库管理系统
负责创建、管理和操作数据库的软件。它负责处理查询、修改数据、权限和并发访问等问题
-
MySQL
一种关系型数据库管理系统。我们可以使用 SQL 语句通过它创建表、插入数据和查询数据
-
表(Table)
用行和列组织数据。例如,学生表的一行代表一个学生,一列代表一个字段,比如姓名或学号
-
存储引擎(Storage Engine)
是数据库内部负责具体存储和处理表数据的组件。不同存储引擎具有不同的特性,例如 InnoDB 支持事务
C/S 是什么?为什么 mysql 是客户端,而 mysqld 是服务器端?
- C/S 是 Client/Server 的缩写,意思是客户端/服务器模式
它描述的是一种工作方式:客户端提出请求,服务器接收请求、处理请求,再把结果返回给客户端 - mysql:客户端程序,负责连接数据库服务、发送 SQL 并接收结果
- mysqld:服务器程序,负责处理请求、访问和管理数据库中的数据
两者的区别在于功能角色,而不是是否位于不同的电脑上
IP 地址、端口、TCP 和 MySQL 协议分别解决什么问题?
-
IP 地址告诉我们要找哪台电脑
-
端口告诉我们要找这台电脑上的哪个服务
-
TCP 负责可靠地传输数据
-
MySQL 协议规定双方如何理解和处理这些数据
为什么 127.0.0.1 在云服务器上指向云服务器自己?
- 127.0.0.1 是一个特殊的 IPv4 回环地址,它的特点是:无论在哪台电脑上使用,它指向的都是当前这台电脑自身
- 在云服务器上访问 127.0.0.1:3306,通常是在连接云服务器自己的 MySQL 服务
- 在笔记本电脑上访问 127.0.0.1:3306,是在尝试连接笔记本电脑自己的服务,并不会自动连接到云服务器
CREATE DATABASE、CREATE TABLE、INSERT、SELECT 分别做什么?
-
CREATE DATABASE:创建数据库
-
CREATE TABLE:定义数据表的结构
-
INSERT:向表中添加数据
-
SELECT:查询表中的数据
为什么端口在监听,不代表远程连接一定成功?
端口处于监听状态,只能说明服务正在相应的网络地址和端口上等待连接,并不代表远程客户端一定能够访问。远程连接还受到监听地址、防火墙、安全组、网络连通性以及 MySQL 账号和权限等因素的影响。因此,端口监听是连接成功的一个条件,而不是充分条件