

 从补丁 198 开始，Amazon Redshift 将不再支持创建新的 Python UDF。现有的 Python UDF 将继续正常运行至 2026 年 6 月 30 日。有关更多信息，请参阅[博客文章](https://aws.amazon.com/blogs/big-data/amazon-redshift-python-user-defined-functions-will-reach-end-of-support-after-june-30-2026/)。

# SELECT 列表
<a name="r_SELECT_list"></a>

**Topics**
+ [语法](#r_SELECT_list-synopsis)
+ [参数](#r_SELECT_list-parameters)
+ [使用说明](#r_SELECT_list_usage_notes)
+ [示例](#r_SELECT_list-examples)

SELECT 列表指定希望查询返回的列、函数和表达式。列表表示查询的输出。

有关 SQL 函数的更多信息，请参阅 [SQL 函数参考](c_SQL_functions.md)。有关表达式的更多信息，请参阅[条件表达式](c_conditional_expressions.md)。

## 语法
<a name="r_SELECT_list-synopsis"></a>

```
SELECT
[ TOP number ]
[ ALL | DISTINCT ] * | expression [ AS column_alias ] [, ...]
```

## 参数
<a name="r_SELECT_list-parameters"></a>

TOP *number*   
TOP 将正整数用作其参数，用于定义返回到客户端的行数。使用 TOP 子句的行为与使用 LIMIT 子句的行为相同。返回的行数是固定的，但行集不固定。要返回一致的行集，请将 TOP 或 LIMIT 与 ORDER BY 子句结合使用。

ALL   
一个冗余关键字，定义未指定 DISTINCT 的情况下的默认行为。`SELECT ALL *` 与 `SELECT *` 的含义相同（选择所有列的所有行并保留重复条目）。

DISTINCT   
一个选项，用于根据一个或多个列中的匹配值消除结果集中的重复行。  
如果您的应用程序允许无效的外键或主键，则会导致查询返回错误的结果。例如，如果主键列不包含所有唯一值，则 SELECT DISTINCT 查询可能会返回重复的行。有关更多信息，请参阅[定义表约束](https://docs.aws.amazon.com/redshift/latest/dg/t_Defining_constraints.html)。

\$1（星号）   
返回表的完整内容（所有列和所有行）。

 *expression*   
由查询引用的表中存在的一个或多个列构成的表达式。表达式可包含 SQL 函数。例如：  

```
avg(datediff(day, listtime, saletime))
```

AS *column\$1alias*   
在最终结果集中使用的列的临时名称。AS 关键字是可选的。例如：  

```
avg(datediff(day, listtime, saletime)) as avgwait
```
如果您没有为不是简单列名的表达式指定别名，则结果集将对该列应用默认名称。  
在目标列表中定义别名后，它将立即被识别。您可以在其他表达式中使用在同一目标列表中晚于该别名定义的某个别名。以下示例对此进行了说明。  

```
select clicks / impressions as probability, round(100 * probability, 1) as percentage from raw_data;
```
横向别名引用的好处是，当在同一目标列表中构建更复杂的表达式时，不需要重复已指定别名的表达式。当 Amazon Redshift 分析这种类型的引用时，它只会内联之前定义的别名。如果在 `FROM` 子句中定义了一个与之前指定了别名的表达式同名的列，`FROM` 子句中定义的列将优先。例如，在上述查询中，如果表 raw\$1data 中有一个名为“probability”的列，那么目标列表中的第二个表达式中的“probability”引用该列而不是别名“probability”。

## 使用说明
<a name="r_SELECT_list_usage_notes"></a>

TOP 是一个 SQL 扩展；它提供 LIMIT 行为的替代。不能在同一个查询中使用 TOP 和 LIMIT。

## 示例
<a name="r_SELECT_list-examples"></a>

以下示例从 SALES 表中返回 10 行。尽管查询使用 TOP 子句，但它仍然返回一组不可预测的行，因为没有指定 ORDERBY 子句，

```
select top 10 *
from sales;
```

以下查询具有相同的功能，但使用的是 LIMIT 子句而非 TOP 子句：

```
select *
from sales
limit 10;
```

以下示例使用 TOP 子句返回 SALES 表的前 10 行，按 QTYSOLD 列降序排序。

```
select top 10 qtysold, sellerid
from sales
order by qtysold desc, sellerid;

qtysold | sellerid
--------+----------
8 |      518
8 |      520
8 |      574
8 |      718
8 |      868
8 |     2663
8 |     3396
8 |     3726
8 |     5250
8 |     6216
(10 rows)
```

以下示例返回 SALES 表中的前两个 QTYSOLD 和 SELLERID 值（按 QTYSOLD 列排序）：

```
select top 2 qtysold, sellerid
from sales
order by qtysold desc, sellerid;

qtysold | sellerid
--------+----------
8 |      518
8 |      520
(2 rows)
```

以下示例显示 CATEGORY 表中不同类别组的列表：

```
select distinct catgroup from category
order by 1;

catgroup
----------
Concerts
Shows
Sports
(3 rows)

--the same query, run without distinct
select catgroup from category
order by 1;

catgroup
----------
Concerts
Concerts
Concerts
Shows
Shows
Shows
Sports
Sports
Sports
Sports
Sports
(11 rows)
```

以下示例返回 2008 年 12 月的一组不同的周编号。如果没有 DISTINCT 子句，该语句将返回 31 行，或对于月份的每一天返回 1 行。

```
select distinct week, month, year
from date
where month='DEC' and year=2008
order by 1, 2, 3;

week | month | year
-----+-------+------
49 | DEC   | 2008
50 | DEC   | 2008
51 | DEC   | 2008
52 | DEC   | 2008
53 | DEC   | 2008
(5 rows)
```

