4.2 SQL 语言

4.22026-11-03 11:37:00

本篇定位:SQL 是数据库篇的操作主力——9 年真题中 SQL 直接命题几乎年年有(删表三兄弟、LIKE 通配符、GROUP BY+HAVING、JOIN、INSERT…SELECT、授权 REVOKE、索引失效),2026 年单题就占 5 题(单21/26/29/33/47 等)。2027 预测计算题集中在数据库+网络,SQL 语法与执行顺序是计算题的地基。本章按 SQL 四大类(DDL/DML/DCL/TCL)展开,并附三类/五类口径说明,重点讲透真题命中过的每一条语句。 数据依据:01-真题/真题文本/ + 01-真题/考点汇总/;答案以专业判断为准。与 05-笔记/数据库-SQL-第1讲-概览与单表查询.md 讲稿同源,此处按成书口径精编。 阅读提示:建表(主键/外键/约束)衔接 4.1 完整性约束;授权 GRANT/REVOKE 与 7.3 访问控制呼应;索引失效与 4.6 索引衔接。


一、考点定位(本章真题统计)

考点真题锚点频次考法
SQL 语句分类(DML 归属)2019 单261 年查询/插入/修改/删除=数据操纵功能
删表三兄弟2018 单37、2020 单49、2021 单50、2023 多874 年 4 题DROP/TRUNCATE/DELETE 区别、日志、回滚
LIKE 通配符2024 单46、2026 单292 年%(任意多个)/*(Access)/_(单个)
GROUP BY+HAVING2023 单47、2026 单262 年分组统计、COUNT(DISTINCT)、HAVING 过滤
JOIN 连接2018 单49、2022 单492 年内/左/右连接记录集判定
INSERT…SELECT2021 单491 年表间数据导入
授权与回收2019 单47、2024 单492 年GRANT/REVOKE 语法(TO/FROM、ON)
索引失效写法2021 单511 年索引列上套函数→全表扫描最慢

命题规律:SQL 是数据库篇题量最大、最稳定的考点群(每年 2–5 题)。两大主线:①语句语义(这 SQL 做什么/返回什么/写对没写对);②语法细节(LIKE 通配符、GROUP BY 位置、REVOKE 的 FROM)。2027 预测 2–3 题:GROUP BY+HAVING、JOIN、授权回收、LIKE 变体。核心能力:SELECT 执行顺序(FROM→WHERE→GROUP BY→HAVING→SELECT→ORDER BY→LIMIT)与三铁律(WHERE 不能用别名/聚合函数,ORDER BY 可用)。


二、知识框架(先搭骨架)

SQL(Structured Query Language,结构化查询语言)
├── DDL(数据定义语言):动结构
│   ├── CREATE(建表/库/索引/视图)、ALTER(改表)、DROP(删结构)
│   └── 建表:CREATE TABLE 学生(学号 CHAR(4) PRIMARY KEY, 姓名 CHAR(8) NOT NULL …)
├── DML(数据操纵语言):动数据
│   ├── SELECT(查询)、INSERT(插入)、UPDATE(修改)、DELETE(删除)
│   └── 2019 单26:查询/插入/修改/删除=数据操纵功能
├── DCL(数据控制语言):动权限
│   └── GRANT(授权)/ REVOKE(回收)
└── TCL(事务控制语言):动事务
    └── COMMIT(提交)/ ROLLBACK(回滚)/ SAVEPOINT(保存点)

SELECT 完整语法 + 执行顺序(必背):
SELECT 列 FROM 表 [WHERE 条件] [GROUP BY 列] [HAVING 组条件] [ORDER BY 列] [LIMIT n]
执行顺序:FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY → LIMIT
三铁律:WHERE 不能用别名;WHERE 不能放聚合函数(SUM/COUNT 只在 HAVING);ORDER BY 可用别名

删表三兄弟(2020 单49、2021 单50、2023 多87)
├── DROP:连表结构一起删(连根拔,不可回滚)
├── TRUNCATE:保留结构清空全部数据(保壳,不记录日志,不可回滚,不触发触发器)
└── DELETE:逐行删除(记录日志,可回滚,可带 WHERE 挑着删)

JOIN 连接(2018 单49、2022 单49)
├── INNER JOIN:只返回两边匹配的记录(2018 单49 答案)
├── LEFT JOIN:左表全部 + 右表匹配(无匹配则 NULL)
└── RIGHT JOIN:右表全部 + 左表匹配

一句话记忆:四大类(DDL 动结构/DML 动数据含查询/DCL 动权限/TCL 动事务)→ SELECT 执行顺序(F-W-G-H-S-O-L)→ 三铁律 → 删表三兄弟(DROP 连根拔/TRUNCATE 保壳/DELETE 挑着删可回滚)→ JOIN 三兄弟(内=交集、左=左全、右=右全)。


三、考点详解

3.1 SQL 语句分类:四大类(2019 单26)

精确定义:SQL 按功能分四大类(主流工程/培训口径):

  1. DDL(数据定义语言):定义结构——CREATE、ALTER、DROP、TRUNCATE(动结构);
  2. DML(数据操纵语言):操纵数据——SELECT、INSERT、UPDATE、DELETE(动数据);
  3. DCL(数据控制语言):控制权限——GRANT(授权)、REVOKE(回收);
  4. TCL(事务控制语言):控制事务——COMMIT(提交)、ROLLBACK(回滚)、SAVEPOINT(保存点)。

⚠️ 口径说明(三种分法并存,别被资料搞乱)

分法类别COMMIT/ROLLBACK 归谁SELECT 归谁
三类法(王珊《数据库系统概论》,国内教材主流)DDL / DML / DCLDCLDML
四类法(主流工程/培训口径,本章采用)DDL / DML / DCL / TCLTCLDML
五类法(IBM、OceanBase 官方文档)DDL / DML / DQL / DCL / TCLTCLDQL

考试怎么办:①查询/插入/修改/删除 = 数据操纵功能(DML)——2019 单26 按此答,SELECT 绝不归 DDL;②若选项里同时出现 DCL 与 TCL、问 COMMIT/ROLLBACK 属于什么 → 选 TCL;③选项里只有 DCL 没有 TCL → 按三类法归 DCL。判类看动作对象:动结构→DDL,动数据→DML,动权限→DCL,动事务→TCL。

2019 单26 考 DML:数据库管理系统能实现对数据的查询、插入、修改和删除等操作,这种功能称为数据操纵功能(DML)。注意:SELECT(查询)属于 DML(数据操纵),不是 DDL——这是最常见的混淆点。

3.2 SELECT 单表查询与执行顺序(贯穿所有查询题)

完整语法:

SELECT 列
FROM 表
[WHERE 条件]
[GROUP BY 分组列]
[HAVING 组过滤条件]
[ORDER BY 排序列]
[LIMIT 偏移, 行数]

执行顺序(必背):FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY → LIMIT

由执行顺序推三铁律:

  1. WHERE 中不能用别名(WHERE 先于 SELECT 执行,别名还不存在);
  2. WHERE 中不能放聚合函数(聚合发生在 GROUP BY 阶段,WHERE 只能过滤原始行;组过滤用 HAVING);
  3. ORDER BY 中可以用别名(ORDER BY 在 SELECT 之后执行)。

WHERE 里能写哪些条件(谓词全家福——IN 在 2022 单51 出现过):

谓词写法示例含义备注
比较运算年龄 > 20单值比较= NULL 永远查不到,判空要用 IS NULL
BETWEEN…AND年龄 BETWEEN 10 AND 20闭区间(含两端)等价 年龄>=10 AND 年龄<=20
IN所在系 IN ('计算机','金融')列的值在给定列表里(多选一)等价一串 OR;否定式 NOT IN
LIKE姓名 LIKE '张%'字符串模糊匹配见 3.3
IS NULL成绩 IS NULL判空不能用 = NULL
逻辑组合AND / OR / NOT条件组合IN 本质就是 OR 的简写

⚠️ IN 不是"包含":列 IN (值列表) 判的是"这个列的值是否等于列表中的某一个",与 LIKE '%x%'(子串包含)完全是两回事。IN 左边是一个列、右边是一串候选值。 考试抓手:WHERE 所在系 IN ('计算机','金融') ⟺ WHERE 所在系='计算机' OR 所在系='金融'。

3.3 LIKE 通配符(2024 单46、2026 单29,必考)

精确定义:LIKE 用于字符串模糊匹配,两个通配符:

  • %:匹配任意多个字符(含 0 个);
  • _:匹配恰好 1 个字符。

2026 单29:查询以"中国"开头的书名 → WHERE book_name LIKE '中国%'(选 D)。 2024 单46:查找含"银行"的记录 → LIKE "*银行*"(Access 语法用 *;标准 SQL 用 %——%银行%)。注意:Access(Office 数据库)用 * 和 ?,标准 SQL 用 % 和 _——题干给 Access 时选 *。

坑:LIKE '%' 匹配所有非 NULL 字符串(NULL 匹配不到任何 LIKE);LIKE '_' 只匹配恰好 1 个字符的串。

3.4 聚合与 GROUP BY+HAVING(2023 单47、2026 单26,必考)

聚合函数:COUNT(计数)、SUM(求和)、AVG(平均)、MAX、MIN——在 GROUP BY 分组后对每组统计。

GROUP BY 语法:SELECT 分组列, 聚合函数(列) FROM 表 GROUP BY 分组列 HAVING 语法:对分组结果过滤(WHERE 是对原始行过滤)。

2023 单47:表 student(sid,sname,sex,birthday),查询男女生各多少人:

  • 正确:SELECT sex AS '性别', COUNT(*) AS '人数' FROM student GROUP BY sex(B 正确)
  • 错误项分析:A 把 sname 也 select 了(非分组列,违反"SELECT 只能放分组列+聚合函数");C 用 ORDER BY(不分组不统计);D 同 A 且用 ORDER BY。
  • 铁律:GROUP BY 后 SELECT 只能放分组列和聚合函数——A/D 把 sname(非分组列)放进去就是错的。

2026 单26:关系 SP_P(供应商号,项目号,零件号,数量),查询至少给 3 个(含)项目的供应商,输出供应商号和供应零件数量总和:

  • 正确:SELECT 供应商号, SUM(数量) FROM SP_P GROUP BY 供应商号 HAVING COUNT(DISTINCT 项目号) > 2(C 正确)
  • 分析:按供应商分组 → 统计每个供应商供应的不同项目数(COUNT(DISTINCT 项目号))→ HAVING 过滤 ≥3(>2);SUM(数量) 求该供应商零件总数。
  • 坑:WHERE 不能放 COUNT(聚合函数)→ B/D 用 WHERE COUNT 错误;ORDER BY 不能接 HAVING → A 错误。

3.5 JOIN 连接(2018 单49、2022 单49)

精确定义:JOIN 把两个表的行按连接条件组合:

连接类型返回记录记忆
INNER JOIN(内连接)只返回两边都匹配的记录交集
LEFT JOIN(左连接)左表全部 + 右表匹配(无匹配补 NULL)左表全保留
RIGHT JOIN(右连接)右表全部 + 左表匹配(无匹配补 NULL)右表全保留
FULL JOIN(全连接)两边全部(无匹配补 NULL)并集

2018 单49:只有满足连接条件的记录才包含在查询结果中 → 内部联接(INNER JOIN)(选 C)。 2022 单49:以下关于 Left join、Inner join、Right join 描述错误的是 → D(三个关联查询中 Left join 查询的记录最少)——LEFT JOIN 返回左表全部记录,通常比 INNER JOIN 记录多(INNER 才最少,因为只留交集)。

3.6 INSERT…SELECT(2021 单49)

精确定义:INSERT…SELECT = 把查询结果插入另一张表(表间数据导入):

INSERT INTO T2(col1, col2, col3) SELECT col1, col2, col3 FROM T1

2021 单49:T1、T2 结构相同,把 T1 全部数据导入 T2 → INSERT INTO T2 SELECT * FROM T1(选 D)。要求:目标表列与查询列一一对应、类型相容。

3.7 授权与回收 GRANT/REVOKE(2019 单47、2024 单49)

精确定义:

  • GRANT(授权):GRANT 权限 ON 对象 TO 用户(TO 授予);
  • REVOKE(回收):REVOKE 权限 ON 对象 FROM 用户(FROM 回收)。

2019 单47:数据库安全机制中 GRANT 语句实现的是授权(数据控制功能 DCL)。 2024 单49:收回用户 XIAO 对通讯录(TXL)中手机(mobile)的修改权 → REVOKE UPDATE(mobile) ON TABLE TXL FROM XIAO(选 D)。

  • 坑:授权用 TO、回收用 FROM(A/C 用 TO 是错的);ON 是固定介词(B 用 OF 错误)。

权限种类:SELECT、INSERT、UPDATE、DELETE、ALL PRIVILEGES 等;GRANT ALL ON *.* TO user 表示所有库所有表所有权限。

3.8 删表三兄弟 DROP/TRUNCATE/DELETE(2018 单37、2020 单49、2021 单50、2023 多87,必考)

对比DROPTRUNCATEDELETE
删除内容表结构+数据(连根拔)全部数据(保壳清数据)按条件删行(可挑着删)
记录日志有(DDL)不记录日志记录日志
可回滚不可不可可(事务内)
触发器不触发不触发触发
速度最快快慢(逐行)
自增值消失重置为种子值保留

2020 单49:删除全部数据、保留表结构 → TRUNCATE(选 C;"drop 连结构一起删"是干扰)。 2021 单50:TRUNCATE 不记录日志(速度快、不可回滚);DELETE 记录日志(选 A)。 2023 多87:关于 TRUNCATE 正确的说法 → 会恢复自增长值至种子、表索引约束保持不变、不触发触发器(CD 对;"不会保存到回滚段"即不记录日志也对——正确答案为 C、D 等表述,注意真题选项具体措辞)。

3.9 子查询与"反连接"三写法(2026 多93 补强)

  • 非相关子查询:子查询可独立执行一次——WHERE sal > (SELECT AVG(sal) FROM emp)。
  • 相关子查询:子查询引用外层列,逐行执行——WHERE EXISTS (SELECT 1 FROM emp e WHERE e.deptno = d.deptno)。

"不存在/没有"的三种写法(结果等价,NULL 行为不同——这是本题的考点):

写法语义NULL 陷阱
NOT IN (子查询)不在集合中子查询结果含 NULL 时,比较得 UNKNOWN ⇒ 一行都查不出来
NOT EXISTS (相关子查询)不存在匹配行不受 NULL 影响(最稳,推荐)
LEFT JOIN … WHERE 右表键 IS NULL左表独有需保证连接键非空/用主键判空
  • SQL 三值逻辑:TRUE / FALSE / UNKNOWN;NULL = NULL 得 UNKNOWN,NOT IN (…, NULL) 必为 UNKNOWN。
  • 口诀:没有就用 NOT EXISTS;用 NOT IN 先想 NULL。
  • 相关子查询的效率陷阱:EXISTS 一旦找到匹配就停(短路),IN 需先算完整个子查询结果集——大表"存在性判断"优先 EXISTS。

四、易错坑汇总(命题人惯用陷阱)

  1. SELECT 属于 DML(2019 单26)——"查询属于 DDL"是错误说法;DML=查询+增删改。
  2. LIKE 通配符(2024 单46、2026 单29)——% 任意多个(含 0 个)、_ 恰好 1 个;Access 用 */?;"% 匹配 0 个或 1 个"是错误说法(那是 _)。
  3. WHERE 不能放聚合函数(2026 单26)——"WHERE COUNT(*)>2"错误,必须 HAVING;WHERE 也不能用别名(先于 SELECT 执行)。
  4. GROUP BY 后 SELECT 只能放分组列+聚合函数(2023 单47)——把非分组列(sname)放进 SELECT 是错的。
  5. LEFT JOIN 记录数(2022 单49)——LEFT JOIN 返回左表全部记录(通常比 INNER 多);"Left join 记录最少"是错误说法(INNER 才最少)。
  6. REVOKE 用 FROM、GRANT 用 TO(2024 单49)——"REVOKE … TO"语法错误;固定搭配 ON。
  7. TRUNCATE 不记录日志、不可回滚、不触发触发器(2021 单50、2023 多87)——"TRUNCATE 可回滚/记录日志"是错误说法;DELETE 记录日志可回滚触发触发器(正相反)。
  8. DROP 连结构一起删(2020 单49)——"DROP 保留表结构"错误;要保留结构用 TRUNCATE。
  9. NULL 与 LIKE——LIKE '%' 匹配不到 NULL 行;IS NULL 才能查 NULL。
  10. COUNT(DISTINCT 列)——去重计数;"COUNT(列) 自动去重"错误(要显式 DISTINCT)。

