SELECT
使用 SELECT
命令从表或物化视图中检索行。此命令会返回满足查询中子句和条件指定的行。
句法
[ WITH clause ]
SELECT [ ALL | DISTINCT [ ON ( expression [, ...] ) ]] [ [table_name.]* [ EXCEPT ( [table_name.]except_column, ... ] ) ] | expression [ AS output_name ] [ , expression [ AS output_name ] ... ] ]
[ VALUES clause ]
[ FROM from_item [ , from_item ...] ]
[ WHERE condition ]
[ GROUP BY grouping_expression [ , grouping_expression ... ] ]
[ HAVING condition ]
[ ORDER BY sort_expression [ ASC | DESC ] [ , ... ] ]
[ LIMIT count_number ]
[ OFFSET start [ ROW | ROWS ] ];
其中 from_item
可以是:
table_name [ [ AS ] alias [ ( column_alias_list ) ] ]
window_type ( table_name, col_name, interval_expression ) [ [ AS ] alias [ ( column_alias_list ) ] ]
( SELECT ) [ [ AS ] alias [ ( column_alias_list ) ] ]
from_item join_type from_item [ ON join_condition ]
参数
参数或子句 | 描述 |
---|---|
WITH 子句 | 为大型查询提供了一种编写补充语句的方法。更多信息,请参阅 WITH 子句。 |
DISTINCT 子句 | 该子句可删除结果中的重复行。SELECT DISTINCT 根据所有选定列删除重复行。SELECT DISTINCT ON 允许指定表达式或列,并只返回每个唯一组合的第一行。它要求使用 ORDER BY 子句来确定第一行,并且 DISTINCT ON 表达式必须与最左侧的 ORDER BY 表达式匹配。ORDER BY 子句通常包含附加表达式,用于确定每个 DISTINCT ON 分组中行的优先级。在这种情况下,当 “N=1” 时,该表达式可以与 group topN 互相替代。请参阅下面的 该子句示例 了解更多信息。 |
EXCEPT 子句 | 从结果集中排除一或多个列。通过指定 except_column,查询将返回结果集中除指定列之外的所有列。 |
expression | 列或表达式。 |
VALUES 子句 | 该子句能以表表达式的形式生成一行或多行数据。有关详细信息,请参阅 VALUES 子句。 |
alias | 查询中表或物化视图的临时替代名称。 |
table_name | 表或物化视图。 |
grouping_expression | 可以是:
|
ORDER BY 子句 | 默认排序顺序为 ASC。当前不支持空选项。如果排序顺序为 ASC 或未指定,将在非空值之前放置空值。如果排序顺序为 DESC,则将在非空值之后放置空值。这与 PostgreSQL 中的排序逻辑不同。 |
sort_expression | 可以是:
|
count_number | 您希望获取的结果数量。 |
OFFSET 子句 | OFFSET 子句只能与 LIMIT 和 ORDER BY 子句一起使用。 |
(SELECT) | SELECT 命令。必须将子查询括在括号中,并指定 alias。FROM 子句中包含子查询时,子查询的输出将用作仅在查询中有效的临时视图。 |
join_type | 支持的连接类型:
目前,连接只支持 ON 子句。 |
join_condition | 连接两个 from_items 之前必须满足的 ON 子句的条件。 |
window_type | 时间窗口函数的类型。可能的值为 HOP 和 TUMBLE 。 |
interval_expression | 间隔表达式,格式为 INTERVAL '<interval>' 。例如,INTERVAL '2 MINUTES' 。也支持标准 SQL 格式,即把时间单位放在引号外(例如,INTERVAL '2' MINUTE )。 |
FROM 子句 | 指定查询操作的数据源。有更多信息,请参阅 FROM 子句。 |
GROUP BY 子句 | 将表中具有相同数据的行分组,从而消除这些分组的输出和汇总中的冗余。更多信息,请参阅 GROUP BY 子句。 |
HAVING 子句 | 删除不满足给定条件的分组记录。更多信息,请参阅 HAVING 子句。 |
LIMIT 子句 | 不存在 ORDER BY 子句时,不能将 LIMIT 子句用作物化视图的一部分。更多信息,请参阅 LIMIT 子句。 |
WHERE 子句 | 指定要应用于数据的条件或筛选器。更多信息,请参阅 WHERE 子句。 |
示例
DISTINCT
子句
以下是 SELECT DISTINCT
的示例。此查询将仅返回 first_name
和 last_name
的唯一组合,删除重复的行。
-- 检索员工的姓名。
SELECT DISTINCT first_name, last_name
FROM employees;
以下是 SELECT DISTINCT ON
的示例。该查询会返回每个唯一 customer_id
的最新订单。ORDER BY
用于确保所需记录(即具有最新订单日期的记录)优先出现;否则,返回的记录将无法预测。
-- 检索每个唯一客户的最新订单。
SELECT DISTINCT ON (customer_id) order_id, customer_id, order_date, total_amount
FROM orders
ORDER BY customer_id, order_date DESC;
使用多个子句的示例
下面是同一 schema 中我们要编写查询的表。
表 taxi_trips
包括 id
、distance
、duration
和 fare
列,其中 id
用于标识每个唯一的行程。
{
"id": VARCHAR,
"distance": DOUBLE PRECISION,
"duration": DOUBLE PRECISION,
"fare": DOUBLE PRECISION
}
表 taxi
包括列 taxi_id
和 trip_id
,其中 taxi_trips
中的 trip_id
和 id
是匹配字段。
{
"taxi_id": VARCHAR,
"trip_id": VARCHAR
}
表 company
包括列 company_id
和 taxi_id
,其中 taxi
中的 taxi_id
和 taxi_id
是匹配字段。
{
"company_id": VARCHAR,
"taxi_id": VARCHAR
}
以下查询可返回 “Yellow Taxi” 和 “FabCab” 公司每辆出租车超出起步价($2.50)行程的总距离和时长。
SELECT
taxi.taxi_id,
sum(trips.distance) AS total_distance,
sum(trips.duration) AS total_duration
FROM taxi_trips AS trips
LEFT JOIN taxi ON trips.id = taxi.trip_id
WHERE taxi_id IN (
SELECT taxi_id
FROM company
WHERE company_id IN ('Yellow Taxi', 'FabCab')
)
AND trips.fare > 2.50
GROUP BY taxi_id
ORDER BY total_distance, total_duration;