MySQL 5.7 关键字与保留字大全
学习哲学:关键字是 SQL 语言的"词汇表",理解每个关键字的语法角色和使用场景,是写出正确、高效 SQL 的基础。
一、关键字分类总览
MySQL 中的关键字分为两类:
- 保留字(Reserved Words):具有特殊语法含义,不能直接用做标识符(表名、列名),如
SELECT、FROM、WHERE - 非保留字(Non-Reserved Words):虽有特殊含义,但可以用做标识符(不推荐),如
ACTION、ARRAY
注意:即使非保留字,也强烈建议不要用关键字做表名/列名,以免混淆。如果必须用,需用反引号
`包裹,如`SELECT`。
二、数据定义语言(DDL)关键字
2.1 数据库操作
| 关键字 | 作用 | 示例 |
|---|---|---|
| CREATE | 创建数据库对象 | CREATE DATABASE petshop; |
| DATABASE | 指定操作对象是数据库 | CREATE DATABASE test; |
| SCHEMA | 同 DATABASE,可互换 | CREATE SCHEMA test; |
| DROP | 删除数据库对象(⚠️ 危险) | DROP DATABASE test; |
| ALTER | 修改数据库对象结构 | ALTER TABLE pet ADD COLUMN color VARCHAR(50); |
| USE | 切换当前数据库 | USE petshop; |
| SHOW | 查看数据库信息 | SHOW DATABASES; |
| IF EXISTS | 判断是否存在(用于 DROP) | DROP TABLE IF EXISTS temp; |
| IF NOT EXISTS | 判断是否不存在(用于 CREATE) | CREATE TABLE IF NOT EXISTS pet (...); |
| CHARACTER SET | 指定字符集 | CHARACTER SET utf8mb4; |
| COLLATE | 指定排序规则 | COLLATE utf8mb4_unicode_ci; |
2.2 表操作
| 关键字 | 作用 | 示例 |
|---|---|---|
| TABLE | 指定操作对象是表 | CREATE TABLE pet (...); |
| COLUMN | 指定列(可选) | ALTER TABLE pet ADD COLUMN weight FLOAT; |
| INDEX | 创建索引 | CREATE INDEX idx_name ON pet(name); |
| UNIQUE | 唯一索引/约束 | UNIQUE KEY uk_email (email) |
| PRIMARY KEY | 主键约束 | PRIMARY KEY (id) |
| FOREIGN KEY | 外键约束 | FOREIGN KEY (owner_id) REFERENCES owner(id) |
| REFERENCES | 外键引用的表和列 | REFERENCES owner(id) |
| AUTO_INCREMENT | 自增属性 | id INT AUTO_INCREMENT PRIMARY KEY |
| DEFAULT | 默认值 | status TINYINT DEFAULT 1 |
| COMMENT | 注释 | COMMENT '宠物信息表' |
| ENGINE | 指定存储引擎 | ENGINE=InnoDB |
| CHARSET | 简写字符集 | DEFAULT CHARSET=utf8mb4 |
| DESC / DESCRIBE | 查看表结构 | DESC pet; |
| RENAME | 重命名 | RENAME TABLE old TO new; |
| TRUNCATE | 清空表 | TRUNCATE TABLE temp_logs; |
三、数据操作语言(DML)关键字
3.1 查询数据(SELECT)
| 关键字 | 作用 | 示例 |
|---|---|---|
| SELECT | 选择列 | SELECT name, species FROM pet; |
| FROM | 指定数据来源表 | SELECT * FROM pet; |
| WHERE | 过滤条件 | WHERE species = 'dog'; |
| AND | 逻辑与 | WHERE species = 'dog' AND sex = 'M'; |
| OR | 逻辑或 | WHERE species = 'dog' OR species = 'cat'; |
| NOT | 逻辑非 | WHERE NOT species = 'snake'; |
| IN | 在集合中 | WHERE species IN ('dog', 'cat'); |
| NOT IN | 不在集合中 | WHERE species NOT IN ('snake'); |
| BETWEEN | 在范围内 | WHERE birth BETWEEN '2020-01-01' AND '2023-12-31'; |
| LIKE | 模糊匹配 | WHERE name LIKE 'Fl%'; |
| IS NULL | 判断为空 | WHERE death IS NULL; |
| IS NOT NULL | 判断非空 | WHERE death IS NOT NULL; |
| ORDER BY | 排序 | ORDER BY birth DESC; |
| ASC | 升序(默认) | ORDER BY name ASC; |
| DESC | 降序 | ORDER BY birth DESC; |
| LIMIT | 限制返回行数 | LIMIT 5; / LIMIT 0, 10; |
| OFFSET | 跳过前几行 | LIMIT 10 OFFSET 20; |
| DISTINCT | 去重 | SELECT DISTINCT species FROM pet; |
| AS | 起别名 | SELECT name AS 宠物名 FROM pet; |
| ALL | 全部(默认) | SELECT ALL name FROM pet; |
3.2 多表查询关键字
| 关键字 | 作用 | 示例 |
|---|---|---|
| JOIN | 表连接 | SELECT * FROM pet JOIN owner; |
| INNER JOIN | 内连接 | FROM pet INNER JOIN owner ON pet.owner_id = owner.id |
| LEFT JOIN | 左外连接 | FROM pet LEFT JOIN owner ON pet.owner_id = owner.id |
| RIGHT JOIN | 右外连接 | FROM pet RIGHT JOIN owner ON pet.owner_id = owner.id |
| CROSS JOIN | 交叉连接 | FROM pet CROSS JOIN owner |
| ON | 连接条件 | ON pet.owner_id = owner.id |
| USING | 同名列连接简写 | FROM pet JOIN owner USING (owner_id) |
| UNION | 合并结果集(去重) | SELECT ... UNION SELECT ... |
| UNION ALL | 合并结果集(不去重) | SELECT ... UNION ALL SELECT ... |
3.3 聚合与分组
| 关键字 | 作用 | 示例 |
|---|---|---|
| COUNT() | 计数 | COUNT(*) / COUNT(name) |
| SUM() | 求和 | SUM(price) |
| AVG() | 平均值 | AVG(age) |
| MAX() | 最大值 | MAX(birth) |
| MIN() | 最小值 | MIN(birth) |
| GROUP BY | 分组 | GROUP BY species; |
| HAVING | 分组后过滤 | HAVING COUNT(*) > 2; |
| WITH ROLLUP | 分组汇总小计 | GROUP BY species WITH ROLLUP; |
3.4 插入、更新、删除
| 关键字 | 作用 | 示例 |
|---|---|---|
| INSERT | 插入数据 | INSERT INTO pet (name, species) VALUES ('Fluffy', 'cat'); |
| INTO | 指定插入目标 | INSERT INTO pet ... |
| VALUES | 指定值列表 | VALUES ('Fluffy', 'cat'); |
| UPDATE | 更新数据 | UPDATE pet SET name = 'Buddy2' WHERE id = 2; |
| SET | 设置新值 | SET name = 'Buddy2' |
| DELETE | 删除数据 | DELETE FROM pet WHERE id = 2; |
| REPLACE | 替换插入 | REPLACE INTO pet (id, name) VALUES (1, 'New'); |
四、事务控制关键字
| 关键字 | 作用 | 示例 |
|---|---|---|
| START TRANSACTION | 开始事务 | START TRANSACTION; |
| BEGIN | 同 START TRANSACTION | BEGIN; |
| COMMIT | 提交事务 | COMMIT; |
| ROLLBACK | 回滚事务 | ROLLBACK; |
| SAVEPOINT | 设置保存点 | SAVEPOINT sp1; |
| ROLLBACK TO | 回滚到保存点 | ROLLBACK TO sp1; |
| RELEASE SAVEPOINT | 释放保存点 | RELEASE SAVEPOINT sp1; |
| SET autocommit | 设置自动提交 | SET autocommit = 0; |
五、常用函数关键字
5.1 字符串函数
| 函数 | 作用 | 示例 |
|---|---|---|
| CONCAT() | 字符串拼接 | CONCAT(first_name, ' ', last_name) |
| LENGTH() | 返回字节长度 | LENGTH('中文') → 6(utf8mb4 下) |
| CHAR_LENGTH() | 返回字符数 | CHAR_LENGTH('中文') → 2 |
| SUBSTRING() | 截取子串 | SUBSTRING('Hello', 1, 3) → 'Hel' |
| REPLACE() | 替换子串 | REPLACE('Hello', 'l', 'x') → 'Hexxo' |
| UPPER() / LOWER() | 大小写转换 | UPPER('hello') → 'HELLO' |
| TRIM() | 去除两端空格 | TRIM(' hello ') → 'hello' |
| LEFT() / RIGHT() | 从左/右截取 | LEFT('hello', 3) → 'hel' |
| LOCATE() | 查找子串位置 | LOCATE('l', 'hello') → 3 |
| FORMAT() | 格式化数字 | FORMAT(1234567.89, 2) → '1,234,567.89' |
5.2 数值函数
| 函数 | 作用 | 示例 |
|---|---|---|
| ROUND() | 四舍五入 | ROUND(3.14159, 2) → 3.14 |
| CEILING() / FLOOR() | 向上/向下取整 | CEILING(3.2) → 4 |
| ABS() | 绝对值 | ABS(-10) → 10 |
| MOD() | 取模 | MOD(10, 3) → 1 |
| RAND() | 随机数 | RAND() → 0~1 之间 |
| POW() / POWER() | 幂运算 | POW(2, 3) → 8 |
| SQRT() | 平方根 | SQRT(16) → 4 |
5.3 日期时间函数
| 函数 | 作用 | 示例 |
|---|---|---|
| NOW() | 当前日期时间 | 2026-06-10 14:30:00 |
| CURDATE() | 当前日期 | 2026-06-10 |
| CURTIME() | 当前时间 | 14:30:00 |
| DATE() | 提取日期部分 | DATE('2026-06-10 14:30:00') → '2026-06-10' |
| YEAR() / MONTH() / DAY() | 提取年/月/日 | YEAR(NOW()) → 2026 |
| DATEDIFF() | 日期相差天数 | DATEDIFF('2026-06-10', '2026-01-01') |
| DATE_ADD() | 日期加减 | DATE_ADD(NOW(), INTERVAL 7 DAY) |
| DATE_FORMAT() | 格式化日期 | DATE_FORMAT(NOW(), '%Y-%m-%d') |
| UNIX_TIMESTAMP() | 转时间戳 | UNIX_TIMESTAMP(NOW()) |
| FROM_UNIXTIME() | 时间戳转日期 | FROM_UNIXTIME(1717998600) |
5.4 条件与流程函数
| 函数 | 作用 | 示例 |
|---|---|---|
| IF() | 条件判断 | IF(sex='M', '雄', '雌') |
| IFNULL() | NULL 替换 | IFNULL(death, '在世') |
| NULLIF() | 相等返回 NULL | NULLIF(score, 0) |
| CASE WHEN | 多分支条件 | CASE WHEN age < 1 THEN '幼年' ELSE '成年' END |
| COALESCE() | 返回第一个非 NULL | COALESCE(nickname, name, '未知') |
六、权限与安全关键字
| 关键字 | 作用 | 示例 |
|---|---|---|
| GRANT | 授予权限 | GRANT SELECT ON petshop.* TO 'user'@'localhost'; |
| REVOKE | 收回权限 | REVOKE INSERT ON petshop.* FROM 'user'@'localhost'; |
| PRIVILEGES | 所有权限 | GRANT ALL PRIVILEGES ON *.* TO ... |
| IDENTIFIED BY | 设置密码 | IDENTIFIED BY 'password'; |
| WITH GRANT OPTION | 允许转授权限 | GRANT SELECT ON *.* TO user WITH GRANT OPTION; |
| FLUSH PRIVILEGES | 刷新权限 | FLUSH PRIVILEGES; |
七、其他重要关键字
| 关键字 | 作用 | 示例 |
|---|---|---|
| EXPLAIN | 分析执行计划 | EXPLAIN SELECT * FROM pet WHERE id = 1; |
| DESCRIBE / DESC | 查看表结构 | DESC pet; |
| SHOW | 查看信息 | SHOW TABLES; / SHOW INDEX FROM pet; |
| LIKE(SHOW 中) | 模糊匹配对象名 | SHOW TABLES LIKE 'user%'; |
| WHERE(SHOW 中) | 过滤 SHOW 结果 | SHOW COLUMNS FROM pet WHERE Type = 'varchar'; |
| LIMIT | 限制结果数量 | SELECT * FROM pet LIMIT 10; |
| OFFSET | 跳过行数 | SELECT * FROM pet LIMIT 10 OFFSET 20; |
| SQL_CALC_FOUND_ROWS | 计算总行数(配合 FOUND_ROWS()) | SELECT SQL_CALC_FOUND_ROWS * FROM pet LIMIT 10; |
| FOUND_ROWS() | 获取上条 SQL 的总行数 | SELECT FOUND_ROWS(); |
| LAST_INSERT_ID() | 获取最后自增 ID | SELECT LAST_INSERT_ID(); |
| CONNECTION_ID() | 获取当前连接 ID | SELECT CONNECTION_ID(); |
| DATABASE() | 获取当前数据库名 | SELECT DATABASE(); |
| USER() | 获取当前用户 | SELECT USER(); |
| VERSION() | 获取 MySQL 版本 | SELECT VERSION(); |
八、关键字速查索引
8.1 按功能分类速查
【数据定义】
CREATE, DROP, ALTER, RENAME, TRUNCATE
DATABASE, SCHEMA, TABLE, COLUMN, INDEX, VIEW
PRIMARY KEY, FOREIGN KEY, UNIQUE, REFERENCES
AUTO_INCREMENT, DEFAULT, COMMENT, ENGINE, CHARSET
【数据查询】
SELECT, FROM, WHERE, DISTINCT, ALL
AND, OR, NOT, IN, NOT IN, BETWEEN, LIKE, IS NULL, IS NOT NULL
ORDER BY, ASC, DESC, LIMIT, OFFSET
GROUP BY, HAVING, WITH ROLLUP
【表连接】
JOIN, INNER JOIN, LEFT JOIN, RIGHT JOIN, CROSS JOIN
ON, USING, UNION, UNION ALL
【数据操作】
INSERT, INTO, VALUES, UPDATE, SET, DELETE, REPLACE
【事务控制】
START TRANSACTION, BEGIN, COMMIT, ROLLBACK
SAVEPOINT, ROLLBACK TO, RELEASE SAVEPOINT
【权限控制】
GRANT, REVOKE, PRIVILEGES, IDENTIFIED BY, FLUSH PRIVILEGES
8.2 面试高频关键字考点
- [ ]
WHERE和HAVING的区别? - [ ]
INNER JOIN、LEFT JOIN、RIGHT JOIN的结果集差异? - [ ]
UNION和UNION ALL的区别? - [ ]
COUNT(*)和COUNT(列名)的区别? - [ ]
IS NULL为什么不等于= NULL? - [ ]
LIKE '%xxx'和LIKE 'xxx%'哪个能走索引? - [ ]
AUTO_INCREMENT有什么特性?删除后 ID 会复用吗? - [ ]
TRUNCATE和DELETE的区别? - [ ]
EXPLAIN输出中type列的常见值及含义?
九、课后巩固
- 写出查询
pet表中所有不同物种(species)的 SQL。 - 写出将
pet表中所有sex='M'的宠物名字改为大写的 SQL。 - 写出查询每个物种(species)的宠物数量,并按数量降序排列的 SQL。
- 写出查询第 3 页数据(每页 10 条)的 SQL。
WHERE子句中能否使用聚合函数?如果不能,应该用什么?- 解释
IFNULL(death, '在世')的作用。 EXPLAIN命令的作用是什么?