五、横向扩展(防漏网:本章边界内、真题尚未考但可能补考的点)

说明:横向扩展覆盖"大纲范围内但 9 年真题未考过"的知识,标注【新增概率】供取舍。

  1. UPDATE/DELETE 带子查询【中】:UPDATE 表 SET 列=(SELECT…)——2026 单35 考过子查询 SUM 比较,UPDATE 子查询是高概率变体。
  2. BETWEEN…AND【中】:闭区间——"BETWEEN 10 AND 20 含边界"判断题。
  3. NULL 三值逻辑【高】:=NULL 永远查不到(NULL 不等于任何值),须用 IS NULL——与 LIKE、WHERE 组合的经典坑。
  4. ORDER BY 多列与 DESC【中】:ORDER BY 列1 DESC, 列2——排序题。
  5. LIMIT 分页【中】:LIMIT 偏移, 行数;SQL Server TOP、Oracle ROWNUM——方言辨析。
  6. COUNT(*) vs COUNT(列)【高】:COUNT(*) 计行数(含 NULL 行);COUNT(列) 只计非 NULL 值——"两者结果一定相同"是错误说法。
  7. HAVING 可以放非聚合列【低】:HAVING 里可以放分组列(如 HAVING sex='男',与 WHERE 等价但时机不同)。
  8. EXISTS 子查询【低】:WHERE EXISTS (SELECT…)——存在性判断,2026 单35 子查询的延伸。

