了解 PostgreSQL SELECT

A developer selecting some data from a screen full of data graphs.

您可以在 PostgreSQL 和 TimescaleDB 中使用 SELECT 语句从数据库中的零个或多个表中检索数据。它以结果表(称为结果集)的形式返回这些结果,该表包含零行或多行。

SELECT 语句是最简单和最复杂的 SQL 语句之一,因为您可以将许多可选子句和关键字与它一起使用。这种复杂性在您从数据库中获取数据时提供了更大的灵活性。

SELECT 语法

简单

SELECT <expressions> 
FROM <tables>;

完整

SELECT [ ALL | DISTINCT | DISTINCT ON (<distinct_expressions>) ]
<expressions>
FROM <tables>
[WHERE <conditions>]
[GROUP BY <expressions>]
[HAVING <condition>]
[ORDER BY <expression> [ ASC | DESC | USING <operator> ] [ NULLS FIRST FIRST | NULLS LASTLAST ]]
[LIMIT [ <number_rows> | ALL]
[OFFSET OFFSET <offset_value> [ ROW | ROWS ]]
[FETCH FETCH { FIRST FIRST | NEXT } [ <fetch_rows> ] { ROW | ROWS } ONLY]
[FOR { UPDATE | SHARE } OF <table> [ NOWAIT ]];

示例

此示例使用名为 stock_data 的表,该表包含股票价格随时间变化的数据

id

时间

价格

1

2022-06-04

b

251.12

3

2022-06-04

a

208.88

6

2022-06-04

c

82.70

2

2022-06-05

a

210.88

4

2022-06-05

b

362.67

5

2022-06-05

b

128.45

使用 PostgreSQL SELECT 查询表

最简单的 SELECT 查询是不使用 WHERE 子句的星号。这将返回表中每个记录的每一列。例如,此查询返回示例表中的每个记录

SELECT * FROM stock_data;

虽然 SELECT * 可能适用于小型表上的临时查询以查看数据,但不应在生产代码中使用。在生产代码中,您应该只选择需要的数据以提高性能和可维护性。

使用 PostgreSQL SELECT 选择表达式

您也可以选择表达式的结果,而无需包含表。

SELECT 6 * 3 AS result;

结果

结果

18

使用 PostgreSQL SELECT 查询单列数据

如果您想要来自单个列的所有数据,请在 SELECT 语句中指定列的名称。例如,此查询从 stock_data 表中检索 price 列中的所有数据价格

SELECT price FROM stock_data;

结果

价格

251.12

208.88

82.70

210.88

362.67

128.45

使用 PostgreSQL SELECT 查询多列数据

如果您只想要表中特定列的数据,可以在 SELECT 语句中指定列的名称,用逗号分隔。例如

SELECT time, price FROM stock_data;

结果

时间

价格

2022-06-04

251.12

2022-06-04

208.88

2022-06-04

82.70

2022-06-05

210.88

2022-06-05

362.67

2022-06-05

128.45

使用表达式修改 PostgreSQL SELECT 结果

您可以使用表达式修改 SELECT 语句的结果。

此示例将示例表中的两列合并为一列。您可以使用 || 运算符连接 SQL 中的值。执行此操作时,您可以为生成的列添加别名,以便在结果中更轻松地识别它。例如,您可以使用 AS 子句将结果显示为 time_price

SELECT time || ':' || price AS time_price FROM stock_data;

结果

time_price

2022-06-04:251.12

2022-06-04:208.88

2022-06-04:82.70

2022-06-05:210.88

2022-06-05:362.67

2022-06-05:128.45

使用 WHERE 过滤 PostgreSQL SELECT 查询

您可以通过添加带有条件的 WHERE 子句来过滤记录。此示例查询返回 stock_data 表中的时间和组,如果价格大于 200。

SELECT time, group, price from stock_data WHERE price > 200;

结果

时间

价格

2022-06-04

b

251.12

2022-06-04

a

208.88

2022-06-05

a

210.88

2022-06-05

b

362.67

使用 PostgreSQL ORDER BY 更改结果顺序

从数据库检索数据时,可以使用 ORDER BY 关键字更改结果的顺序。这是一个例子

SELECT * FROM stock_data ORDER BY price;

结果

id

时间

价格

6

2022-06-04

c

82.70

5

2022-06-05

b

128.45

3

2022-06-04

a

208.88

2

2022-06-05

a

210.88

1

2022-06-04

b

251.12

4

2022-06-05

b

362.67

使用 PostgreSQL SELECT DISTINCT 删除重复项

如果您不希望结果中出现重复项,可以将 DISTINCT 关键字添加到 SELECT 子句中。例如,此查询仅检索 stock_data 表中的不同组,并删除重复项。

SELECT DISTINCT group from stock_data;

结果

b

a

c

将 PostgreSQL SELECT 与计算值一起使用

本节使用一个名为 conditions 的示例表,该表包含从不同位置的不同设备收集的温度和湿度信息

时间

设备 ID

温度

湿度

2016-11-15 07:00:00

weather-pro-000000

32.4

49.8

2016-11-15 07:00:00

weather-pro-000001

34.6

50.1

2016-11-15 07:00:00

weather-pro-000002

73.8

74

2016-11-15 07:00:00

weather-pro-000003

68.7

68

要计算表中每个设备的平均温度,可以使用如下查询

SELECT device_id, AVG(temperature) FROM conditions GROUP BY device_id;

GROUP BY 关键字按 device_id 对结果进行分组,AVG() 函数返回每个设备温度的平均值。该查询的结果如下所示

结果

设备 ID

平均值

weather-pro-000000

39.3281

weather-pro-000001

38.4629

weather-pro-000002

80.3776

weather-pro-000003

68.4865

您还可以使用 MAX() 函数找到每个设备记录的最高湿度。例如

SELECT device_id, MAX(humidity) FROM conditions GROUP BY device_id;

查询结果如下所示:

设备 ID

平均值

weather-pro-000000

55.5

weather-pro-000001

56

weather-pro-000002

55.2

weather-pro-000003

54.4

延伸阅读

有关 SELECT 语句以及如何将其与 PostgreSQL 一起使用的更多信息,请查看 有关 SELECT 的 PostgreSQL 文档。有关如何在 SQL 查询中使用 SELECT 的更多示例,请参阅以下 Timescale 文档部分