重复与聚集
怎样消除结果中的重复元组?
- 手段: 在 SELECT 中使用
DISTINCT; - 代价: 需要比较大量元组, 耗费极大;
- 默认: SELECT 不带
DISTINCT时保留重复, 即按包处理, 见 包语义;
SELECT DISTINCT name
FROM Movies FULL OUTER JOIN StarsIn;
交、并、差中的重复怎样控制?
- 默认: 集合运算默认消除重复;
- 保留: 需要保留重复时在运算关键字后加
ALL;
(SELECT name, address FROM MovieStar WHERE gender = 'F')
UNION ALL
(SELECT name, address FROM MovieExec WHERE netWorth > 10000000);
有哪些聚集操作符?
| 操作符 | 作用 |
|---|---|
SUM | 求和 |
AVG | 平均值 |
MIN | 最小值 |
MAX | 最大值 |
COUNT | 元组数量 |
- 去重计数: 聚集参数前可加
DISTINCT;
SELECT AVG(netWorth) FROM MovieExec;
SELECT COUNT(DISTINCT starName) FROM StarsIn;
聚集遇到 NULL 怎样处理?
- 忽略: NULL 在聚集计算中被跳过, 不参与求和或平均;
- 全空分组: 如果参与计算的值全为 NULL,
COUNT返回 0, 其余聚集操作返回 NULL; - 对比: 分组时 NULL 被当作一般取值, 见 分组与 HAVING;
(source: 050-sql.md §全关系操作/§分组, 聚集和空值)