MySQL基础-语法篇🐟️

本文是笔者 忘痕 在 B 站学习 MySQL相关课程后整理的笔记,如有疏漏欢迎指正;文章排版与可读性由 DeepSeek-V4-Flash 协助做了优化。
SQL
SQL 全称 Structured Query Language(结构化查询语言),是操作关系型数据库的编程语言,定义了一套操作关系型数据库的统一标准。
SQL 就是「跟数据库对话的语言」:你告诉它要建库、建表、查数据,它按统一的标准去执行。
🎯 概述
这篇是 MySQL 基础 · 语法篇,把 SQL 最常见的四类语句系统捋一遍:从建库建表,到数据的增删改查,再到用户与权限管理。
- DDL:数据库与表的创建、修改、删除,以及常用数据类型
- DML:往表里加数据、改数据、删数据
- DQL:从表里查数据(条件、聚合、分组、排序、分页)
- DCL:管理数据库用户与访问权限
建议的学习路径:
- 先看 SQL 通用语法,掌握书写规则(分号结尾、大小写不敏感、注释)
- 再按 DDL → DML → DQL → DCL 的顺序,把四类语句都过一遍
- 每个语法都配合上面的 SQL 示例亲手敲一遍,记忆会更牢
建 DDL、改 DML、查 DQL、管 DCL。 后文会反复用到这个分类。
1. SQL 通用语法
在学习具体的 SQL 语句之前,先来了解一下 SQL 语言的通用语法。
-
SQL 语句可以单行或多行书写,以分号结尾。
-
SQL 语句可以使用空格 / 缩进来增强语句的可读性。
-
MySQL 的 SQL 语句不区分大小写,关键字建议统一使用 ==小写==,看着更直观。
-
注释:
- 单行注释:
-- 注释内容或# 注释内容 - 多行注释:
/* 注释内容 */
- 单行注释:
关键字统一小写是这篇笔记的风格(小写更直观),MySQL 本身大小写不敏感,两种写法都能正常运行。
2. SQL 分类
SQL 语句根据其功能,主要分为四类:DDL、DML、DQL、DCL。
| 分类 | 全称 | 说明 |
|---|---|---|
| DDL | Data Definition Language | 数据定义语言,用来定义数据库对象(数据库、表、字段) |
| DML | Data Manipulation Language | 数据操作语言,用来对数据库表中的数据进行增删改 |
| DQL | Data Query Language | 数据查询语言,用来查询数据库中表的记录 |
| DCL | Data Control Language | 数据控制语言,用来创建数据库用户、控制数据库的访问权限 |
定义 DDL、改数据 DML、查数据 DQL、管权限 DCL。
3. DDL 数据定义语言
DDL 全称 Data Definition Language(数据定义语言),用来定义数据库对象(数据库、表、字段)。
1. 数据库操作
- 查询所有数据库
show databases ;- 查询当前数据库
select database() ;- 创建数据库
create database [ if not exists ] 数据库名 [ default charset 字符集 ] [ collate 排序规则 ] ;-- 通过 if not exists 参数:数据库不存在才创建,存在则不创建,避免报错。- 删除数据库
drop database [ if exists ] 数据库名 ;-- 删除一个不存在的数据库会报错。加上 if exists:存在才删除,否则不执行。- 切换数据库
use 数据库名 ;-- 操作某一个数据库下的表之前,必须先切换到对应数据库,否则无法操作。2. 表操作 —— 查询与创建
- 查询当前数据库所有表
show tables;- 查看指定表结构
desc 表名 ;-- 可以查看到字段、字段类型、是否可以为 NULL、是否存在默认值等信息。- 查询指定表的建表语句
show create table 表名 ;-- 主要用来查看建表语句,有些参数创建时没指定也会显示,因为它们是数据库的默认值(如存储引擎、字符集)。- 创建表结构
create table 表名( 字段1 字段1类型 [ comment 字段1注释 ], 字段2 字段2类型 [ comment 字段2注释 ], 字段3 字段3类型 [ comment 字段3注释 ], ...... 字段n 字段n类型 [ comment 字段n注释 ]) [ comment 表注释 ] ;[...] 内为可选参数,最后一个字段后面没有逗号。
3. 表操作 —— 数据类型
在上面的建表语句中,指定字段数据类型时用到了 int、varchar。MySQL 中常见的数据类型主要分为三类:数值类型、字符串类型、日期时间类型。
数值类型
| 类型 | 大小 | 有符号 (signed) 范围 | 无符号 (unsigned) 范围 | 描述 |
|---|---|---|---|---|
| tinyint | 1byte | (-128, 127) | (0, 255) | 小整数值 |
| smallint | 2bytes | (-32768, 32767) | (0, 65535) | 大整数值 |
| mediumint | 3bytes | (-8388608, 8388607) | (0, 16777215) | 大整数值 |
| int/integer | 4bytes | (-2147483648, 2147483647) | (0, 4294967295) | 大整数值 |
| bigint | 8bytes | (-2^63, 2^63-1) | (0, 2^64-1) | 极大整数值 |
| float | 4bytes | (-3.402823466 E+38, 3.402823466351 E+38) | 0 和 (1.175494351 E-38, 3.402823466 E+38) | 单精度浮点数值 |
| double | 8bytes | (-1.7976931348623157 E+308, 1.7976931348623157 E+308) | 0 和 (2.2250738585072014 E-308, 1.7976931348623157 E+308) | 双精度浮点数值 |
| decimal | 依赖于M(精度)和D(标度)的值 | 依赖于M(精度)和D(标度)的值 | 依赖于M(精度)和D(标度)的值 | 小数值(精确定点数) |
字符串类型
| 类型 | 大小 | 描述 |
|---|---|---|
| char | 0-255 bytes | 定长字符串(需要指定长度) |
| varchar | 0-65535 bytes | 变长字符串(需要指定长度) |
| tinyblob | 0-255 bytes | 不超过255个字符的二进制数据 |
| tinytext | 0-255 bytes | 短文本字符串 |
| blob | 0-65 535 bytes | 二进制形式的长文本数据 |
| text | 0-65 535 bytes | 长文本数据 |
| mediumblob | 0-16 777 215 bytes | 二进制形式的中等长度文本数据 |
| mediumtext | 0-16 777 215 bytes | 中等长度文本数据 |
| longblob | 0-4 294 967 295 bytes | 二进制形式的极大文本数据 |
| longtext | 0-4 294 967 295 bytes | 极大文本数据 |
char 是 ==定长字符串==:指定长度多长,就固定占用多少个字符,和字段值的实际长度无关;varchar 是 ==变长字符串==:指定的长度是最大占用长度,实际占多少按内容来。
一般来说,char 的性能更高(固定长度好检索);只在长度固定、变化很小的场景用它,其余用 varchar。
日期时间类型
| 类型 | 大小 | 范围 | 格式 | 描述 |
|---|---|---|---|---|
| date | 3 | 1000-01-01 至 9999-12-31 | YYYY-MM-DD | 日期值 |
| time | 3 | -838:59<59>59> 至 838:59<59>59> | HH:MM | 时间值或持续时间 |
| year | 1 | 1901 至 2155 | YYYY | 年份值 |
| datetime | 8 | 1000-01-01 00:00<00>00> 至 9999-12-31 23:59<59>59> | YYYY-MM-DD HH:MM | 混合日期和时间值 |
| timestamp | 4 | 1970-01-01 00:00<01>01> 至 2038-01-19 03:14<07>07> | YYYY-MM-DD HH:MM | 混合日期和时间值,时间戳 |
4. 表操作 —— 修改
- 添加字段
alter table 表名 add 字段名 类型 (长度) [ comment 注释 ] [ 约束 ];- 修改数据类型
alter table 表名 modify 字段名 新数据类型 (长度);- 修改字段名和字段类型
alter table 表名 change 旧字段名 新字段名 类型 (长度) [ comment 注释 ] [ 约束 ];- 删除字段
alter table 表名 drop 字段名;- 修改表名
alter table 表名 rename to 新表名;5. 表操作 —— 删除
- 删除表
drop table [ if exists ] 表名 ;-- 可选项 if exists:表存在才删除,不存在不执行(不加该项则删除不存在的表会报错)。- 删除指定表,并重新创建表
truncate table 表名 ;删除表的时候,表中的全部数据也会被删除,请谨慎操作。
4. DML 数据操作语言
DML 全称 Data Manipulation Language(数据操作语言),用来对数据库中表的数据记录进行增、删、改操作。
DML 主要包含三类操作:添加数据(insert)、修改数据(update)、删除数据(delete)。
1. 添加数据(add / insert)
- 给指定字段添加数据
insert into 表名 (字段名1, 字段名2, ...) values (值1, 值2, ...);- 给全部字段添加数据
insert into 表名 values (值1, 值2, ...);- 批量添加数据
insert into 表名 (字段名1, 字段名2, ...) values (值1, 值2, ...), (值1, 值2, ...), (值1, 值2, ...) ;insert into 表名 values (值1, 值2, ...), (值1, 值2, ...), (值1, 值2, ...) ;- 插入数据时,指定的字段顺序需要与值的顺序一一对应。
- 字符串和日期型数据应该包含在引号中。
- 插入的数据大小应该在字段的规定范围内。
2. 修改数据(update)
- 修改数据的具体语法
update 表名 set 字段名1 = 值1 , 字段名2 = 值2 , .... [ where 条件 ] ;修改语句的条件可以有也可以没有。如果没有 where 条件,会修改整张表的所有数据,使用时一定要小心。
3. 删除数据(delete)
- 删除数据的具体语法
delete from 表名 [ where 条件 ] ;-
delete语句的条件可以有也可以没有,没有条件会删除整张表的所有数据。
-
delete语句不能删除某一个字段的值(可以用update将该字段值置为null即可)。
-
- 进行删除全部数据操作时,DataGrip 会提示询问是否确认删除,直接点击 Execute 即可。
5. DQL 数据查询语言
DQL 全称 Data Query Language(数据查询语言),用来查询数据库中表的记录。核心关键字是 select。
在正常的业务系统中,查询操作的频次要远高于增删改。访问企业官网、电商网站时看到的数据,实际都是从数据库查询并展示出来的;查询过程还可能涉及条件、排序、分页等操作。
1. 完整语法结构
select 字段列表from 表名列表where 条件列表group by 分组字段列表having 分组后条件列表order by 排序字段列表limit 分页参数讲解这部分内容时,会把上面的完整语法拆成以下几个部分:
- 基础查询(不带任何条件)
- 条件查询(where)
- 聚合函数(count、max、min、avg、sum)
- 分组查询(group by)
- 排序查询(order by)
- 分页查询(limit)
2. 基础查询
在基础查询的 DQL 语句中,不带任何查询条件。
- 查询多个字段
select 字段1, 字段2, 字段3 ... from 表名 ;select * from 表名 ;* 号代表查询所有字段,在实际开发中尽量少用(不直观、影响效率)。
- 字段设置别名
select 字段1 [ as 别名1 ] , 字段2 [ as 别名2 ] ... from 表名;select 字段1 [ 别名1 ] , 字段2 [ 别名2 ] ... from 表名;- 去除重复记录
select distinct 字段列表 from 表名;3. 条件查询(where)
- 语法
select 字段列表 from 表名 where 条件列表 ;- 条件
常用的比较运算符如下:
| 比较运算符 | 功能 |
|---|---|
> | 大于 |
>= | 大于等于 |
< | 小于 |
<= | 小于等于 |
= | 等于 |
<> 或 != | 不等于 |
between ... and ... | 在某个范围之内(含最小、最大值) |
in (...) | 在 in 之后的列表中的值,多选一 |
like 占位符 | 模糊匹配(_ 匹配单个字符,% 匹配任意个字符) |
is null | 是 NULL |
常用的逻辑运算符如下:
| 逻辑运算符 | 功能 |
|---|---|
and 或 && | 并且(多个条件同时成立) |
or 或 || | 或者(多个条件任意一个成立) |
not 或 ! | 非,不是 |
4. 聚合函数
-
介绍:将一列数据作为一个整体,进行纵向计算。
-
常见的聚合函数
| 函数 | 功能 |
|---|---|
count | 统计数量 |
max | 最大值 |
min | 最小值 |
avg | 平均值 |
sum | 求和 |
- 语法
select 聚合函数(字段列表) from 表名 ;NULL 值不参与所有聚合函数的运算,容易导致统计结果偏小。
5. 分组查询(group by)
- 语法
select 字段列表 from 表名 [ where 条件 ] group by 分组字段名 [ having 分组后过滤条件 ];where与having的区别
- 执行时机不同:
where是分组之前过滤——不满足 where 条件的不参与分组;having是分组之后对结果过滤。 - 判断条件不同:
where不能对聚合函数进行判断,而having可以。
- 分组之后,查询的字段一般为聚合函数和分组字段,查询其他字段无任何意义。
- 执行顺序:==where > 聚合函数 > having==。
- 支持多字段分组:
group by columnA, columnB。
6. 排序查询(order by)
排序在日常开发中非常常见,有升序排序,也有降序排序。
- 语法
select 字段列表 from 表名 order by 字段1 排序方式1 , 字段2 排序方式2 ;- 排序方式
asc:升序(默认值)desc:降序
- 如果是升序,可以不指定排序方式
asc。 - 多字段排序时,当第一个字段值相同时,才会根据第二个字段进行排序。
7. 分页查询(limit)
分页操作在业务系统开发中非常常见,我们在网站中看到的各式分页条,后台都需要借助数据库的分页操作。
- 语法
select 字段列表 from 表名 limit 起始索引, 查询记录数 ;- 起始索引从 0 开始,
起始索引 = (查询页码 - 1) * 每页显示记录数。 - 分页查询是数据库的方言,不同数据库实现不同;MySQL 中使用
limit。 - 如果查询的是第一页数据,起始索引可以省略,直接简写为
limit 10。
8. 执行顺序
前面讲解了 DQL 语句的完整语法及编写顺序,这里说明 DQL 语句在执行时的先后顺序——也就是先执行哪一部分、后执行哪一部分。

