基本查询
使用 SELECT 子句,以及 FROM、WHERE、GROUP BY、HAVING、ORDER BY 和 LIMIT 来搜索和聚合数据。
在这些子句中,SELECT 和 FROM 是必需的,因为它们指定要检索的字段以及从哪个索引中检索。所有其他子句都是可选的。根据您的需要使用它们。
语法
搜索和聚合数据的完整语法如下:
SELECT [DISTINCT] (* | expression) [[AS] alias] [, ...]
FROM index_name
[WHERE predicates]
[GROUP BY expression [, ...]
[HAVING predicates]]
[ORDER BY expression [IS [NOT] NULL] [ASC | DESC] [, ...]]
[LIMIT [offset, ] size]
基本原理
除了 SQL 的预定义关键字外,最基本的元素是字面量和标识符。字面量是数字、字符串、日期或布尔常量。标识符是 OpenSearch 索引或字段名称。使用算术运算符和 SQL 函数,可以使用字面量和标识符构建复杂表达式。
规则 expressionAtom

表达式反过来可以与逻辑运算符组合成一个谓词。在 WHERE 和 HAVING 子句中使用谓词,根据特定条件过滤数据。
规则 expression

规则 predicate

执行顺序
这些 SQL 子句的执行顺序与它们出现的顺序不同:
FROM index
WHERE predicates
GROUP BY expressions
HAVING predicates
SELECT expressions
ORDER BY expressions
LIMIT size
SELECT
指定要检索的字段。
语法
规则 selectElements

规则 selectElement

示例 1:使用 * 检索索引中的所有字段
SELECT *
FROM accounts
| account_number | firstname | gender | city | balance | employer | state | address | lastname | age | |
|---|---|---|---|---|---|---|---|---|---|---|
| 1 | Amber | M | Brogan | 39225 | Pyrami | IL | amberduke@pyrami.com | 880 Holmes Lane | Duke | 32 |
| 16 | Hattie | M | Dante | 5686 | Netagy | TN | hattiebond@netagy.com | 671 Bristol Street | Bond | 36 |
| 13 | Nanette | F | Nogal | 32838 | Quility | VA | nanettebates@quility.com | 789 Madison Street | Bates | 28 |
| 18 | Dale | M | Orick | 4180 | MD | daleadams@boink.com | 467 Hutchinson Court | Adams | 33 |
示例 2:使用字段名检索特定字段
SELECT firstname, lastname
FROM accounts
| firstname | lastname |
|---|---|
| Amber | Duke |
| Hattie | Bond |
| Nanette | Bates |
| Dale | Adams |
示例 3:使用字段别名而非字段名。字段别名用于使字段名更具可读性
SELECT account_number AS num
FROM accounts
| num :— | 1 | 6 | 13 | 18
示例 4:使用 DISTINCT 子句仅返回唯一字段值。您可以指定一个或多个字段名
SELECT DISTINCT age
FROM accounts
| age :— | 28 | 32 | 33 | 36
FROM
指定要搜索的索引。您可以在 FROM 子句中指定子查询。
语法
规则 tableName

