MySQL作为最流行的关系型数据库之一,其关键字体系构成了SQL语句的骨架。这些保留字在数据库操作中具有特殊含义,从基础的增删改查到高级的优化控制,贯穿整个数据库生命周期。根据MySQL 8.0官方文档统计,完整的保留字列表超过400个,但实际开发中高频使用的核心关键字约在50个左右。
注意:使用关键字作为表名或列名时,必须用反引号(
)包裹,例如select、order`等,否则会引发语法错误。
SELECT:数据查询的核心命令,配合FROM指定数据源。实际开发中90%的查询都会用到以下组合:
sql复制SELECT [DISTINCT] 列名
FROM 表名
[WHERE 条件]
[GROUP BY 分组]
[HAVING 分组过滤]
[ORDER BY 排序]
[LIMIT 限制行数]
INSERT:插入数据有三种语法变体:
sql复制-- 完整列插入
INSERT INTO 表名 VALUES (值1,值2,...)
-- 指定列插入
INSERT INTO 表名(列1,列2) VALUES (值1,值2)
-- 批量插入(性能最优)
INSERT INTO 表名 VALUES
(值1,值2,...),
(值1,值2,...)
UPDATE:更新数据必须带WHERE条件,否则会全表更新:
sql复制UPDATE 表名 SET 列1=值1,列2=值2
WHERE 条件
DELETE:删除操作风险最高,建议先用SELECT验证条件:
sql复制DELETE FROM 表名 WHERE 条件
事务四大特性(ACID)的实现依赖以下命令:
典型用法:
sql复制START TRANSACTION;
UPDATE accounts SET balance=balance-100 WHERE user='A';
UPDATE accounts SET balance=balance+100 WHERE user='B';
-- 若执行到此无异常
COMMIT;
-- 若出现错误
ROLLBACK;
CREATE:创建数据库对象的基础命令,常见变体:
sql复制CREATE DATABASE 库名 CHARACTER SET utf8mb4;
CREATE TABLE 表名 (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50) NOT NULL,
INDEX idx_name (name)
) ENGINE=InnoDB;
ALTER:修改表结构时使用,高频操作包括:
ALTER TABLE 表名 ADD COLUMN 列名 数据类型ALTER TABLE 表名 MODIFY COLUMN 列名 新数据类型ALTER TABLE 表名 ADD INDEX 索引名(列名)DROP:删除数据库对象,生产环境慎用:
sql复制DROP TABLE [IF EXISTS] 表名;
DROP DATABASE 库名;
示例:
sql复制CREATE TABLE orders (
order_id INT PRIMARY KEY,
user_id INT,
amount DECIMAL(10,2) CHECK(amount>0),
status ENUM('pending','completed') DEFAULT 'pending',
FOREIGN KEY (user_id) REFERENCES users(id)
);
EXPLAIN:分析查询执行计划的关键工具:
sql复制EXPLAIN SELECT * FROM users WHERE age>20;
输出结果重点关注:
FORCE INDEX/USE INDEX:强制或建议使用特定索引:
sql复制SELECT * FROM users USE INDEX(idx_age) WHERE age>30;
STRAIGHT_JOIN:强制按FROM顺序执行表连接:
sql复制SELECT STRAIGHT_JOIN a.*, b.name
FROM large_table a
JOIN small_table b ON a.id=b.id;
SQL_CALC_FOUND_ROWS:获取LIMIT前的总行数:
sql复制SELECT SQL_CALC_FOUND_ROWS * FROM products LIMIT 10;
SELECT FOUND_ROWS(); -- 返回总行数
OVER:定义窗口范围的核心关键字:
sql复制SELECT
name,
salary,
RANK() OVER(PARTITION BY dept ORDER BY salary DESC) as dept_rank
FROM employees;
常用窗口函数:
JSON_EXTRACT:提取JSON文档中的值:
sql复制SELECT JSON_EXTRACT(profile, '$.address.city')
FROM users;
JSON_SET:修改JSON文档:
sql复制UPDATE users
SET profile = JSON_SET(profile, '$.age', 25)
WHERE id=1;
大小写敏感问题:
保留字冲突处理:
sql复制-- 错误示例
CREATE TABLE interval (id INT); -- interval是保留字
-- 正确写法
CREATE TABLE `interval` (id INT);
事务隔离级别:
设置方法:
sql复制SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
WHERE YEAR(create_time)=2023WHERE phone=13800138000(phone是varchar类型)DELAYED:延迟插入(MyISAM引擎支持):
sql复制INSERT DELAYED INTO logs VALUES(...);
SQL_BUFFER_RESULT:强制结果集缓存:
sql复制SELECT SQL_BUFFER_RESULT * FROM large_table;
WITH ROLLUP:分组汇总小计:
sql复制SELECT year, SUM(sales)
FROM orders
GROUP BY year WITH ROLLUP;
IGNORE:忽略错误继续执行:
sql复制INSERT IGNORE INTO users VALUES(1,'Tom'); -- 主键冲突时不报错