六、真题演练(代表性真题 + 解析)

例 1(2019 单26) 数据库管理系统能实现对数据库中数据的查询、插入、修改和删除等操作,这种功能称为数据的(口径已核)。 A. 定义功能 B. 管理功能 C. 操纵功能 D. 控制功能

答案:C。查询/插入/修改/删除 = 数据操纵功能(DML);定义功能=DDL(建表)、控制功能=DCL(授权)。口诀:增删改查=DML 操纵。

例 2(2026 单29) 查询以"中国"开头的书名,正确的 SQL 是(口径已核)。 A. WHERE book_name LIKE '中国_' B. WHERE book_name LIKE '_中国' C. WHERE book_name LIKE '%中国' D. WHERE book_name LIKE '中国%'

答案:D。% 匹配任意多个字符(含 0 个):'中国%' = 以"中国"开头。C 是"以中国结尾";A/B 的 _ 只匹配 1 个字符。口诀:开头匹配=前缀+%,_ 只顶一个。

例 3(2026 单26) 给定关系模式 SP_P(供应商号,项目号,零件号,数量),查询至少给 3 个(含)项目的供应商,输出供应商号和供应零件数量总和,语句为(口径已核)。 A. ORDER BY 供应商号 HAVING COUNT(DISTINCT 项目号)>2 B. GROUP BY 供应商号 WHERE COUNT(项目号)>2 C. GROUP BY 供应商号 HAVING COUNT(DISTINCT 项目号)>2 D. ORDER BY 供应商号 WHERE COUNT(项目号)>2

