MySQL 关键字总结,并结合 SQL 类型(DDL / DML / DQL / DCL / TCL) 说明每类关键字的作用、使用场景和示例
1. SQL 类型与关键字分类总览
SQL 类型 | 主要作用 | 常用关键字 |
---|---|---|
DDL(数据定义语言) | 定义/修改数据库结构 | CREATE , DROP , ALTER , RENAME , TRUNCATE |
DML(数据操作语言) | 对数据进行增删改 | INSERT , UPDATE , DELETE , REPLACE |
DQL(数据查询语言) | 查询数据 | SELECT , WHERE , GROUP BY , ORDER BY , HAVING , LIMIT , DISTINCT , JOIN |
DCL(数据控制语言) | 控制用户权限 | GRANT , REVOKE |
TCL(事务控制语言) | 控制事务提交和回滚 | COMMIT , ROLLBACK , SAVEPOINT , SET TRANSACTION |
2. 各类关键字详解
2.1 DDL(数据定义语言)
用于定义或更改数据库结构(表、列、索引等)。
关键字 | 作用 | 使用场景 | 示例 |
---|---|---|---|
CREATE | 创建数据库/表/索引等 | 新建表结构 | CREATE TABLE users (id INT, name VARCHAR(50)); |
DROP | 删除数据库/表/视图等 | 永久删除结构 | DROP TABLE users; |
ALTER | 修改表结构 | 添加列、修改列类型、删除列 | ALTER TABLE users ADD email VARCHAR(100); |
RENAME | 修改表/数据库名称 | 更改命名 | RENAME TABLE users TO members; |
TRUNCATE | 清空表数据(不记录日志) | 重置数据表 | TRUNCATE TABLE users; |
2.2 DML(数据操作语言)
用于对表中的数据进行增加、修改和删除。
关键字 | 作用 | 使用场景 | 示例 |
---|---|---|---|
INSERT | 插入数据 | 添加新记录 | INSERT INTO users (name, email) VALUES ('Tom', 'tom@a.com'); |
UPDATE | 更新数据 | 修改已存在记录 | UPDATE users SET email='new@a.com' WHERE id=1; |
DELETE | 删除数据 | 删除记录 | DELETE FROM users WHERE id=1; |
REPLACE | 插入数据(如果主键存在则替换) | 主键冲突自动替换 | REPLACE INTO users (id, name) VALUES (1, 'Jerry'); |
2.3 DQL(数据查询语言)
用于从数据库中查询数据,是使用最频繁的部分。
关键字 | 作用 | 使用场景 | 示例 |
---|---|---|---|
SELECT | 查询数据 | 获取表数据 | SELECT * FROM users; |
DISTINCT | 去重 | 去掉重复记录 | SELECT DISTINCT name FROM users; |
WHERE | 条件过滤 | 筛选数据 | SELECT * FROM users WHERE age > 18; |
GROUP BY | 分组 | 统计数据 | SELECT age, COUNT(*) FROM users GROUP BY age; |
HAVING | 分组后条件过滤 | 筛选聚合结果 | SELECT age, COUNT(*) FROM users GROUP BY age HAVING COUNT(*) > 2; |
ORDER BY | 排序 | 按指定顺序排序 | SELECT * FROM users ORDER BY age DESC; |
LIMIT | 限制结果数量 | 分页 | SELECT * FROM users LIMIT 10 OFFSET 20; |
JOIN | 连接表 | 多表查询 | SELECT * FROM users JOIN orders ON users.id=orders.user_id; |
2.4 DCL(数据控制语言)
用于权限管理。
关键字 | 作用 | 使用场景 | 示例 |
---|---|---|---|
GRANT | 授权 | 给用户赋权限 | GRANT SELECT, INSERT ON mydb.* TO 'user1'@'localhost'; |
REVOKE | 撤销权限 | 收回用户权限 | REVOKE INSERT ON mydb.* FROM 'user1'@'localhost'; |
2.5 TCL(事务控制语言)
用于事务操作,保证数据一致性。
关键字 | 作用 | 使用场景 | 示例 |
---|---|---|---|
START TRANSACTION | 开始事务 | 批量操作前开启事务 | START TRANSACTION; |
COMMIT | 提交事务 | 确认保存更改 | COMMIT; |
ROLLBACK | 回滚事务 | 撤销操作 | ROLLBACK; |
SAVEPOINT | 设置保存点 | 局部回滚 | SAVEPOINT sp1; |
SET TRANSACTION | 设置事务隔离级别 | 改变事务行为 | SET TRANSACTION ISOLATION LEVEL READ COMMITTED; |
3. 注意事项与最佳实践
-
关键字区分场景
-
SELECT
永远不会直接修改数据(查询型) -
INSERT / UPDATE / DELETE
会改数据(要注意事务) -
CREATE / DROP / ALTER
会改结构(不可逆)
-
-
命名避免关键字冲突
如果列名叫order
、desc
这种关键字,需用反引号包裹:SELECT `order` FROM orders;
-
大小写规范
-
关键字 建议全大写(便于和字段区分)
-
表名、字段名建议小写(跨平台兼容)
-
-
事务管理
-
查询用 DQL,不需要事务
-
DML 建议放事务中,避免数据不一致
-
-
性能优化
-
WHERE
前加索引列 -
避免
SELECT *
,改为指定列名
-
4、MySQL 中的关键字 & 保留字(Reserved Keywords)
MySQL 的关键字在语法中具有特殊意义,其中一些是保留字(Reserved),使用它们作为表名或列名时需加反引号(``)引用。下面是部分版本示例:
-
在 MySQL 8.0 中,
UNSIGNED
、ZEROFILL
等都被标记为保留(Reserved)关键字 MySQL开发者专区Oracle Docs。 -
UNSIGNED 在多个版本中都是保留字,包括 5.7、9.0 版本 MySQL开发者专区+1。
MySQL 官方还提供了 INFORMATION_SCHEMA.KEYWORDS
系统表,用于查看当前版本所有关键字及其保留状态 MySQL开发者专区。
5、UNSIGNED
/ SIGNED
/ ZEROFILL
等关键字详解与使用场景
UNSIGNED
-
作用:用于数值类型(如
INT
/BIGINT
)时,移除负值范围,只允许 ≥0 值,并显著提升最大可存储值范围。例如INT
原范围 -2.1B ~ 2.1B,变为0 ~ 4.2B
Stack OverflowPlanetScale。 -
应用场景:适用于主键 ID、计数值等绝不会出现负数的字段。如使用自动自增的
INT
,若不需要负数,推荐加UNSIGNED
,以扩展正值范围 Devart Blog。 -
注意:从 MySQL 8.4 起,对于浮点 (
FLOAT
/DOUBLE
/DECIMAL
),UNSIGNED
已被标记为废弃,建议改用CHECK
约束 MySQL开发者专区。
ZEROFILL
-
作用:在数值展示时左侧自动补零。例如
INT(5) ZEROFILL
,插入42
,会显示为00042
。一般与UNSIGNED
联用。 -
应用场景:适用于固定位数展示要求,如订单号、序列号等视觉格式统一场景。
-
注意:
ZEROFILL
也列为保留关键字,使用时需注意语法兼容与版本支持情况。
SIGNED
-
默认数值类型若未标明,就是有符号(
SIGNED
)。显式写SIGNED
无实际作用,但可作为提醒或与UNSIGNED
对比使用。
6、根据 SQL 类型看关键字使用场景区别
下面是关键字在不同 SQL 类型中的主要用途对照:
SQL 类型 | 关键字示例 | 用途或注意事项 |
---|---|---|
DDL | UNSIGNED , ZEROFILL , CREATE , ALTER , DROP | 定义字段属性(如UNSIGNED 修饰数据类型),以及表结构操作。需注意保留关键字。 |
DML | 无专用关键字 | 修改数据时无需用这些类型修饰关键字。 |
DQL | 无专用关键字 | 查询时通常不使用这些字段属性关键字。 |
DCL / TCL | 无关关键字 | 权限和事务操作与这些关键字无关联。 |
简言之,像 UNSIGNED
/ ZEROFILL
这类关键字主要在 DDL 定义阶段 使用,用来描述列数据类型行为,与数据插入/查询无关。