Skip to main content

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 子句只能与 LIMITORDER BY 子句一起使用。
(SELECT)SELECT 命令。必须将子查询括在括号中,并指定 alias。FROM 子句中包含子查询时,子查询的输出将用作仅在查询中有效的临时视图。
join_type

支持的连接类型:

  • [INNER] JOIN
  • LEFT [OUTER] JOIN
  • RIGHT [OUTER] JOIN
  • FULL [OUTER] JOIN

目前,连接只支持 ON 子句。

join_condition连接两个 from_items 之前必须满足的 ON 子句的条件。
window_type时间窗口函数的类型。可能的值为 HOPTUMBLE
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_namelast_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 包括 iddistancedurationfare 列,其中 id 用于标识每个唯一的行程。

{
"id": VARCHAR,
"distance": DOUBLE PRECISION,
"duration": DOUBLE PRECISION,
"fare": DOUBLE PRECISION
}

taxi 包括列 taxi_idtrip_id,其中 taxi_trips 中的 trip_idid 是匹配字段。

{
"taxi_id": VARCHAR,
"trip_id": VARCHAR
}

company 包括列 company_idtaxi_id,其中 taxi 中的 taxi_idtaxi_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;