关系代数与 SQL
引入
词汇
| English | 释义 | 拼音 |
|---|---|---|
| selection/sɪˈlekʃn/ | 选择 | xuǎn zé |
| projection/prəˈdʒekʃn/ | 投影 | tóu yǐng |
| join/dʒɔɪn/ | 连接 | lián jiē |
五个算子,一条管道
- 代数:选择 selection σ 保行、投影 projection π 保列、连接 join ⋈ 按条件合并、并与差组合表。每条 SELECT 都是这五个的管道。

{exercise:uni-cs0802-algebra}
练习
保留列的算子是——
难度 1/5 · 今日首次完成可获 100 金币及少量额外奖励
投影 π 保列;选择 σ 保行。
子句次序即语义
- FROM 建行集、WHERE 过滤行、GROUP BY 分组、HAVING 过滤组、SELECT 投影、ORDER BY 排序。在 WHERE 里过滤聚合是引擎拒绝的类型错误——用 HAVING。
- 课程查询:连接 Course 与 Enrollment、选 credits = 15、按 title 分组、留下 $\ge 2$ 的组。样例库上执行结果是
Databases | 3。
{exercise:uni-cs0802-order}
练习
对 COUNT(*) 过滤发生在——
难度 1/5 · 今日首次完成可获 100 金币及少量额外奖励
WHERE 在分组前滤行;HAVING 滤组。
连接口味决定谁留下
- 普通连接丢掉 2 门无人选的课;
LEFT JOIN以n = 0保留——6 行。COUNT(*)数行;COUNT(col)跳过 NULL。 - 投影多端的列会重复:14 行选课投影 14 个学号——要集合就加 DISTINCT。
例子
把每条查询读成管道,输出就不再意外。
{exercise:uni-cs0802-join}
练习
样例库上课程查询返回——
难度 1/5 · 今日首次完成可获 100 金币及少量额外奖励
唯一的 15 学分课有 3 人选;Algorithms 是 12 学分。