本文是小编学习 MySQL 基础时的一次整理。如果你刚装好 MySQL,却分不清“服务”“数据库”“表”,或者进了 mysql> 之后不知道下一步敲什么,可以跟着本文用一张学生表走一遍。
目录
这篇先解决一个问题:一条学生信息,怎样从程序里的数据,变成能保存、能查找、能修改的记录?
一、已经有文件了,为什么还需要数据库?
保存三名学生的信息,写进文本文件当然可以。假如后来要找出所有男生,再按学号排序,程序就得自己读文件、拆字段、筛选、排序。再来一个程序同时修改文件,还得处理并发写入和数据一致性。
文件是保存数据的载体;数据库管理系统负责把“如何组织、查询、修改和保护数据”这一整套工作做好。 它最终也要使用磁盘等存储介质,并不是说用了数据库,数据就不在文件里了。
我们平时说的 MySQL,准确地说是一个关系型数据库管理系统(DBMS)。它通过表组织数据,并让我们用 SQL 与数据交互。除了 MySQL,常见的还有 PostgreSQL、Oracle Database、SQL Server、SQLite 等。这里不做“谁更好”的排名,先把 MySQL 的基本使用学明白。
二、MySQL 服务、数据库和表是什么关系?
刚开始接触 MySQL,我最容易把这三个词混在一起。可以先按下面的层次理解:
MySQL 服务(管理数据库的软件进程)
└── mysql_basics_lab 数据库(这次练习的数据集合)
└── student 表
├── 字段:id、name、gender
└── 记录:每一名学生占一行
表是组织数据的结构:一列是一个字段,一行是一条记录。student 表中的 id 是学号,name 是姓名;数据库把相关的表放在一起,MySQL 服务则接收连接、解析 SQL 并管理这些数据库。
这里有个容易忽略的点:连上 MySQL 服务,不等于已经选中了某个数据库。 下面我们就从连接开始。
三、先连接服务,再进入 SQL 世界
下面这行是在操作系统的终端里执行的客户端命令,不是 SQL:
mysql -h 127.0.0.1 -P 3306 -u root -p
-h 指定服务地址,-P 指定端口,-u 指定用户。-p 会让客户端提示输入密码;不要把密码直接拼在命令里。示例假设本机有正在运行的 MySQL 服务,且你有可登录的账号。如果使用的不是 root,把用户名换成自己的账号即可。
连接成功后看到 mysql> 提示符,下面的 CREATE、INSERT、SELECT 才是在这个客户端里输入的 SQL。先看看自己连到了什么版本,以及当前有没有选中数据库:
SELECT VERSION();
SELECT DATABASE();
如果第二条返回 NULL,意思是当前会话还没有默认数据库,不是连接失败。
四、用一张学生表走通“建、增、查、改”
以下示例面向 MySQL 8。建议在自己的练习实例中按顺序执行;已有业务数据的数据库不要直接拿来试。示例 SQL 是供读者复现的教学代码,文中的结果按插入的三条数据推导。
4.1 建库:给练习数据一个位置
CREATE DATABASE mysql_basics_lab
DEFAULT CHARACTER SET utf8mb4;
USE mysql_basics_lab;
SELECT DATABASE();
CREATE DATABASE 建库,USE 把它设为当前会话的默认数据库。最后再查一次,应该得到 mysql_basics_lab。这里显式指定 utf8mb4,是为了让中文等 Unicode 字符有合适的字符集;字符如何比较、排序,还会受到排序规则影响,本篇先不展开。
如果重复执行建库语句,MySQL 会提示数据库已存在。练习前先用 SHOW DATABASES; 看一眼,比随手 DROP DATABASE 更稳妥。
4.2 建表:先约定一行记录长什么样
CREATE TABLE student (
id INT PRIMARY KEY,
name VARCHAR(32) NOT NULL,
gender VARCHAR(2)
) ENGINE = InnoDB;
DESC student;
这张表只有三个字段,先把它们弄清楚:
id是整数,PRIMARY KEY要求它唯一且不能为 NULL。这里由我们手动填写学号。name是最长 32 个字符的变长字符串,NOT NULL表示这一列不能存入NULL。gender用来存“男”或“女”,这个字段只是为了演示筛选。
DESC student; 会显示表结构。此时表已经创建,但里面还没有学生。ENGINE = InnoDB 指定了存储引擎,稍后再解释它的作用。
4.3 插入:把三名学生写成三行
INSERT INTO student (id, name, gender)
VALUES
(1, '张三', '男'),
(2, '李四', '女'),
(3, '王五', '男');
括号里的字段顺序是 id、name、gender,每一组值都要按相同顺序对应。显式写字段名很有必要:以后表里增加一列时,就不必靠猜测整张表的列顺序来插入数据。
这里的 id 是主键,所以再插入一条 id = 1 的记录会报重复键错误。重复运行整个插入语句也会遇到同样的问题,这说明主键约束确实在起作用。
4.4 查询:先看全表,再加条件
SELECT id, name, gender
FROM student
ORDER BY id;
按上面的插入数据,查询应得到三行:1 张三 男、2 李四 女、3 王五 男。这里显式列出字段,读代码时能一眼看出要什么数据。
如果只想看男生:
SELECT id, name
FROM student
WHERE gender = '男'
ORDER BY id;
可以按执行意图理解:从 student 表取数据,用 WHERE 保留性别为“男”的行,按 id 排序,最后显示 id 和 name。本例应得到张三和王五两行。ORDER BY 写在这里很重要;不写排序条件时,不应该把查询返回的先后顺序当成保证。
4.5 修改:WHERE 决定改哪一行
假设张三的名字要改成“张小三”:
UPDATE student
SET name = '张小三'
WHERE id = 1;
SELECT id, name FROM student WHERE id = 1;
第二条查询用来检查修改结果。写 UPDATE 或 DELETE 时,先想清楚条件;漏掉 WHERE,就可能影响表中的所有行。初学时不妨先把条件写成 SELECT 查一遍,确认命中了预期记录,再做修改。
五、回头看:这些 SQL 分别做了什么?
走完例子,再看分类就不容易只剩下一堆缩写:
| 类别 | 负责什么 | 本文中的例子 |
|---|---|---|
| DDL(数据定义) | 建立或改变结构 | CREATE DATABASE、CREATE TABLE;还包括 ALTER、DROP |
| DML(数据操作) | 新增、修改、删除行 | INSERT、UPDATE、DELETE |
| DQL(数据查询) | 读取数据 | SELECT |
| DCL(数据控制) | 管理权限 | GRANT、REVOKE |
有些资料把 SELECT 也放在广义的 DML 中,把 COMMIT、ROLLBACK 单列为事务控制语句(TCL)。分类是帮助我们记住用途的学习工具,不必在名字边界上死记硬背。比如 CREATE TABLE 改的是表结构,INSERT 改的是表中的数据,这个区别更重要。
六、存储引擎:表的数据由谁来存?
我们向 MySQL 服务端发送 SQL,服务端处理请求,再通过存储引擎完成表数据的读写。可以把存储引擎理解为表背后负责存储和访问数据的实现方式。不同引擎提供的能力并不完全相同。
本文建表时选了 InnoDB。它支持事务等能力,是 MySQL 8 常用的默认存储引擎。现在只需要知道:建表语句末尾的 ENGINE = InnoDB 是在明确选择表的存储引擎,不是给数据库起了另一个名字。
在自己的 MySQL 实例中,可以查看可用引擎和表定义:
SHOW ENGINES;
SHOW CREATE TABLE student;
后者还会显示 MySQL 实际记录的表定义。不同版本、配置下,显示的默认字符集和排序规则可能有所不同,所以查看实际结果比猜测更可靠。事务、索引和 InnoDB 的内部结构留到后续文章再讲。
七、刚上手最容易踩的几个坑
- 把终端命令当成 SQL。
mysql -h ...用来启动客户端并连接服务;看到mysql>以后,才输入CREATE TABLE ...;等 SQL。 - 连上了却没有选库。 建表前执行
USE mysql_basics_lab;,拿不准就运行SELECT DATABASE();。 - 漏掉分号。 在 MySQL 命令行里,普通 SQL 通常以
;结束;提示符变成->时,先检查是不是还没输完。 - 重复插入相同主键。
id已经是主键,重复的id = 1会报错;再次练习时先查询已有数据,不要盲目重跑插入段。 - 把旧教程的安装命令照搬到新系统。 课程 PDF 中有 CentOS、Windows 和旧版 MySQL 的安装示例;服务管理命令会随系统和发行版变化。本文把注意力放在通用的库表与 SQL 操作上。
八、总结
MySQL 入门先抓住一条主线:连接 MySQL 服务 → 选择数据库 → 定义表结构 → 插入数据 → 按条件查询和修改。 数据库、表、字段、记录这些概念,在真正敲过一遍 SQL 后会比只背定义清楚得多。
这张学生表还很简单。下一步可以接着研究数据类型与约束,尤其是主键、唯一约束和外键;然后再看索引与事务,理解 MySQL 怎样在数据量增加、多人同时操作时保持可用。
本文是小编巩固数据库基础时的整理,如有错误,欢迎指出。本次分享就到这里,后续继续更新。
参考资料
- MySQL 8.0 Reference Manual:CREATE DATABASE Statement
- MySQL 8.0 Reference Manual:CREATE TABLE Statement
- MySQL 8.0 Reference Manual:SHOW ENGINES Statement
转载自 CSDN-专业IT技术社区
原文链接:https://blog.csdn.net/2401_85487070/article/details/169951490




