↑↓ 选择↵ 打开⌫ 切换范围完整搜索

PG.CENTER 连接 PostgreSQL 文档、百科与生态知识。由 Pigsty 维护。

支持中的版本: 当前版本 (18) / 17 / 16 / 15 / 14
开发中的版本: 19 / 20devel
已结束支持的版本: 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 语句就是用来做这件事的。该语句分为选择列表(列出要返回的列)、表列表(列出从哪些表中检索数据)以及可选的限定条件(指定限制条件的部分)。例如,要检索表 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 子句包含一个布尔(真值)表达式,只有使该布尔表达式为真的行才会被返回。在限定条件中可以使用常见的布尔操作符(AND、OR 和 NOT)。例如,下面的查询检索 San Francisco 在雨天的天气记录:

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

在这个例子中,排序顺序没有完全指定,因此两个 San Francisco 行可能以任意次序出现。但如果你使用下面的语句,就总会得到上面显示的结果:

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] 在一些数据库系统中,包括较老版本的 PostgreSQL,DISTINCT 的实现会自动对行排序,因此 ORDER BY 并非必需。但这并不是 SQL 标准的要求,而且当前的 PostgreSQL 并不保证 DISTINCT 会使行按顺序排列。

报告文档问题

阅读 上游文档. 通过 PostgreSQL 文档反馈表单.