您可以在 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 |
最简单的 SELECT
查询是不使用 WHERE
子句的星号。这将返回表中每个记录的每一列。例如,此查询返回示例表中的每个记录
SELECT * FROM stock_data;
虽然 SELECT *
可能适用于小型表上的临时查询以查看数据,但不应在生产代码中使用。在生产代码中,您应该只选择需要的数据以提高性能和可维护性。
您也可以选择表达式的结果,而无需包含表。
SELECT 6 * 3 AS result;
结果
结果 |
18 |
如果您想要来自单个列的所有数据,请在 SELECT
语句中指定列的名称。例如,此查询从 stock_data
表中检索 price
列中的所有数据价格
SELECT price FROM stock_data;
结果
价格 |
251.12 |
208.88 |
82.70 |
210.88 |
362.67 |
128.45 |
如果您只想要表中特定列的数据,可以在 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 |
您可以使用表达式修改 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
子句来过滤记录。此示例查询返回 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 |
从数据库检索数据时,可以使用 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 |
如果您不希望结果中出现重复项,可以将 DISTINCT
关键字添加到 SELECT
子句中。例如,此查询仅检索 stock_data
表中的不同组,并删除重复项。
SELECT DISTINCT group from stock_data;
结果
组 |
b |
a |
c |
本节使用一个名为 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 文档部分