本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
在亚马逊密钥空间中处理查询
本节介绍在亚马逊密钥空间(适用于 Apache Cassandra)中处理查询。可用于查询、转换和管理数据的 CQL 语句是SELECT
、INSERT
UPDATE
、和。DELETE
以下主题概述了处理查询时可用的一些更复杂的选项。有关带有示例的完整语言语法,请参见Amazon Keyspaces 中的 DML 语句(数据操作语言)。
在亚马逊密钥空间中使用SELECT
语句IN
运算符
在... 中选择
您可以使用语句从表中查询数据,该SELECT
语句读取表中一行或多行的一列或多列,并返回包含与请求匹配的行的结果集。SELECT
语句包含的select_clause
,用于确定在结果集中读取和返回哪些列。该子句可以包含在返回数据之前转换数据的指令。可选WHERE
子句指定必须查询哪些行,并由作为主键一部分的列上的关系组成。亚马逊密钥空间支持WHERE
条款中的IN
关键字。本部分使用示例演示 Amazon Keyspaces 如何处理带有IN
关键字的SELECT
语句。
此示例演示了 Amazon Keyspaces 如何将带有IN
关键字的SELECT
语句分解为子查询。在此示例中,我们使用名为的表my_keyspace.customers
。该表有一个主键列department_id
sales_region_id
、两个聚类列和以及一列包含该customer_name
列中的客户名称。sales_representative_id
SELECT * FROM my_keyspace.customers; department_id | sales_region_id | sales_representative_id | customer_name ---------------+-----------------+-------------------------+-------------- 0 | 0 | 0 | a 0 | 0 | 1 | b 0 | 1 | 0 | c 0 | 1 | 1 | d 1 | 0 | 0 | e 1 | 0 | 1 | f 1 | 1 | 0 | g 1 | 1 | 1 | h
使用此表,您可以运行以下SELECT
语句,在WHERE
子句中使用IN
关键字在您感兴趣的部门和销售区域中查找客户。以下语句就是一个例子。
SELECT * FROM my_keyspace.customers WHERE department_id IN (0, 1) AND sales_region_id IN (0, 1);
Amazon Keyspaces 将此语句分为四个子查询,如以下输出所示。
SELECT * FROM my_keyspace.customers WHERE department_id = 0 AND sales_region_id = 0; department_id | sales_region_id | sales_representative_id | customer_name ---------------+-----------------+-------------------------+-------------- 0 | 0 | 0 | a 0 | 0 | 1 | b SELECT * FROM my_keyspace.customers WHERE department_id = 0 AND sales_region_id = 1; department_id | sales_region_id | sales_representative_id | customer_name ---------------+-----------------+-------------------------+-------------- 0 | 1 | 0 | c 0 | 1 | 1 | d SELECT * FROM my_keyspace.customers WHERE department_id = 1 AND sales_region_id = 0; department_id | sales_region_id | sales_representative_id | customer_name ---------------+-----------------+-------------------------+-------------- 1 | 0 | 0 | e 1 | 0 | 1 | f SELECT * FROM my_keyspace.customers WHERE department_id = 1 AND sales_region_id = 1; department_id | sales_region_id | sales_representative_id | customer_name ---------------+-----------------+-------------------------+-------------- 1 | 1 | 0 | g 1 | 1 | 1 | h
使用IN
关键字时,Amazon Keyspaces 会在以下任何情况下自动对结果进行分页:
每处理第 10 个子查询后。
在处理 1MB 的逻辑 IO 之后。
如果您配置了
PAGE SIZE
,则 Amazon Keyspaces 会在根据集合读取要处理的查询数量后进行分页。PAGE SIZE
当您使用
LIMIT
关键字减少返回的行数时,Amazon Keyspaces 会在根据集合读取要处理的查询数量后进行分页。LIMIT
下表用一个例子来说明这一点。
有关分页的更多信息,请参阅在亚马逊密钥空间中对结果进行分页。
SELECT * FROM my_keyspace.customers; department_id | sales_region_id | sales_representative_id | customer_name ---------------+-----------------+-------------------------+-------------- 2 | 0 | 0 | g 2 | 1 | 1 | h 2 | 2 | 2 | i 0 | 0 | 0 | a 0 | 1 | 1 | b 0 | 2 | 2 | c 1 | 0 | 0 | d 1 | 1 | 1 | e 1 | 2 | 2 | f 3 | 0 | 0 | j 3 | 1 | 1 | k 3 | 2 | 2 | l
您可以在此表上运行以下语句来查看分页的工作原理。
SELECT * FROM my_keyspace.customers WHERE department_id IN (0, 1, 2, 3) AND sales_region_id IN (0, 1, 2) AND sales_representative_id IN (0, 1);
Amazon Keyspaces 将此语句作为 24 个子查询处理,因为此查询中包含的所有IN
术语的笛卡尔乘积的基数为 24。
department_id | sales_region_id | sales_representative_id | customer_name ---------------+-----------------+-------------------------+-------------- 0 | 0 | 0 | a 0 | 1 | 1 | b 1 | 0 | 0 | d 1 | 1 | 1 | e ---MORE--- department_id | sales_region_id | sales_representative_id | customer_name ---------------+-----------------+-------------------------+-------------- 2 | 0 | 0 | g 2 | 1 | 1 | h 3 | 0 | 0 | j ---MORE--- department_id | sales_region_id | sales_representative_id | customer_name ---------------+-----------------+-------------------------+-------------- 3 | 1 | 1 | k
此示例说明如何在带IN
关键字的SELECT
语ORDER BY
句中使用子句。
SELECT * FROM my_keyspace.customers WHERE department_id IN (3, 2, 1) ORDER BY sales_region_id DESC; department_id | sales_region_id | sales_representative_id | customer_name ---------------+-----------------+-------------------------+-------------- 3 | 2 | 2 | l 3 | 1 | 1 | k 3 | 0 | 0 | j 2 | 2 | 2 | i 2 | 1 | 1 | h 2 | 0 | 0 | g 1 | 2 | 2 | f 1 | 1 | 1 | e 1 | 0 | 0 | d
子查询按照分区键和聚类键列在查询中显示的顺序进行处理。在下面的示例中,首先处理分区键值” 2 “的子查询,然后处理分区键值” 3 “和” 1” 的子查询。给定子查询的结果根据查询的排序子句(如果存在)或表创建期间定义的表的聚类顺序进行排序。
SELECT * FROM my_keyspace.customers WHERE department_id IN (2, 3, 1) ORDER BY sales_region_id DESC; department_id | sales_region_id | sales_representative_id | customer_name ---------------+-----------------+-------------------------+-------------- 2 | 2 | 2 | i 2 | 1 | 1 | h 2 | 0 | 0 | g 3 | 2 | 2 | l 3 | 1 | 1 | k 3 | 0 | 0 | j 1 | 2 | 2 | f 1 | 1 | 1 | e 1 | 0 | 0 | d
在亚马逊密钥空间中对结果进行排序
该ORDER BY
子句指定语句中返回的结果的SELECT
排序顺序。该语句将列名列表作为参数,您可以为每列指定数据的排序顺序。只能在排序子句中指定聚类列,不允许使用非聚类列。
返回结果的两个可用排序顺序选项是ASC
升序排序和DESC
降序排序。
SELECT * FROM my_keyspace.my_table ORDER BY (col1 ASC, col2 DESC, col3 ASC); col1 | col2 | col3 ------+------+------ 0 | 6 | a 1 | 5 | b 2 | 4 | c 3 | 3 | d 4 | 2 | e 5 | 1 | f 6 | 0 | g
SELECT * FROM my_keyspace.my_table ORDER BY (col1 DESC, col2 ASC, col3 DESC); col1 | col2 | col3 ------+------+------ 6 | 0 | g 5 | 1 | f 4 | 2 | e 3 | 3 | d 2 | 4 | c 1 | 5 | b 0 | 6 | a
如果您未在查询语句中指定排序顺序,则使用聚类列的默认顺序。
可以在排序子句中使用的可能排序顺序取决于创建表时分配给每个聚类列的排序顺序。查询结果只能按照创建表时为所有聚类列定义的顺序进行排序,或者按照定义的排序顺序相反的顺序进行排序。不允许使用其他可能的组合。
例如,如果表CLUSTERING ORDER
是(col1 ASC、col2 DESC、col3 ASC),则的有效参数要么ORDER BY
是(col1 ASC、col2 DESC、col3 ASC)或(col1 DESC、col2 ASC、col3 DESC)。有关的更多信息CLUSTERING ORDER
,请参见table_options
下文CREATE TABLE。
在亚马逊密钥空间中对结果进行分页
当为处理SELECT
语句而读取的数据超过 1 MB 时,Amazon Keyspaces 会自动对SELECT
语句的结果进行分页。通过分页,SELECT
语句结果被分成大小为 1 MB(或更小)的 “页面” 数据。应用程序可以先处理第一页结果,然后处理第二页结果,依此类推。在处理返回多行的SELECT
查询时,客户端应始终检查分页标记。
如果客户端提供的数据需要读取超过 1 MB 的数据PAGE SIZE
,则 Amazon Keyspaces 会根据 1 MB 的数据读取增量自动将结果分解为多个页面。
例如,如果一行的平均大小为 100 KB,而您指定为 20,则 Amazon Keyspaces 会在读取 10 行(读取 1000 KB 数据)后自动对数据进行分页。PAGE SIZE
由于 Amazon Keyspaces 根据处理请求时读取的行数而不是结果集中返回的行数对结果进行分页,因此,如果您正在运行筛选查询,则某些页面可能不包含任何行。
例如,如果您设置为 PAGE SIZE
10,而 Keyspaces 计算 30 行以处理您的SELECT
查询,则亚马逊密钥空间将返回三页。如果只有一部分行与您的查询相匹配,则某些页面的行数可能少于 10 行。