查询数据
要从表中检索数据,需要查询表。使用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使行有序。