Skip to content

查询数据

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

bash
SELECT * from weather;

这是“所有列”*的简写。[2]因此,使用以下命令可以得到相同的结果:

bash
SELECT city, temp_lo, temp_hi, prcp, date FROM weather;

输出应为:

bash
     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)

您可以在选择列表中编写表达式,而不仅仅是简单的列引用。例如,您可以执行以下操作:

bash
SELECT city, (temp_hi+temp_lo)/2 AS temp_avg, date FROM weather;

这应该给出:

bash
     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

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

结果:

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

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

bash
SELECT * FROM weather
    ORDER BY city;
bash
     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

在此示例中,排序顺序未完全指定,因此您可能会以任意顺序获取旧金山的行。但如果您这样做,您始终会获得上面显示的结果:

bash
SELECT * FROM weather
    ORDER BY city, temp_lo;

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

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

同样,结果行的顺序可能会有所不同。你可以同时使用DISTINCT和来确保结果ORDER BY一致:

bash
SELECT DISTINCT city
    FROM weather
    ORDER BY city;

虽然SELECT *它对于即兴查询很有用,但在生产代码中被广泛认为是一种不好的风格,因为在表中添加一列会改变结果。

在一些数据库系统中,包括旧版本的PostgreSQLDISTINCT ,自动对行进行排序等的实现ORDER BY是不必要的。但这并不是 SQL 标准所要求的,而且当前的PostgreSQL也不能保证DISTINCT使行有序。

Released under the MIT License.