历史版本。 PostgreSQL 13 已结束支持。 2025-11-13. 请参阅 当前版本手册.
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;