

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

# CloudTrail 湖泊 SQL 限制
<a name="query-limitations"></a>

**注意**  
AWS CloudTrail 从 2026 年 5 月 31 日起，Lake 将不再向新客户开放。如果您想使用 CloudTrail Lake，请在该日期之前注册。现有客户可以继续正常使用该服务。有关更多信息，请参阅 [CloudTrail 湖泊可用性变更](cloudtrail-lake-service-availability-change.md)。

CloudTrail 湖泊查询是 SQL 字符串。本节提供有关支持的函数、运算符和架构相关信息。

仅允许使用 `SELECT` 语句。没有查询字符串可以更改或变更数据。

语句的 CloudTrail Lake `SELECT` 语法如下所示。事件数据存储 ID（事件数据存储 ARN 的 ID 部分）是为 `FROM` 值指定的。

```
SELECT [ DISTINCT ] columns [ Aggregate ]
[ FROM table event_data_store_ID]
[ WHERE columns [ Conditions ] ]
[ GROUP BY columns [ DISTINCT | Aggregate ] ]
[ HAVING columns [ Aggregate | Conditions ] ]
[ ORDER BY columns [ Aggregate | ASC | DESC | NULLS | FIRST | LAST ]
[ LIMIT [ INT ] ]
```

CloudTrail Lake 支持所有有效的 Trino SQL `SELECT` 语句、函数和运算符。如需详细了解支持的 SQL 函数和运算符，请参阅 Trino 文档网站中的[函数和运算符](https://trino.io/docs/current/functions.html)。

 CloudTrail 控制台提供了许多示例查询，可以帮助您开始编写自己的查询。有关更多信息，请参阅 [使用 CloudTrail 控制台查看示例查询](lake-console-queries.md)。

有关如何优化查询的信息，请参阅 [优化 CloudTrail Lake 查询](lake-queries-optimization.md)。

**Topics**
+ [支持的函数、条件和联接运算符](#query-aggregates-condition-operators)
+ [高级多表查询支持](#query-advanced-multi-table)

## 支持的函数、条件和联接运算符
<a name="query-aggregates-condition-operators"></a>

**支持的函数**

CloudTrail Lake 支持 Trino 的所有功能。如需详细了解支持的函数，请参阅 Trino 文档网站中的[函数和运算符](https://trino.io/docs/current/functions.html)。

**支持的条件运算符**

以下是支持的条件运算符。

```
AND
OR
IN
NOT
IS (NOT) NULL
LIKE
BETWEEN
GREATEST
LEAST
IS DISTINCT FROM
IS NOT DISTINCT FROM
<
>
<=
>=
<>
!=
( conditions ) #parenthesised conditions
```

**支持的联接运算符**

以下是支持的 `JOIN` 运算符。有关运行多表查询的更多信息，请参阅 [高级多表查询支持](#query-advanced-multi-table)。

```
UNION 
UNION ALL 
EXCEPT 
INTERSECT 
LEFT JOIN 
RIGHT JOIN 
INNER JOIN
```

## 高级多表查询支持
<a name="query-advanced-multi-table"></a>

CloudTrail Lake 支持跨多个事件数据存储的高级查询语言。
+ [`UNION|UNION ALL|EXCEPT|INTERSECT`](#query-multi-table-union)
+ [`LEFT|RIGHT|INNER JOIN`](#query-multi-table-left-right)

要运行查询，请在 AWS CLI中使用 **start-query** 命令。以下是一个示例，它使用本节中的一个示例查询。

```
aws cloudtrail start-query
--query-statement "Select eventId, eventName from EXAMPLEf852-4e8f-8bd1-bcf6cEXAMPLE UNION Select eventId, eventName from EXAMPLEg741-6y1x-9p3v-bnh6iEXAMPLE UNION ALL Select eventId, eventName from EXAMPLEb529-4e8f9l3d-6m2z-lkp5sEXAMPLE ORDER BY eventId LIMIT 10;"
```

响应是 `QueryId` 字符串。要获取查询的状态，请使用 `start-query` 返回的值 `QueryId` 运行 `describe-query`。如果查询成功，您可以运行 `get-query-results` 以获取结果。

### `UNION|UNION ALL|EXCEPT|INTERSECT`
<a name="query-multi-table-union"></a>

以下是一个查询示例，该查询使用`UNION`和`UNION ALL`在三个事件数据存储中按事件 ID 和事件名称查找事件，即 EDS1 EDS2、和 EDS3。首先从每个事件数据存储中选择结果，然后将结果串联起来，按事件 ID 排序，并限制为十个事件。

```
Select eventId, eventName from EDS1
UNION
Select eventId, eventName from EDS2
UNION ALL
Select eventId, eventName from EDS3 
ORDER BY eventId LIMIT 10;
```

### `LEFT|RIGHT|INNER JOIN`
<a name="query-multi-table-left-right"></a>

以下是一个示例查询，它使用 `LEFT JOIN` 查找名为 `eds2`、映射到 `edsB` 的事件数据存储中的所有事件，这些事件与主（左侧）事件数据存储 `edsA` 中的事件匹配。返回的事件发生在 2020 年 1 月 1 日或之前，并且仅返回事件名称。

```
SELECT edsA.eventName, edsB.eventName, element_at(edsA.map, 'test')
FROM eds1 as edsA 
LEFT JOIN eds2 as edsB
ON edsA.eventId = edsB.eventId 
WHERE edsA.eventtime <= '2020-01-01'
ORDER BY edsB.eventName;
```