1.2 SQL 语句家族地图:DDL、DML、DQL、DCL、TCL


1.2 SQL 语句家族地图:DDL、DML、DQL、DCL、TCL

本节摘要:SQL 的所有语句可以归入五个家族——DDL 管结构、DML 管数据、DQL 管查询、DCL 管权限、TCL 管事务。分清家族不是背名词,而是面对任何一条语句时能立刻判断它"动的是结构还是数据、要不要提交、出了错能不能回滚"。本节给出全家族地图,并解释 SQL 最关键的气质:声明式。

为什么 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-2 SQL 语句家族地图

图 1-2 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 悄然恢复原值,这就是"事务边界"的第一次亮相。

💡 关键直觉:看不懂一条语句时,先问"它动结构还是动数据,动完能不能反悔"。三问下来,任何陌生语句都能在地图上找到落点,文档该查哪一章也就清楚了。

本节要点回顾

  • SQL 是声明式语言:只说"要什么","怎么做"交给优化器,这决定了后面所有章节的思维方式;
  • 五家族分工:DDL 结构、DML 数据、DQL 查询、DCL 权限、TCL 事务,SELECT 独属 DQL 因其只读;
  • 家族决定风险:DQL 无害、DML 可回滚、DCL 影响他人、DDL 定局,线上操作按风险排序防护;
  • 回执会说话:影响 0 行的往往是结构或权限操作,影响 N 行的才是数据操作;
  • 全书即地图:DQL 是主峰(第 3 到 8 章),其余家族按攀登需要逐个登场。

作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U