示例 1:使用索引别名跨索引查询。要了解索引别名,请参阅索引别名。在此示例查询中,acc 是 accounts 索引的别名
SELECT account_number, accounts.age
FROM accounts
或
SELECT account_number, acc.age
FROM accounts acc
| account_number | age |
|---|---|
| 1 | 32 |
| 6 | 36 |
| 13 | 28 |
| 18 | 33 |
示例 2:使用索引模式查询与特定模式匹配的索引
SELECT account_number
FROM account*
| account_number :— | 1 | 6 | 13 | 18
WHERE
指定筛选结果的条件。
| 运算符 | 行为 |
|---|---|
= | 等于。 |
<> | 不等于。 |
> | 大于。 |
< | 小于。 |
>= | 大于或等于。 |
<= | 小于或等于。 |
IN | 指定多个 OR 运算符。 |
BETWEEN | 类似于范围查询。有关范围查询的更多信息,请参阅范围查询。 |
LIKE | 用于全文搜索。有关全文查询的更多信息,请参阅全文查询。 |
IS NULL | 检查字段值是否为 NULL。 |
IS NOT NULL | 检查字段值是否为 NOT NULL。 |
将比较运算符(=、<>、>、>=、<、<=)与布尔运算符 NOT、AND 或 OR 结合,以构建更复杂的表达式。
示例 1:对数字、字符串或日期使用比较运算符
SELECT account_number
FROM accounts
WHERE account_number = 1
| account_number |
|---|
| 1 |
示例 2:OpenSearch 允许灵活的模式,因此索引中的文档可能具有不同的字段。使用 IS NULL 或 IS NOT NULL 仅检索缺失字段或现有字段。OpenSearch 不区分缺失字段和明确设置为 NULL 的字段
SELECT account_number, employer
FROM accounts
WHERE employer IS NULL
| account_number | employer |
|---|---|
| 18 |
示例 3:删除满足 WHERE 子句中谓词的文档
DELETE FROM accounts
WHERE age > 30
GROUP BY
将具有相同字段值的文档分组到桶中。
示例 1:按字段分组
SELECT age
FROM accounts
GROUP BY age
| id | age |
|---|---|
| 0 | 28 |
| 1 | 32 |
| 2 | 33 |
| 3 | 36 |
示例 2:按字段别名分组
SELECT account_number AS num
FROM accounts
GROUP BY num
| id | num |
|---|---|
| 0 | 1 |
| 1 | 6 |
| 2 | 13 |
| 3 | 18 |
示例 4:在 GROUP BY 子句中使用标量函数
SELECT ABS(age) AS a
FROM accounts
GROUP BY ABS(age)
| id | a |
|---|---|
| 0 | 28.0 |
| 1 | 32.0 |
| 2 | 33.0 |
| 3 | 36.0 |
HAVING
使用 HAVING 子句根据聚合函数(COUNT、AVG、SUM、MIN 和 MAX)在每个桶内进行聚合。HAVING 子句会筛选 GROUP BY 子句的结果
示例 1:
SELECT age, MAX(balance)
FROM accounts
GROUP BY age HAVING MIN(balance) > 10000
| id | age | MAX (balance) |
|---|---|---|
| 0 | 28 | 32838 |
| 1 | 32 | 39225 |
ORDER BY
使用 ORDER BY 子句按所需顺序对结果进行排序。
示例 1:使用 ORDER BY 进行升序或降序排序。除了常规字段名,还支持使用 ordinal、alias 或 scalar 函数
SELECT account_number
FROM accounts
ORDER BY account_number DESC
| account_number |
|---|
| 18 |
| 13 |
| 6 |
| 1 |
示例 2:指定缺失字段的文档是放在结果的开头还是末尾。OpenSearch 的默认行为是将空值或缺失字段放在末尾。要将它们推到非空值之前,请使用 IS NOT NULL 运算符
SELECT employer
FROM accounts
ORDER BY employer IS NOT NULL
| employer |
|---|
| Netagy |
| Pyrami |
| Quility |
限制
指定要检索的最大文档数。用于防止将大量数据获取到内存中。
示例 1:如果传入单个参数,它将映射到 OpenSearch 中的 size 参数,并且 from 参数设置为 0。
SELECT account_number
FROM accounts
ORDER BY account_number LIMIT 1
| account_number |
|---|
| 1 |
示例 2:如果传入两个参数,第一个映射到 OpenSearch 中的 from 参数,第二个映射到 size 参数。您可以将其用于小索引的简单分页,因为它对于大索引效率低下。使用 ORDER BY 以确保页面之间顺序相同
SELECT account_number
FROM accounts
ORDER BY account_number LIMIT 1, 1
| account_number |
|---|
| 6 |