答案:C。按供应商分组(GROUP BY 供应商号)→ HAVING 过滤组(COUNT(DISTINCT 项目号)>2,即 ≥3 个项目)→ SELECT 输出供应商号和 SUM(数量)。坑:WHERE 不能放聚合函数(B/D 错);HAVING 不能接 ORDER BY(A 错)。口诀:分组用 GROUP BY、组过滤用 HAVING。

例 4(2022 单49) 关于 Left join、Inner join、Right join,以下描述错误的是(口径已核)。 A. Left join 返回左表中所有记录和右表中联结字段相等的记录 B. Right join 返回右表中所有记录和左表中联结字段相等的记录 C. Inner join 只返回两个表中联结字段相等的记录 D. 三个关联查询中 Left join 查询的记录最少

答案:D。LEFT JOIN 返回左表全部记录(通常 ≥ INNER JOIN 的记录数);INNER JOIN 只留两边匹配(交集,通常最少)。口诀:内连接=交集最少,左连接=左全保留。

例 5(2024 单49) 收回用户 XIAO 对通讯录(TXL)中手机(mobile)的修改权,正确的是(口径已核)。 A. REVOKE UPDATE(mobile) OF TABLE TXL TO XIAO B. REVOKE UPDATE(mobile) OF TABLE TXL FROM XIAO C. REVOKE UPDATE(mobile) ON TABLE TXL TO XIAO D. REVOKE UPDATE(mobile) ON TABLE TXL FROM XIAO

