PostgreSQL 18 中文参考文档(未翻译部分保留英文)🌐 切换到英文原版 →

2.5. 查询数据表 #

要从表中检索数据,需要对表执行查询(query)。在 SQL 中通过 SELECT 语句来完成。该语句主要分为三部分:选择列表(select list,指定返回哪些列)、表列表(from list,指定从哪些表中检索数据)以及可选的限定条件(where list,指定过滤规则)。例如,要检索 weather 表中的全部数据行,执行:

SELECT * FROM weather;

此处的星号(*)是“所有列”的简写。 [2] 显式指定每一列的等效查询语句为:

SELECT city, temp_lo, temp_hi, prcp, date FROM weather;

输出结果如下:

     city      | temp_lo | temp_hi | prcp |    date
---------------+---------+---------+------+------------
 San Francisco |      46 |      50 | 0.25 | 1994-11-27
 San Francisco |      43 |      57 |    0 | 1994-11-29
 Hayward       |      37 |      54 |      | 1994-11-29
(3 rows)

在选择列表中不仅可以引用字段,还可以编写各种计算表达式。例如计算平均气温:

SELECT city, (temp_hi+temp_lo)/2 AS temp_avg, date FROM weather;

输出结果为:

     city      | temp_avg |    date
---------------+----------+------------
 San Francisco |       48 | 1994-11-27
 San Francisco |       50 | 1994-11-29
 Hayward       |       45 | 1994-11-29
(3 rows)

注意其中通过 AS 子句为计算结果列指定了别名(AS 关键字本身是可选的)。

可以通过添加 WHERE 子句来设置查询的过滤条件。WHERE 子句包含布尔表达式,只有使该表达式为真(True)的行才会被返回。可以在条件中自由使用标准的布尔运算符(AND、OR 与 NOT)。例如,检索旧金山在降雨日的天气数据:

SELECT * FROM weather
    WHERE city = 'San Francisco' AND prcp > 0.0;

查询结果:

     city      | temp_lo | temp_hi | prcp |    date
---------------+---------+---------+------+------------
 San Francisco |      46 |      50 | 0.25 | 1994-11-27
(1 row)

你可以要求查询结果按照特定规则进行排序返回:

SELECT * FROM weather
    ORDER BY city;

     city      | temp_lo | temp_hi | prcp |    date
---------------+---------+---------+------+------------
 Hayward       |      37 |      54 |      | 1994-11-29
 San Francisco |      43 |      57 |    0 | 1994-11-29
 San Francisco |      46 |      50 | 0.25 | 1994-11-27

在上述示例中,由于未针对旧金山相同的两行指定二级排序字段,因此这两行的相对顺序是不确定的。若要得到绝对确定的顺序,可追加二级排序列:

SELECT * FROM weather
    ORDER BY city, temp_lo;

你可以要求对查询结果进行去重处理:

SELECT DISTINCT city
    FROM weather;

     city
---------------
 Hayward
 San Francisco
(2 rows)

此处返回结果的行顺序同样可能是随意的。将 DISTINCT 与 ORDER BY 结合使用可以确保结果的确定性: [3]

SELECT DISTINCT city
    FROM weather
    ORDER BY city;



[2] 虽然 SELECT * 在临时排查时非常便捷,但在生产级代码中通常被视为不良习惯,因为一旦未来为数据表追加了新字段,该查询的返回结构就会发生不可预期的变动。

[3] 在某些早期数据库系统中,DISTINCT 的实现会隐式对数据进行排序,因此无需显式指定 ORDER BY。但这不属于 SQL 标准的硬性要求,现代 PostgreSQL 并不保证单个 DISTINCT 会对行进行稳定排序。