Skip to content
难度基础(★)
建议时长45分钟

3.7.2 普通查询

本课核心知识点整理
本课核心知识点手绘流程图(SVG)

普通查询的骨架

普通查询就是常见的 SELECT 查询。字幕中给出的核心结构可以整理为:

sql
SELECT 目标列
FROM 表或表列表
WHERE 行筛选条件
ORDER BY 排序列 ASC|DESC;

其中 ORDER BY 可选。普通查询要回答三件事:查哪些列,从哪些表查,满足什么条件。

子句对应问题关系代数含义
SELECT输出哪些属性投影
FROM数据来自哪些关系单表或多表笛卡尔积
WHERE哪些元组满足条件选择
ORDER BY结果按什么顺序显示排序,不改变集合语义

SELECT * 与指定列

SELECT * 表示查询所有属性列;如果只需要部分列,应写出列名:

sql
SELECT 学号, 姓名
FROM 学生
WHERE 专业号 = 'CS';

当多表中存在同名列时,必须用表名或别名前缀区分,例如 R.BS.B。字幕里的例题就强调:同名属性列容易混淆,非同名列可以直接写,重名列要标明来源。

多表查询本质上从笛卡尔积开始

传统写法:

sql
SELECT R.B, R.D, S.F, S.G
FROM R, S
WHERE R.B = S.B
  AND R.C = S.C
  AND R.B < S.G;

FROM R, S 先形成 R × SWHERE 中的 R.B = S.BR.C = S.C 是把笛卡尔积限制成自然连接语义的关键条件。如果漏掉同名属性相等条件,就会得到大量无意义组合。

这也是自然连接转 SQL 的核心:自然连接要求同名属性值相等,而 SQL 中用逗号列出多表时不会自动替你写这些条件。

自然连接与 SQL 的转换

设:

R(A,B,C,D,E),S(B,C,F,G)

RS 自然连接时,同名属性是 BC。若关系代数要求在自然连接结果上筛选 B < G 并投影 B,D,F,G,转换成 SQL 时要写:

sql
SELECT R.B, R.D, S.F, S.G
FROM R, S
WHERE R.B = S.B
  AND R.C = S.C
  AND R.B < S.G;

这里三个 AND 条件都不能漏:两个是自然连接带来的同名属性相等条件,一个是题目额外筛选条件。

查询效率的基本思想

关系代数里通常先做选择、投影,再做连接,可以减少中间结果。SQL 优化器会自动优化很多情况,但软考考理论表达时,常希望你理解“越早过滤无关行和无关列,中间结果越小”。

写法思想优势
WHERE 过滤减少参与连接的元组
SELECT 必要列减少结果宽度
写清连接条件避免无意义笛卡尔积
使用 DISTINCT需要去重时去除重复结果

做题路线

  1. 先确定输出列,尤其检查是否有同名列需要加表名前缀。
  2. 再确定数据来源:单表还是多表。
  3. 多表查询必须写连接条件;自然连接转换成 SQL 时,同名列相等条件要补齐。
  4. 最后写筛选条件和排序条件,多个条件用 ANDOR 连接。

例题

单选
SQL 查询中,用于指定输出列的是:
单选
普通查询中用于筛选满足条件行的子句是:

自查要点

  1. SELECT、FROM、WHERE 分别负责什么?
  2. 多表查询为什么必须注意连接条件?
  3. DISTINCT 的作用是什么?