2024年9月26日: PostgreSQL 17 发布!
支持的版本:当前 (17) / 16 / 15 / 14 / 13 / 12
开发版本:开发版
不受支持的版本:11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4 / 7.3 / 7.2

2.5. 查询表 #

要从表中检索数据,需要查询该表。使用SQL SELECT 语句来执行此操作。该语句分为选择列表(列出要返回的列的部分)、表列表(列出要从中检索数据的表的

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 子句包含一个布尔(真值)表达式,只有布尔表达式为真的行才会被返回。通常的布尔运算符(ANDORNOT)在限定条件中都是允许的。例如,以下语句检索旧金山在雨天时的天气情况:

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)

同样,结果行的顺序可能会有所不同。您可以通过一起使用 DISTINCTORDER BY 来确保结果的一致性:[3]

SELECT DISTINCT city
    FROM weather
    ORDER BY city;


[2] 虽然 SELECT * 对于临时的查询很有用,但在生产代码中被广泛认为是不好的风格,因为向表中添加列会更改结果。

[3] 在一些数据库系统中,包括旧版本的 PostgreSQLDISTINCT 的实现会自动对行进行排序,因此 ORDER BY 是不必要的。但这并不是 SQL 标准的要求,并且当前的 PostgreSQL 并不保证 DISTINCT 会导致行被排序。

提交更正

如果您在文档中发现任何不正确的内容、与您对特定功能的体验不符的内容或需要进一步澄清的内容,请使用此表单报告文档问题。