Redrock Postgres 搜索 英文
版本: 9.3 / 9.4 / 9.5 / 9.6 / 10 / 11 / 12 / 13 / 14 / 15 / 16 / 17

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 子句包含一个布尔值(真值)表达式,并且仅返回布尔表达式为真的行。限定中允许使用常见的布尔运算符(ANDORNOT)。例如,以下内容检索下雨天的旧金山的 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)

在此示例中,结果行的顺序也可能有所不同。您可以通过共同使用 DISTINCTORDER BY 来确保结果一致: [3]

SELECT DISTINCT city
    FROM weather
    ORDER BY city;


[2]虽然 SELECT * 对于即兴查询很有用,但它被广泛认为是开发代码中的糟糕风格,因为向表中添加列会更改结果。

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