当表表达式(通过 FROM、WHERE 等子句)完成虚拟中间表的计算之后,中间表的各行将被输入到由逗号分隔构成的选择列表(select list)中,以此生成最终呈现给用户的输出结果列。
最简单的选择列表项直接由通配符 * 声明,输出输入表的所有字段。更为普遍的形式是显式指定所需的列名或任意标量计算表达式:
SELECT a, b + c FROM table1;
可以通过附加 AS 子句为结果集中的输出列指派自定义别名:
SELECT a AS value, b + c AS sum FROM table1;
关键字 AS 可以省略。列别名主要用于为前端应用提供语义清晰的列头名称。请注意,列别名不能直接在同级的 WHERE 或 HAVING 子句中引用(因为在物理执行流上,过滤发生于投影之前),但可以在最外层的 ORDER BY 中直接引用。
DISTINCT 去重 #
在选择列表前声明 DISTINCT 关键字可以从最终结果集中剔除所有内容完全相同的重复行,仅保留单条唯一记录:
SELECT DISTINCT city FROM weather;
PostgreSQL 还支持强大的专属语法 DISTINCT ON:
SELECT DISTINCT ON (location) location, time, report
FROM weather_reports
ORDER BY location, time DESC;
该语句在根据指定列(如 location)去重时,能够结合外部的 ORDER BY 明确保证挑选出各组内特定维度的极致行(例如每个观测点时间最新的一条天气上报记录)。