答案:D。REVOKE 固定搭配:REVOKE 权限 ON 对象 FROM 用户(回收用 FROM、介词用 ON)。口诀:授权 TO、回收 FROM,介词 ON。

例 6(2021 单50) 关于 TRUNCATE 与 DELETE,下列说法正确的是(口径已核)。 A. TRUNCATE 不记录日志、DELETE 记录日志 B. TRUNCATE 记录日志、DELETE 不记录日志 C. 两者都记录日志 D. 两者都不记录日志

答案:A。TRUNCATE 不记录日志(快、不可回滚、不触发触发器);DELETE 记录日志(慢、可回滚、触发触发器)。口诀:TRUNCATE 保壳不记账,DELETE 逐行记台账。


七、本章小结

  • 一条主线:SQL 四大类(DDL/DML/DCL/TCL)→ SELECT 执行顺序(F-W-G-H-S-O-L)+ 三铁律 → LIKE/聚合/JOIN/授权/删表三兄弟。
  • 必背语法:GROUP BY+HAVING(2023 单47、2026 单26);JOIN 三兄弟记录集(2018 单49、2022 单49);REVOKE…ON…FROM(2024 单49);TRUNCATE 特性(2021 单50、2023 多87)。
  • 必背坑:SELECT 属 DML;% 任意多个/_ 恰好 1 个;WHERE 不能放聚合/别名;GROUP BY 后 SELECT 只能放分组列+聚合;TRUNCATE 不记账不可回滚。
  • 衔接预告:建表约束→4.1 完整性;索引失效→4.6 索引;授权回收→7.3 访问控制;视图(本质=外模式)→4.6。