MySQL基础
MySQL 数据库是 Web 安全学习道路上需要掌握的基础内容之一。
本文内容均为原创整理。为了方便理解,我会尝试打破传统的理解方式,不直接按照”增删改查”的顺序去记忆 SQL,而是从数据库的层级结构与操作对象出发,重新建立一套更容易理解的认知方式。
如果还不了解 MySQL 是什么,可以先自行查阅相关资料了解基本概念。
关于如何搭建 MySQL / MariaDB 练习环境,后续会单独发布教程。
如果代码或文字显示不清,可以点击右下角齿轮切换显示模式。
学习过程中如果遇到问题,可以私聊我,也可以在文章底部留言交流。
了解 MySQL
MySQL 是一个开源的关系型数据库管理系统。
MySQL 后来被 Oracle 收购,目前主要存在 MySQL Community Edition(社区版) 与商业产品线。
MySQL 被 Oracle 收购后,其原始开发团队中的部分成员创建了 MariaDB。MariaDB 是一个开源的关系型数据库管理系统,并且在常见基础 SQL 语法上与 MySQL 具有很高的兼容性。
本文后续的练习环境均使用 MariaDB。
层级结构
在正式学习 SQL 指令之前,我认为首先理解数据库的层级结构非常重要。
数据库里的内容不是平铺乱放的,而是按照外中里嵌套展开:
1 | database(数据库) |
- 最外层:database 数据库
- 中间层:table 数据表
- 最里层:column 字段 与 row 数据行
其中,column 是字段定义,row 是具体的数据记录。
例如:
1 | database:school数据库 |
这里需要特别注意:
column 是描述数据行而存在,row 才是一条具体的数据记录。
所以,为了后面的学习方便,把 database / table / column 归为结构层,把 row 归为数据层。
结构层本身不存储具体数据,只是承担组织、描述和承载数据的载体,我暂时称它为空壳结构。
这里的”空壳”不是说 MySQL 内部真的”什么都没有”,而是指:
结构层本身不是我们最终要存储的数据内容,真正被存储的是数据层里的 row。
同时说明一下:这里的”外中里”是为了方便理解而建立的简化模型,并非数据库内部的严格物理结构。
忘掉增删改查
在正式学习 MySQL 之前,可能或多或少都听过增删改查这四个字。
可真正接触 SQL 后,会遇到更多指令:
1 | CREATE |
很容易产生混乱:
CREATE 和 INSERT 都像是”增加”,到底有什么区别?
DROP 和 DELETE 都像是”删除”,为什么又是两个指令?
原因很简单:
它们操作的对象根本不是同一个层级。
所以在本文中,先忘掉增删改查这个顺序,而是先判断:
我现在操作的,到底是结构,还是数据?
结构层:查创构毁
对 database / table / column 这层结构,操作统一记为查创构毁:
1 | SHOW → 查 |
SHOW:查看CREATE:创建ALTER:重构DROP:销毁
按照实际使用频率与重要程度,暂时按照”查、创、构、毁”递减排列。
数据层:查改插删
对 row 这条具体数据,操作统一记为查改插删:
1 | SELECT → 查 |
SELECT:查看UPDATE:修改INSERT:插入DELETE:删除
同样按照实际使用频率与重要程度,暂时按照”查、改、插、删”递减排列。
于是可以得到一张总览图:
1 | MySQL |
这就是本文后续学习 SQL 的基础认知框架。
最后说点实话:查创构毁、查改插删念起来并不像”增删改查”那样顺口,它们算不上口诀。
但它们的概括性比增删改查强得多:先分清结构与数据,指令自然归位,不会再出现 CREATE 和 INSERT、DROP 和 DELETE 分不清的情况。该记还是要记,这套认知框架也是我整个 SQL 学习体系的核心。
把操作对象先分清,是避免 SQL 指令混淆的第一步。
SQL 语句学习
为了方便理解,接下来的实操可以当成一部《重生之在网络世界中当仓库老板》的小短剧,先把比喻定下来:
- database(数据库):仓库
- table(数据表):仓库里的柜子
- column(字段):柜子上的标签
- row(数据行):柜子里存放的货品
1. show databases; —— 查看数据库
databases 是复数,表示查看所有数据库。
1 | MariaDB [(none)]> show databases; |
刚当上仓库老板,先清点一下自己手上有几个仓库:information_schema、mysql、performance_schema、test。
其中 test 是 MariaDB 自带的测试数据库,拿来练手最合适。
2. use 数据库名; —— 进入数据库
语法:use 数据库名;
1 | MariaDB [(none)]> use test; |
注意提示符从 MariaDB [(none)]> 变成了 MariaDB [test]>,终端回显 Database changed,说明已经成功进入 test 仓库。
3. show tables; —— 查看数据表
语法:show tables;
1 | MariaDB [test]> show tables; |
Empty set 表示这个仓库还是空的,一个柜子都没有。
接下来,我们自己打一个柜子。
4. create table —— 创建数据表
语法:create table 表名(字段1 数据类型, 字段2 数据类型);
如果要自己新建仓库:create database 仓库名;
现在创建一个 users 表,里面有两个字段:id(整数)和 username(字符串)。
int:整数类型varchar(20):字符串类型,最多 20 个字符
1 | MariaDB [test]> create table users (id int, username varchar(20)); |
Query OK 表示创建成功;0 rows affected 表示目前表里还没有数据,因为 create table 创建的是结构,不是数据。
5. show columns from 表名; —— 查看表结构
语法:show columns from 表名;(也可以简写为 desc 表名;)
1 | MariaDB [test]> show columns from users; |
Field 是字段名,Type 是数据类型。
柜子打好了,格子也分好了,现在开始往里面放货。
6. insert into —— 插入数据
语法:insert into 表名(字段1, 字段2) values(值1, 值2);
注意:
insert into是一个整体,into不能省。字符串类型的值要加单引号。
1 | MariaDB [test]> insert into users (id, username) values (1, 'admin'); |
1 row affected 表示成功放进 1 条数据。
一次放多条数据,用逗号分隔:
1 | MariaDB [test]> insert into users (id, username) values (2, 'bytenic'), (3, 'zhangsan'); |
7. select —— 查询数据
语法:select 字段 from 表名;
1 | MariaDB [test]> select * from users; |
只要部分字段,或者加条件,同样是从 select 开始,配合 where 使用:
1 | MariaDB [test]> select id, username from users where id = 1; |
其中:
*是通配符,代表所有字段id/username属于字段(column)1/admin属于数据行(row)中的具体数据
到这里,第二层层级关系也出来了:column -> row。
1 | database(数据库) |
8. update —— 修改数据
语法:update 表名 set 字段 = 新值 where 条件;
假设 admin 充值了 VIP,需要把名字改成 admin_vip:
1 | MariaDB [test]> update users set username = 'admin_vip' where id = 1; |
注意:
where不是语法上的必需项,但必须养成写它的习惯。省略where会修改整张表中所有数据行。
查询确认一下:
1 | MariaDB [test]> select * from users; |
9. delete from —— 删除数据
语法:delete from 表名 where 条件;
把 admin_vip 这条数据删掉:
1 | MariaDB [test]> delete from users where id = 1; |
注意:
delete from是一个整体,from不能省。省略where会清空整张表,这就是”程序员删库跑路”的雏形。
10. alter table —— 重构表结构
结构层的操作还没学完:想给柜子加一个格子,用 alter table。
语法:alter table 表名 add 字段 数据类型;
给 users 表加一个 password 字段:
1 | MariaDB [test]> alter table users add password varchar(20); |
再用 show columns 确认结构变化:
1 | MariaDB [test]> show columns from users; |
alter 不仅能加字段,还能修改字段名、数据类型,甚至删除字段,以后用到再展开。
11. drop —— 销毁结构
最后一个指令:drop,对应结构层的”毁”。
语法:drop table 表名; / drop database 数据库名;
把 users 表销毁:
1 | MariaDB [test]> drop table users; |
警告:
drop销毁的是整个结构,不可恢复。drop database就是真正意义上的”删库”,操作前一定确认清楚。
总结:一张图记住八个指令
回到之前的关系图,现在八个指令全部配齐了:
1 | MySQL |
| 层级 | 认知框架 | 完整指令 |
|---|---|---|
| 结构层 | 查创构毁 | show / create / alter / drop |
| 数据层 | 查改插删 | select / update / insert / delete |
《重生之在网络世界中当仓库老板》顺利杀青。
从建仓库(database)、打柜子(table),到放货(insert into)、查货(select)、改货(update)、退货(delete),再到加格子(alter table)、拆仓库(drop)。
八个指令,八个动作,配合完整语法,全部拿下。




