要从表中检索数据,需要对表执行查询(query)。在 SQL 中通过 SELECT 语句来完成。该语句主要分为三部分:选择列表(select list,指定返回哪些列)、表列表(from list,指定从哪些表中检索数据)以及可选的限定条件(where list,指定过滤规则)。例如,要检索 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 子句包含布尔表达式,只有使该表达式为真(True)的行才会被返回。可以在条件中自由使用标准的布尔运算符(AND、OR 与 NOT)。例如,检索旧金山在降雨日的天气数据:
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;