跳到主要内容

重复与聚集

怎样消除结果中的重复元组?​

  • 手段: 在 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 §全关系操作/§分组, 聚集和空值)