2.5. 查询表

要从表中检索数据,请对表进行查询。 SQL SELECT语句用于执行此操作。该语句分为一个选择列表(列出要返回的列的部分),一个表列表(列出从中检索数据的表的部分)和一个可选的限定条件(指定任何限制的部分) 。例如,要检索表weather的所有行,请 Importing:

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

SELECT * FROM weather
    WHERE city = 'San Francisco' AND prcp > 0.0;

Result:

city      | temp_lo | temp_hi | prcp |    date
---------------+---------+---------+------+------------
 San Francisco |      46 |      50 | 0.25 | 1994-11-27
(1 row)

您可以请求按排序 Sequences 返回查询结果:

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

在此示例中,未完全指定排序 Sequences,因此您可能会以任一 Sequences 获得 San Francisco 行。但是,如果执行以下操作,则始终会得到上面显示的结果:

SELECT * FROM weather
    ORDER BY city, temp_lo;

您可以请求从查询结果中删除重复的行:

SELECT DISTINCT city
    FROM weather;
city
---------------
 Hayward
 San Francisco
(2 rows)

同样,结果行的 Sequences 可能会有所不同。您可以同时使用DISTINCTORDER BY来确保结果一致:[3]

SELECT DISTINCT city
    FROM weather
    ORDER BY city;

[2]尽管SELECT *对于即席查询很有用,但在生产代码中通常认为它是不良样式,因为在表中添加列会改变结果。

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