登录
2.5. 查询表#
要从表中检索数据,需要对表进行查询。使用SQLSELECT
语句来执行此操作。该语句分为一个选择列表(列出要返回的列的部分)、一个表列表(列出要从中检索数据的表的的部分)和一个可选限定(指定任何限制的部分)。例如,要检索表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
)。例如,以下内容检索下雨天的旧金山的 weather
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]在某些数据库系统中,包括较旧版本的PostgreSQL中,DISTINCT
的实现会自动对行进行排序,因此ORDER BY
是不必要的。但这并不是 SQL 标准所要求的,并且当前的PostgreSQL并不能保证DISTINCT
会导致对行进行排序。