编写顺序(from → where → group by → having → select → order by → limit)和执行顺序并不完全一致:数据库先找到数据(from)、再过滤(where)、再分组聚合(group by / having)、最后才 select 并排序分页。理解了这个,很多「为什么这里不能写别名/where 里不能用聚合函数」的疑惑就解开了。
6. DCL 数据控制语言
DCL 全称 Data Control Language(数据控制语言),用来管理数据库用户、控制数据库的访问权限。
1. 管理用户
- 查询用户
select * from mysql.user;查询结果如下:

其中 Host 代表当前用户访问的主机:如果为 localhost,仅代表只能够在当前本机访问,不可以远程访问;User 代表访问该数据库的用户名。在 MySQL 中需要通过 Host 和 User 来唯一标识一个用户。
- 创建用户
create user '用户名'@'主机名' identified by '密码';- 修改用户密码
alter user '用户名'@'主机名' identified with mysql_native_password by '新密码' ;- 删除用户
drop user '用户名'@'主机名' ;- 在 MySQL 中需要通过
用户名@主机名的方式,来唯一标识一个用户。 - 主机名可以使用
%通配。 - 这类 SQL 开发人员操作得比较少,主要由 DBA(Database Administrator,数据库管理员)使用。
2. 权限控制
MySQL 中定义了很多种权限,常用的有以下几种:
| 权限 | 说明 |
|---|---|
all, all privileges | 所有权限 |
select | 查询数据 |
insert | 插入数据 |
update | 修改数据 |
delete | 删除数据 |
alter | 修改表 |
drop | 删除数据库/表/视图 |
create | 创建数据库/表 |
上述只是简单罗列了常见的几种权限描述,其他权限描述及含义,可以直接参考官方文档。
- 查询权限
show grants for '用户名'@'主机名' ;- 授予权限
grant 权限列表 on 数据库名.表名 to '用户名'@'主机名';- 撤销权限
revoke 权限列表 on 数据库名.表名 from '用户名'@'主机名';- 多个权限之间,使用逗号分隔。
- 授权时,数据库名和表名可以使用
*进行通配,代表所有。
✅ 总结本篇
到这里,MySQL 语法的四类语句就都过了一遍。最后把这趟旅程捋一捋:
一图流回顾
每类一句话
- DDL(定义):建库、建表、定字段类型;围绕
create/alter/drop/truncate展开 - DML(数据):处理表里的数据:增
insert、改update、删delete - DQL(查询):从表里查记录:
select全家桶(条件、聚合、分组、排序、分页) - DCL(权限):管用户与访问权限:
create user、grant、revoke
三个删除别搞混
| 操作 | 作用 | 数据是否删除 | 表结构是否保留 | 特点 |
|---|---|---|---|---|
drop table | 删除整张表 | 删除 | 不保留 | 表和数据都没了 |
truncate table | 清空表 | 删除 | 保留 | 快速清空,不可回滚 |
delete from | 删除记录 | 删除 | 保留 | 可加 where,可回滚 |
高频易错点
- 没有
where的update/delete会改/删整张表,务必加上条件再执行 - 聚合函数不统计 NULL,容易算出偏小的结果
delete只能删整行,不能删某个字段;要把某字段置空用update ... set 字段 = nullwhere在分组前过滤、having在分组后过滤;where不能接聚合函数- 分页
limit的起始索引从 0 开始;limit 10就代表第一页 - 尽量少用
select *(不直观、影响性能),按需列出字段
语法是地基,先把这四类语句记熟,再配合真实数据动手敲,才能真正把 SQL 用起来喵~ 有问题随时回来看这篇笔记。💪
文章分享
如果这篇文章对你有帮助,欢迎分享给更多人!




























