写在前面
在上一篇文章中,我们完成了 CentOS Stream 10 环境下的 MySQL 安装,依次经历了环境准备、配置仓库、安装服务、启动登录和基础验证,搭建起了后续学习数据库所需的基本环境。
环境安装完成只是第一步。数据库究竟是如何组织数据的?安装好的 MySQL 应该怎样使用?如何创建一个数据库、在数据库中创建数据表,再将数据写入表中并查询出来?
这些问题,正是本篇需要解决的内容。
本文以 CentOS Stream 10 为操作环境,以 MySQL 命令行为主要操作入口,从数据库的基本概念出发,逐步完成连接服务器、创建数据库、创建数据表、插入数据和查询数据的完整流程,并进一步认识 SQL 的分类以及 MySQL 的存储引擎。
整个过程不追求一次性学习大量语法,而是先建立起数据库的基本使用流程,为后续学习数据定义、数据查询、表结构设计以及更复杂的 SQL 操作打好基础。
一、从安装完成到真正使用 MySQL
1.1 检查 MySQL 服务状态
上一篇已经完成 MySQL 的安装,本篇不再重复安装过程,而是从确认服务状态开始。
在 CentOS Stream 10 的终端中执行:
sudo systemctl status mysqld
如果服务正常运行,通常可以看到类似以下状态:
Active: active (running)
如果服务尚未启动,可以执行:
sudo systemctl start mysqld
如果希望 MySQL 在系统启动时自动运行,可以执行:
sudo systemctl enable mysqld
这里需要区分三个操作:
-
status:查看服务状态。 -
start:启动服务。 -
enable:设置开机自动启动。
注意:以上服务名适用于上一篇安装的 MySQL Community Server。若实际安装的是其他发行版提供的 MariaDB,服务名称可能不同。
1.2 登录 MySQL 服务器
服务启动后,接下来进入 MySQL 命令行客户端。
在 Linux 终端中执行:
mysql -u root -p
随后输入对应账户的密码。
命令中的参数含义如下:
| 参数 | 含义 |
|---|---|
-u root |
指定登录用户名为 root |
-p |
提示输入密码 |
-h |
指定要连接的主机 |
-P |
指定要连接的端口 |
如果希望明确指定本机地址和端口,也可以使用:
mysql -h 127.0.0.1 -P 3306 -u root -p
其中,127.0.0.1 表示本机地址,3306 是 MySQL 常用的默认端口。
如果不指定主机和端口,客户端通常会按照默认连接方式连接本地服务。具体连接行为也会受到客户端配置和连接方式的影响。
登录成功后,可以看到类似下面的提示符:
mysql>
这意味着我们已经进入 MySQL 命令行环境,可以开始执行 SQL 语句。
需要注意,Linux 终端中的命令和 MySQL 命令行中的 SQL 语句不是同一类指令。前面的 systemctl 用于管理操作系统服务,而 CREATE DATABASE、SELECT 等语句则需要在 MySQL 客户端中执行。
1.3 验证当前数据库环境
进入 MySQL 后,可以先执行上一篇已经接触过的两条语句:
SELECT VERSION();
SHOW DATABASES;
第一条查看当前连接的 MySQL 服务版本,第二条查看当前账户能够看到的数据库。
这里有一个值得注意的细节:能够成功登录 MySQL,并不代表已经选择了某个具体的数据库。
登录服务器只是建立连接;后续创建表、插入数据和查询数据,还需要明确操作的数据库。
退出 MySQL 命令行可以使用:
exit;
或者:
\q
完成退出后,就会回到 CentOS Stream 10 的普通终端。
二、认识数据库:服务器、数据库与数据表
2.1 为什么需要数据库?
既然可以直接把数据保存到文件中,为什么还需要专门的数据库系统?
原因在于,普通文件虽然能够保存数据,但随着数据规模和程序复杂度不断增加,单纯依赖文件管理数据会遇到不少问题。
例如:
-
数据安全与访问权限需要额外设计;
-
查询和管理大量数据不够方便;
-
多个程序同时读写数据时,需要自行处理协调问题;
-
数据结构、数据关系和完整性约束需要额外维护;
-
程序需要自行实现大量数据管理逻辑。
数据库管理系统正是为了解决这些问题而发展起来的。它不仅负责保存数据,还提供了数据组织、查询、更新、权限管理等一系列能力。
数据库并不是简单地把数据放进一个文件,而是通过相应的数据模型和管理机制,让数据能够被更加规范地组织和使用。
2.2 常见数据库管理系统
在学习 MySQL 之前,可以先认识几种常见的数据库管理系统。
| 数据库 | 简要认识 |
|---|---|
| SQL Server | 微软提供的关系型数据库管理系统 |
| Oracle Database | 常用于企业级业务系统的关系型数据库 |
| MySQL | 应用广泛的关系型数据库管理系统 |
| PostgreSQL | 功能丰富的开源关系型数据库管理系统 |
| SQLite | 轻量级数据库,适合嵌入式及本地应用等场景 |
| H2 | 基于 Java 的数据库,可用于嵌入式和测试场景 |
不同数据库在功能、性能、部署方式、生态和适用场景上存在差异。学习数据库时,不必急于比较哪一种绝对更好,而应先掌握共同的基础概念和 SQL 使用方法。
本系列当前以 MySQL 为主线,后续再根据学习进度逐步拓展。
2.3 服务器、数据库与数据表的关系
这是数据库入门阶段非常重要的一个概念。
可以把它们理解为三个层次:
MySQL 服务器
│
├── 数据库 A
│ ├── 数据表 1
│ ├── 数据表 2
│ └── 数据表 3
│
├── 数据库 B
│ ├── 数据表 1
│ └── 数据表 2
│
└── 数据库 C
└── 数据表 1
MySQL 服务器负责运行数据库管理服务,可以管理多个数据库。
数据库用于组织和管理一组相关的数据对象。开发人员通常会根据应用或业务需求划分数据库。
数据表用于按照一定的结构保存具体的数据。例如,学生信息可以保存在学生表中,课程信息可以保存在课程表中。
如果继续向下理解,一张表通常由行和列组成:
-
列描述数据的属性,例如学生编号、姓名、性别。
-
行代表一条具体的数据记录,例如某一名学生的信息。
因此,数据库的基本组织关系可以概括为:
一台数据库服务器可以管理多个数据库,一个数据库可以包含多张数据表,而数据表通过行和列组织具体的数据。
理解这一点之后,后面的 SQL 操作就有了清晰的目标:先选择数据库,再创建和操作其中的数据表。
三、创建数据库并选择数据库
3.1 创建数据库
现在通过实际操作创建一个用于学习的数据库。
在 MySQL 命令行中执行:
CREATE DATABASE helloworld;
这里使用 CREATE DATABASE 创建数据库,helloworld 是数据库名称。
如果执行成功,MySQL 通常会返回类似:
Query OK, 1 row affected
随后可以查看当前账户能够访问的数据库:
SHOW DATABASES;
在结果中找到 helloworld,说明数据库已经创建成功。
为了让重复执行练习语句更加方便,也可以使用:
CREATE DATABASE IF NOT EXISTS helloworld;
IF NOT EXISTS 表示数据库不存在时才创建,避免因为数据库已经存在而出现重复创建错误。
实际项目中还需要根据应用需求合理设置字符集和排序规则。本篇先关注基本操作流程,暂不展开复杂的字符集配置。
3.2 选择数据库
创建数据库之后,还需要明确接下来要在哪个数据库中操作。
执行:
USE helloworld;
如果成功,MySQL 会提示数据库已经切换。
接下来可以执行:
SELECT DATABASE();
该语句用于查看当前选中的数据库。
这里可以总结出一个非常基础的操作流程:
登录 MySQL
↓
查看已有数据库
↓
创建目标数据库
↓
使用目标数据库
↓
创建和操作数据表
这也是后续编写数据库实验和小型项目时经常使用的基本流程。
四、创建第一张数据表
4.1 设计 student 表
接下来在 helloworld 数据库中创建一张学生信息表。
课程资料中的示例包含三个字段:
-
id:学生编号; -
name:学生姓名; -
gender:学生性别。
在此基础上,为了让表结构更加规范,本篇为 id 增加主键约束,并要求 name 不为空。
执行以下 SQL:
CREATE TABLE student (
id INT PRIMARY KEY,
name VARCHAR(32) NOT NULL,
gender VARCHAR(2)
);
这里涉及几个基础数据类型和约束。
| 定义 | 含义 |
|---|---|
INT |
整数类型 |
VARCHAR(32) |
最多保存 32 个字符的可变长度字符串 |
PRIMARY KEY |
主键约束,用于唯一标识一条记录 |
NOT NULL |
不允许该字段为空值 |
其中,id 作为主键,不能出现重复的主键值;name 使用 NOT NULL,表示插入记录时必须提供有效的非空值。
这里需要说明:主键和非空约束是本篇在课程示例基础上补充的内容,便于从一开始建立较规范的表结构设计习惯。
4.2 查看表结构
创建完成后,可以执行:
SHOW TABLES;
该命令用于查看当前数据库中的数据表。
如果结果中出现 student,说明表已经创建成功。
接着查看表的字段定义:
DESC student;
也可以使用:
DESCRIBE student;
两者都可以查看表结构,包括字段名称、数据类型、是否允许为空以及键类型等信息。
如果想查看更加完整的建表语句,可以执行:
SHOW CREATE TABLE student;
至此,我们已经完成了数据库和数据表的创建。
但目前表中还没有学生记录,接下来需要向其中插入数据。
五、向数据表插入数据并查询结果
5.1 插入数据
MySQL 使用 INSERT INTO 向表中插入数据。
例如,依次插入三名学生:
INSERT INTO student (id, name, gender)
VALUES (1, '张三', '男');
INSERT INTO student (id, name, gender)
VALUES (2, '李四', '女');
INSERT INTO student (id, name, gender)
VALUES (3, '王五', '男');
也可以一次插入多条记录:
INSERT INTO student (id, name, gender)
VALUES
(1, '张三', '男'),
(2, '李四', '女'),
(3, '王五', '男');
两种方式都可以完成插入操作。
需要注意:以上两种写法是两种独立的执行方案。如果前面已经插入了这三条数据,就不要再重复执行批量插入语句 ,否则会因为 id 主键重复而产生错误。
5.2 查询数据
插入数据后,可以使用 SELECT 查询表中的记录。
执行:
SELECT * FROM student;
这里的 * 表示查询所有字段。
结果大致如下:
| id | name | gender |
|---|---|---|
| 1 | 张三 | 男 |
| 2 | 李四 | 女 |
| 3 | 王五 | 男 |
至此,我们已经完成了一个完整的数据库基础操作流程:
创建数据库
↓
选择数据库
↓
创建数据表
↓
插入数据
↓
查询数据
5.3 查询指定字段
实际开发中,不一定每次都需要查询所有字段。
例如,只查看学生编号和姓名:
SELECT id, name FROM student;
只需要记住:SELECT 后面指定需要查看的字段,FROM 后面指定数据来源表。
后续学习条件查询、排序、分组以及多表查询时,还会在这个基础上继续扩展。
5.4 更新和删除数据
除了插入和查询,数据库还需要支持修改与删除操作。
修改某名学生的性别:
UPDATE student
SET gender = '女'
WHERE id = 1;
删除编号为 3 的学生记录:
DELETE FROM student
WHERE id = 3;
这里最需要注意的是 WHERE 条件。
如果执行:
UPDATE student SET gender = '女';
就会修改表中所有记录的 gender 字段,而不是只修改某一名学生。
同样,如果执行:
DELETE FROM student;
就会删除表中的所有记录,但不会删除表结构本身。
因此,在实际操作数据之前,尤其是执行 UPDATE 和 DELETE 时,应先确认目标条件。可以先使用对应的 SELECT 语句检查将要影响的记录。
注意: 本节的更新与删除语句用于理解基本操作。若要保留前面插入的原始测试数据,可以暂时不执行它们。
六、SQL 分类:不同语句分别负责什么?
前面已经接触了多条 SQL 语句。随着学习深入,需要逐渐理解不同类型的语句分别承担什么职责。
课程资料主要介绍了数据定义语言、数据操纵语言、数据查询语言和数据控制语言。
6.1 DDL:数据定义语言
DDL 全称为 Data Definition Language,主要用于定义和修改数据库对象的结构。
常见语句包括:
| 语句 | 作用 |
|---|---|
CREATE |
创建数据库、数据表等对象 |
ALTER |
修改数据库对象的结构 |
DROP |
删除数据库对象 |
例如:
CREATE DATABASE demo;
用于创建数据库。
ALTER TABLE student
ADD age INT;
用于向学生表增加一个 age 字段。
DROP 会删除数据库对象,执行前需要特别确认目标对象。
6.2 DML:数据操纵语言
DML 全称为 Data Manipulation Language,主要用于操作表中的数据。
常见语句包括:
| 语句 | 作用 |
|---|---|
INSERT |
插入记录 |
UPDATE |
修改记录 |
DELETE |
删除记录 |
前面的插入、更新和删除示例,都属于这一类操作。
6.3 DQL:数据查询语言
DQL 全称为 Data Query Language,主要用于查询数据。
最常见的语句就是:
SELECT * FROM student;
后续还会学习 WHERE、ORDER BY、GROUP BY、聚合函数以及多表查询等内容。
查询语句不会因为查询本身而删除原表中的记录,因此是日常学习和开发中非常常用的操作。
6.4 DCL 与事务控制
DCL 全称为 Data Control Language,主要涉及权限管理。
例如:
-
GRANT:授予权限; -
REVOKE:撤销权限。
课程资料还将 COMMIT 列入 DCL。需要注意的是,不同教材的分类口径可能存在差异;在不少资料中,COMMIT、ROLLBACK 会被单独归入事务控制命令。
事务控制用于管理一组数据库操作的提交或回滚。当前阶段只需要先建立基本认识,后续学习事务时再深入理解即可。
通过这一部分,可以把前面接触过的 SQL 语句归纳为:
DDL 负责定义结构,DML 负责操纵数据,DQL 负责查询数据,DCL 主要涉及权限控制。
七、认识 MySQL 存储引擎
7.1 什么是存储引擎?
前面创建表时,我们主要关注了字段名称、数据类型和约束。
但数据最终如何存储?数据库如何组织数据、建立索引、更新和查询记录?
这些底层实现与存储引擎有关。
存储引擎可以理解为数据库管理系统在数据存储和访问方面采用的具体实现机制。
MySQL 具有插件式存储引擎架构,可以支持多种存储引擎。不同存储引擎在功能、数据组织方式以及适用场景上可能存在差异。
7.2 查看支持的存储引擎
在 MySQL 命令行中执行:
SHOW ENGINES;
该命令可以查看当前 MySQL 实例支持的存储引擎及相关信息。
如果想查看 student 表的建表信息,可以执行:
SHOW CREATE TABLE student;
在建表语句中,可以关注 ENGINE 相关信息,从而了解这张表使用的存储引擎。
存储引擎并不是创建数据库时需要首先解决的问题,但在后续学习索引、事务、锁和数据库性能时,它会逐渐变得重要。
本篇先认识其概念与查看方法,暂不展开各存储引擎的详细对比。
八、常见问题与排查思路
在实际练习过程中,除了理解 SQL 本身,还需要学会根据错误信息定位问题。
8.1 登录时提示连接失败
首先检查服务状态:
sudo systemctl status mysqld
如果服务没有启动,可以尝试启动:
sudo systemctl start mysqld
如果仍然无法连接,需要进一步检查安装情况、服务日志、端口配置和客户端连接参数。
8.2 提示 Access denied
这类错误通常与认证或权限有关。
需要确认:
-
用户名是否正确;
-
密码是否正确;
-
当前账户是否具有对应的访问权限;
-
连接方式与账户允许的来源是否匹配。
不要因为登录失败就直接重装数据库,应先根据错误信息定位问题。
8.3 提示 Unknown database
例如:
Unknown database 'helloworld'
说明当前操作涉及的数据库不存在,或者名称与实际数据库名称不一致。
可以先执行:
SHOW DATABASES;
确认数据库是否存在,再检查名称拼写。
8.4 提示 Table doesn't exist
如果提示目标数据表不存在,可以依次执行:
SELECT DATABASE();
SHOW TABLES;
前者确认当前选中的数据库,后者查看其中的数据表。
很多初学者容易忽略当前数据库这一层,导致明明创建过表,却在另一个数据库中执行查询。
8.5 SQL 语句没有正常执行
大部分 SQL 语句需要使用分号 ; 结束。
例如:
SELECT * FROM student;
如果语句没有结束,客户端可能会继续等待输入。
遇到输入错误、想取消当前尚未完成的语句时,可以在 MySQL 命令行中输入
\c
取消当前输入,重新编写正确的 SQL。
写在最后
从上一篇的环境安装,到本篇的数据库基础操作,学习重点已经从搭建环境转向实际使用数据库。
这一步看似只是执行了几条 SQL,但背后建立的是一套非常重要的认识:数据库服务器负责提供服务,数据库组织相关的数据对象,数据表按照行和列保存记录,而 SQL 则负责定义结构、操纵数据、查询数据以及管理权限。
后续无论是完成数据库课程实验,还是开发 Web 项目,都需要在这些基础上继续深入。
对我而言,目前的学习仍然以学校课程为主,同时推进 C++、Linux 和数据库相关内容。课程较多,整体进度不会特别快,因此更适合把每个知识点真正理解、动手验证,再逐步沉淀成可以复习和复现的技术文章。
下一篇将继续围绕数据库基础展开,在当前创建数据库和数据表的基础上,逐步深入 SQL 语句的使用,让这些基础操作真正成为后续数据库学习和项目实践的起点。
本篇核心知识点回顾:
-
MySQL 服务状态检查与命令行登录;
-
服务器、数据库、数据表之间的关系;
-
CREATE DATABASE、USE、CREATE TABLE; -
INSERT、SELECT、UPDATE、DELETE; -
DDL、DML、DQL、DCL 的基本分类;
-
SHOW ENGINES与存储引擎的初步认识。
数据库学习不必急于追求复杂查询。先把环境、结构和基本操作打牢,后续再逐步进入 SQL 查询、表关系、索引与事务,学习路线会更加清晰。