

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# SELECT 子句
<a name="sql-reference-select-clause"></a>

 <select-clause> 在 STREAM 关键字之后使用以下项目：

```
  <select-list> :=
    <select-item> { , <select-item> }...
 <select-item> :=
    <select-expression> [ [ AS ] <simple-identifier> ]
 <simple-identifier> :=
    <identifier> | <quoted-identifier>
 <select-expression> :=
    <identifier> . *  | *  | <expression>
```

## Expressions
<a name="w2aac20c15c17b9"></a>

这些表达式中的每一个都可以是：
+ 标量表达式
+ 对[聚合函数](sql-reference-aggregate-functions.md)的调用，前提是这是聚合查询（请参阅 [GROUP BY 子句](sql-reference-group-by-clause.md)）
+ 对[分析函数](sql-reference-analytic-functions.md)的调用，前提是这是聚合查询
+ 通配符表达式 \$1 扩展到 FROM 子句中所有关系的所有列
+ 通配符表达式别名。\$1 扩展到由关系命名的别名的所有列
+ 的 [ROWTIME](sql-reference-rowtime.md)
+ a [CASE 表达式](#sql-reference-select-clause-caseexpr)

可以使用 AS column\$1name 语法为每个表达式都分配一个别名。这是此查询的结果集中的列名称。如果此查询位于封闭查询的 FROM 子句中，则此名称将用于引用该列。在流引用的 AS 子句中指定的列数必须与原始流中定义的列数相匹配。

Amazon Kinesis Data Analytics 有一些简单的规则可以派生没有别名的表达式的别名。列表达式的默认别名是列名称：例如，默认情况下，EMPS.DEPTNO 的别名为 DEPTNO。其他表达式则使用像 EXPR\$10 这样的别名。您不应假设系统每次都会生成相同的别名。

在流式查询中，将列的别名设置为 ROWTIME 具有特殊含义：有关更多信息，请参阅 [ROWTIME](sql-reference-rowtime.md)。

**注意**  
所有流都有一个名为 ROWTIME 的隐式列。此列可能会影响您对 SQL:2008 现在支持的语法“AS t(c1, c2, ...)”的使用。以前在 FROM 子句中您只能编写

```
SELECT ... FROM r1 AS t1 JOIN r2 as t2
```

但是 t1 和 t2 的列将与 r1 和 t2 的列相同。AS 语法允许您通过编写以下内容来重命名 r1 的列：

```
SELECT ... FROM r1 AS t1(a, b, c)
```

（r1 必须恰好有 3 列才能使用此语法）。

如果 r1 是流，则隐式包含 ROWTIME，但它不算作一列。因此，如果一个流有 3 列而不包含 ROWTIME，则不能通过指定 4 列来重命名 ROWTIME。例如，如果 Bids 流有三列，则以下代码无效。

```
SELECT STREAM * FROM Bids (a, b, c, d)
```

重命名另一列 ROWTIME 也是无效的，如以下示例所示。

```
SELECT STREAM * FROM Bids (ROWTIME, a, b)
```

因为这意味着将另一列重命名为 ROWTIME。有关表达式和文字的更多信息，请参阅[表达式和文字](sql-reference-expressions.md)。

## CASE 表达式
<a name="sql-reference-select-clause-caseexpr"></a>

CASE 表达式允许您为每个此类测试指定一组离散测试表达式和特定的返回值（表达式）。每个测试表达式都在 WHEN 子句中指定；每个返回值表达式都在相应的 THEN 子句中指定。可以指定多个这样的 WHEN-THEN 对。

如果您在第一个 WHEN 子句 comparison-test-expression之前指定一个，则会将 WHEN 子句中的每个表达式与该表达式进行比较 comparison-test-expression。第一个匹配的值 comparison-test-expression会导致返回其相应的 THEN 子句的返回值。如果没有 WHEN 子句表达式与匹配 comparison-test-expression，则除非指定了 ELSE 子句，否则返回值为空，在这种情况下，将返回该 ELSE 子句中的返回值。

如果没有在第一个 WHEN 子句 comparison-test-expression之前指定，则会对 WHEN 子句中的每个表达式进行求值（从左到右），而第一个为真则返回其对应的 THEN 子句的返回值。如果没有 WHEN 子句表达式为 true，则除非指定了 ELSE 子句，否则返回值为 null，在这种情况下，将返回该 ELSE 子句中的返回值。

## VALUES
<a name="sql-reference-select-clause-values"></a>

VALUES 使用表达式来计算一个或多个行值，通常用于较大的命令中。创建多行时，VALUES 子句必须为每行指定相同数量的元素。生成的表列数据类型派生自该列中出现的表达式的显式或推断类型。只要允许 SELECT，语法上都允许使用 VALUES。另请参阅本指南“查询”主题中对 VALUES 作为运算符的讨论。

语法

```
VALUES ( expression [, ...] ) [, ...]
    [ ORDER BY sort_expression [ ASC | DESC | USING operator ] [, ...] ]
```

VALUES 是一个 SQL 运算符，与 SELECT 和 UNION 相同，支持以下类型的操作：
+ 您可以编写 VALUES (1)、(2) 来返回两行，每行都有一个匿名列。
+ 您可以编写 VALUES (1, 'a')、(2, 'b') 来返回两行，每行都有两列。
+ 您可以使用 AS 命名列，如以下示例所示：

```
SELECT * FROM (VALUES (1, 'a'), (2, 'b')) AS t(x, y)
```

VALUES 最重要的用法是在 INSERT 语句中插入一行：

```
  INSERT INTO emps (empno, name, deptno, gender)
    VALUES (107, 'Jane Costa', 22, 'F');
```

但是，您也可以插入多行：

```
   INSERT INTO Trades (ticker, price, amount)
     VALUES ('MSFT', 30.5, 1000),
            ('ORCL', 20.25, 2000);
```

在 SELECT 语句的 FROM 子句中使用 VALUES 时，必须将整个 VALUES 子句括在圆括号中，这与其作为查询而不是表表达式运行的事实一致。有关其他示例，请参阅 [FROM 子句](sql-reference-from-clause.md)。

**注意**  
在流中使用 INSERT 需要考虑行时间、数据泵和 INSERT EXPEDITED 等其他一些注意事项。有关更多信息，请参阅 [INSERT](sql-reference-insert.md)。