3.7.2 普通查询
本课核心知识点整理
普通查询的骨架
普通查询就是常见的 SELECT 查询。字幕中给出的核心结构可以整理为:
sql
SELECT 目标列
FROM 表或表列表
WHERE 行筛选条件
ORDER BY 排序列 ASC|DESC;其中 ORDER BY 可选。普通查询要回答三件事:查哪些列,从哪些表查,满足什么条件。
| 子句 | 对应问题 | 关系代数含义 |
|---|---|---|
SELECT | 输出哪些属性 | 投影 |
FROM | 数据来自哪些关系 | 单表或多表笛卡尔积 |
WHERE | 哪些元组满足条件 | 选择 |
ORDER BY | 结果按什么顺序显示 | 排序,不改变集合语义 |
SELECT * 与指定列
SELECT * 表示查询所有属性列;如果只需要部分列,应写出列名:
sql
SELECT 学号, 姓名
FROM 学生
WHERE 专业号 = 'CS';当多表中存在同名列时,必须用表名或别名前缀区分,例如 R.B、S.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 × S,WHERE 中的 R.B = S.B、R.C = S.C 是把笛卡尔积限制成自然连接语义的关键条件。如果漏掉同名属性相等条件,就会得到大量无意义组合。
这也是自然连接转 SQL 的核心:自然连接要求同名属性值相等,而 SQL 中用逗号列出多表时不会自动替你写这些条件。
自然连接与 SQL 的转换
设:
R 和 S 自然连接时,同名属性是 B 和 C。若关系代数要求在自然连接结果上筛选 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 | 需要去重时去除重复结果 |
做题路线
- 先确定输出列,尤其检查是否有同名列需要加表名前缀。
- 再确定数据来源:单表还是多表。
- 多表查询必须写连接条件;自然连接转换成 SQL 时,同名列相等条件要补齐。
- 最后写筛选条件和排序条件,多个条件用
AND或OR连接。
例题
SQL 查询中,用于指定输出列的是:
普通查询中用于筛选满足条件行的子句是:
自查要点
- SELECT、FROM、WHERE 分别负责什么?
- 多表查询为什么必须注意连接条件?
- DISTINCT 的作用是什么?