本节摘要:SQL 的所有语句可以归入五个家族——DDL 管结构、DML 管数据、DQL 管查询、DCL 管权限、TCL 管事务。分清家族不是背名词,而是面对任何一条语句时能立刻判断它"动的是结构还是数据、要不要提交、出了错能不能回滚"。本节给出全家族地图,并解释 SQL 最关键的气质:声明式。
写过 Python 的人第一次看 SQL 会不适应:没有变量,没有 for 循环,甚至不区分大小写。一条语句读起来更像一句英语——"SELECT title FROM books WHERE price 大于 50"。这不是设计者偷懒,而是定位不同:Python、Java 是过程式语言,你一步步告诉机器"怎么做";SQL 是声明式语言,你只声明"要什么",至于扫描哪些数据块、先过滤还是先排序、内存里怎么摆放中间结果,统统由数据库的查询优化器决定。
这个差别贯穿全书。第 10 章你会看到,正因为"怎么做"交给了优化器,同一条 SELECT 才可能跑出快慢相差百倍的两种计划;而你写 SQL 的水平,就体现在"把要什么说清楚,同时给优化器留出发挥空间"。
声明式的代价是思维转换。想"把每个分类的书各取前三本",过程式思路是循环 + 计数器,SQL 里这条路走不通,你得把它翻译成一句声明——这个翻译能力,正是第 7 章窗口函数要给你的。现在先记住这个悬案,继续把地图铺完。
| 家族 | 全称 | 管什么 | 代表语句 | 作用对象 |
|---|---|---|---|---|
| DDL | Data Definition Language | 定义与修改结构 | CREATE、ALTER、DROP | 数据库、表、索引、视图 |
| DML | Data Manipulation Language | 写入与修改数据 | INSERT、UPDATE、DELETE | 表里的行 |
| DQL | Data Query Language | 查询数据 | SELECT | 表里的行(只读) |
| DCL | Data Control Language | 控制访问权限 | GRANT、REVOKE | 用户与角色 |
| TCL | Transaction Control Language | 控制事务边界 | BEGIN、COMMIT、ROLLBACK | 一批 DML 语句 |
三点补充,帮你把表格用活。
第一,家族决定"闯祸的严重程度"。DQL 只读,随便写;DML 改数据,写错可以靠事务回滚(第 9 章);DDL 在很多数据库里会直接改表结构且不可回滚——一条 DROP TABLE 敲下去,表连同数据一起消失。所以工程上的默认纪律是:线上执行 DDL 前必须备份、必须两人复核。
第二,家族决定"要不要提交"。DML 语句执行后改动并未真正落盘,直到 COMMIT 才生效,这给了 ROLLBACK 反悔的机会;而 DDL 与 DCL 在 MySQL 中会隐式提交,执行即定局。为什么需要"先不落盘"的能力?第 9 章的转账案例会给出完整答案。
第三,SELECT 属于 DQL 而不是 DML,这是常见的小混乱。有些教材把 SELECT 并进 DML(广义的"操作"),本教程采用 DQL 独立的分法,因为它只读不写的特性太重要:一条跑错的 SELECT 最多浪费 CPU,一条跑错的 UPDATE 可能毁掉一张表。
用三个真实语句验证归类能力:
-- 第一组:判断下面两条各属哪个家族 CREATE TABLE categories ( -- DDL:新建结构 id INT UNSIGNED PRIMARY KEY, name VARCHAR(50) NOT NULL ); INSERT INTO categories VALUES (1, '计算机'); -- DML:往结构里填数据
Query OK, 0 rows affected (0.02 sec) -- DDL 的回执:影响 0 行 Query OK, 1 row affected (0.01 sec) -- DML 的回执:影响 1 行
回执本身就暴露了家族差异:DDL 报"影响了 0 行"(它动的是结构,没有行的概念),DML 报"影响了 1 行"。学会看回执,是脱离"复制粘贴式写 SQL"的第一步。

家族地图同时是学习顺序的依据。第 1 章用 DDL 搭练习场;第 2 章练 DML 三个动词;第 3 到 8 章全部围绕 DQL 攀登——这是全书的主峰;第 9 章补上 DCL 与 TCL,把"写对"升级为"写得安全";第 10 章回到 DDL 的索引部分,让 DQL 跑得快。你会发现五个家族在阶梯上并不是平均分布的:查询能力是主峰,其余家族是营地与绳索。
再做一个归类练习,也是对第 2 章的预习:
-- 第二组:三条语句,三个家族 UPDATE books SET stock = stock - 1 WHERE id = 2; -- DML:改某行的库存 GRANT SELECT ON bookstore.* TO analyst_ro; -- DCL:给只读账号开查询权 ROLLBACK; -- TCL:撤销本事务里刚才的 UPDATE
Query OK, 1 row affected (0.00 sec) Query OK, 0 rows affected (0.01 sec) Rollback complete
三条回执三种性格:UPDATE 精确报告影响了 1 行;GRANT 影响的是权限表而非业务行;ROLLBACK 一句话把之前的 UPDATE 无声抹掉——stock 悄然恢复原值,这就是"事务边界"的第一次亮相。
💡 关键直觉:看不懂一条语句时,先问"它动结构还是动数据,动完能不能反悔"。三问下来,任何陌生语句都能在地图上找到落点,文档该查哪一章也就清楚了。