

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

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

SELECT 从流中检索行。您可以将 SELECT 用作顶级语句，也可以用作涉及集合运算的查询的一部分，或其他语句的一部分，包括（例如）作为查询传递到 UDX 时。有关示例，请参阅本指南中的主题 INSERT、IN、EXISTS 和 [CREATE PUMP](sql-reference-create-pump.md)。

本指南中的 [SELECT 子句](sql-reference-select-clause.md)、[GROUP BY 子句](sql-reference-group-by-clause.md)、流式 GROUP BY、[ORDER BY 子句](sql-reference-order-by-clause.md)、[HAVING 子句](sql-reference-having-clause.md)、[WINDOW 子句 (滑动窗口)](sql-reference-window-clause.md)和 [WHERE 子句](sql-reference-where-clause.md)主题中介绍了 SELECT 语句的子句。

## 语法
<a name="sql-reference-select-syntax"></a>

```
 <select> :=
    SELECT [ STREAM] [ DISTINCT | ALL ]
    <select-clause>
    FROM <from-clause>
    [ <where-clause> ]
    [ <group-by-clause> ]
    [ <having-clause> ]
    [ <window-clause> ]
    [ <order-by-clause> ]
```

## STREAM 关键字和流式 SQL 的原理
<a name="sql-reference-select-stream"></a>

SQL 查询语言专为查询存储关系和生成有限关系结果而设计。

流式 SQL 的基础是 STREAM 关键字，以便告诉系统计算关系的时间差。关系的时间差是关系相对于时间的变化。流式查询计算关系相对于时间的变化，或者根据多种关系计算得出的表达式的变化。

要在 Amazon Kinesis Data Analytics 中查询关系的时间差，我们使用 STREAM 关键字：

```
SELECT STREAM * FROM Orders
```

如果我们在 10:00 开始运行该查询，将在 10:15 和 10:25 生成行。在 10:30，该查询仍在运行，等待未来的订单：

```
ROWTIME  orderId custName   product quantity
======== ======= ========== ======= ========
10:15:00     102 Ivy Black  Rice           6
10:25:00     103 John Wu    Apples         3
```

在这里，系统表示：“在 10:15:00，我执行了查询 SELECT \$1 FROM Orders，发现结果中有一行在 10:14:59.999 不存在。” 它在 ROWTIME 列中生成值为 10:15:00 的行，因为这是该行出现的时间。这是流的核心思想：一种会随着时间的推移而不断更新的关系。

您可以将此定义应用于更复杂的查询。例如，流

```
SELECT STREAM * FROM Orders WHERE quantity > 5
```

在 10:15 有一行但在 10:25 没有行，因为这种关系

```
SELECT * FROM Orders WHERE quantity > 5
```

在订单 102 于 10:15 下达时从空白转移到了一个行，但在订单 103 于 10:25 下达时未受影响。

我们可以将相同的逻辑应用于涉及 SQL 运算符任意组合的查询。当转换为流时，涉及 JOIN、GROUP BY、子查询、集合运算 UNION、INTERSECT、EXCEPT，甚至限定符（例如 IN 和 EXISTS）的查询都是明确定义的。结合了流和存储关系的查询也是明确定义的。