Cassandra 文档

版本

您正在查看预发布版本的文档。

定义

约定

为了帮助指定 CQL 语法,我们将在本文档中使用以下约定

  • 语言规则将以非正式的 BNF 变体 表示法给出。特别是,我们将使用方括号 ([ item ]) 表示可选项目,*+ 表示重复项目(其中 + 表示至少一个)。

  • 语法还将使用以下约定以方便起见:非终结符将使用小写字母(并链接到它们的定义),而终结符关键字将以“全部大写”提供。但是请注意,关键字是标识符,因此在实践中不区分大小写。我们还将使用正则表达式定义一些早期构造,我们将用re(<some regular expression>) 表示。

  • 语法是为了文档目的而提供的,并省略了一些细微之处。例如,CREATE TABLE 语句中最后一个列定义的逗号是可选的,但即使本文档中的语法建议并非如此,如果存在,也会得到支持。此外,并非语法接受的所有内容都一定是有效的 CQL。

  • 对运行文本中关键字或 CQL 代码片段的引用将以等宽字体显示。

标识符和关键字

CQL 语言使用标识符(或名称)来标识表、列和其他对象。标识符是与正则表达式[a-zA-Z][a-zA-Z0-9_]*匹配的标记。

一些这样的标识符,如SELECTWITH,是关键字。它们对语言有固定的含义,大多数是保留的。这些关键字的列表可以在附录 A中找到。

标识符和(未加引号的)关键字不区分大小写。因此,SELECTselectsElEcT 相同,myIdmyidMYID 相同。通常使用的一种约定(特别是此文档的示例)是使用大写字母表示关键字,使用小写字母表示其他标识符。

还有一种称为带引号的标识符的标识符,通过将任意字符序列(非空)括在双引号 (") 中来定义。带引号的标识符永远不会是关键字。因此,"select" 不是保留关键字,可以用来引用列(注意,使用这种方法特别不建议),而select 会引发解析错误。此外,与未加引号的标识符和关键字不同,带引号的标识符区分大小写("My Quoted Id""my quoted id"不同)。但是,与[a-zA-Z][a-zA-Z0-9_]*匹配的完全小写的带引号的标识符与通过删除双引号获得的未加引号的标识符等效(因此,"myid" 等效于myidmyId,但与"myId" 不同)。在带引号的标识符中,双引号字符可以重复以转义它,因此"foo "" bar" 是一个有效的标识符。

带引号的标识符可以声明具有任意名称的列,这些名称有时会与服务器使用的特定名称冲突。例如,在使用条件更新时,服务器将使用包含名为"[applied]" 的特殊结果的结果集进行响应。如果您已声明具有此名称的列,这可能会混淆一些工具,应避免。一般来说,应优先使用未加引号的标识符,但如果您使用带引号的标识符,强烈建议您避免任何用方括号括起来的名称(如"[applied]")和任何看起来像函数调用的名称(如"f(x)")。

更正式地说,我们有

identifier::= unquoted_identifier | quoted_identifier
unquoted_identifier::= re('[a-zA-Z][link:[a-zA-Z0-9]]*')
quoted_identifier::= '"' (any character where " can appear if doubled)+ '"'

常量

CQL 定义了以下常量

constant::= string | integer | float | boolean | uuid | blob | NULL
string::= ''' (any character where ' can appear if doubled)+ ''' : '$$' (any character other than '$$') '$$'
integer::= re('-?[0-9]+')
float::= re('-?[0-9]+(.[0-9]*)?([eE][+-]?[0-9+])?') | NAN | INFINITY
boolean::= TRUE | FALSE
uuid::= hex\{8}-hex\{4}-hex\{4}-hex\{4}-hex\{12}
hex::= re("[0-9a-fA-F]")
blob::= '0' ('x' | 'X') hex+

换句话说

  • 字符串常量是任意字符序列,用单引号 (') 括起来。可以通过重复单引号来包含单引号,例如'It''s raining today'。这些不要与使用双引号的带引号的标识符混淆。或者,可以通过用两个美元符号括起来来定义字符串,在这种情况下,单引号可以在不转义的情况下使用(It's raining today)。后一种形式通常在定义用户定义函数 时使用,以避免在函数体中转义单引号字符(因为它们比$$ 更可能出现)。

  • 整数、浮点数和布尔常量按预期定义。但是请注意,浮点数允许特殊常量NaNInfinity

  • CQL 支持UUID 常量。

  • blob 的内容以十六进制提供,并以0x 为前缀。

  • 特殊常量NULL 表示没有值。

有关这些常量的类型,请参见数据类型 部分。

术语

CQL 有术语的概念,它表示 CQL 支持的值类型。术语由以下内容定义

term::= constant | literal | function_call | arithmetic_operation | type_hint | bind_marker
literal::= collection_literal | vector_literal | udt_literal | tuple_literal
function_call::= identifier '(' [ term (',' term)* ] ')'
arithmetic_operation::= '-' term | term ('+' | '-' | '*' | '/' | '%') term
type_hint::= '(' cql_type ')' term
bind_marker::= '?' | ':' identifier

因此,术语是以下之一

  • 一个常量

  • 用于集合向量用户定义类型元组 的文字

  • 一个函数 调用,可以是本机函数用户定义函数

  • 术语之间的算术运算

  • 类型提示

  • 绑定标记,它表示在执行时绑定的变量。有关详细信息,请参见prepared-statements 部分。绑定标记可以是匿名的 (?) 或命名的 (:some_name)。后一种形式提供了一种更方便的方式来引用变量以绑定它,并且通常应优先使用。

注释

CQL 中的注释是以下任一内容开头的行:双破折号 (--) 或双斜杠 (//)。

多行注释也受支持,方法是在// 之间括起来(但不支持嵌套)。

-- This is a comment
// This is a comment too
/* This is
   a multi-line comment */

语句

CQL 由可以分为以下类别的语句组成

  • data-definition 语句,用于定义和更改数据的存储方式(键空间和表)。

  • data-manipulation 语句,用于选择、插入和删除数据。

  • secondary-indexes 语句。

  • materialized-views 语句。

  • cql-roles 语句。

  • cql-permissions 语句。

  • 用户定义函数 (UDF) 语句。

  • udts 语句。

  • cql-triggers 语句。

所有语句都列在下面,并在本文档的其余部分中进行了描述(请参见上面的链接)

cql_statement::= statement [ ';' ]
statement:=: ddl_statement :
        | dml_statement
        | secondary_index_statement
        | materialized_view_statement
        | role_or_permission_statement
        | udf_statement
        | udt_statement
        | trigger_statement
ddl_statement::= use_statement
        | create_keyspace_statement
        | alter_keyspace_statement
        | drop_keyspace_statement
        | create_table_statement
        | alter_table_statement
        | drop_table_statement
        | truncate_statement
dml_statement::= select_statement
        | insert_statement
        | update_statement
        | delete_statement
        | batch_statement
secondary_index_statement::= create_index_statement
        | drop_index_statement
materialized_view_statement::= create_materialized_view_statement
        | drop_materialized_view_statement
role_or_permission_statement::= create_role_statement
        | alter_role_statement
        | drop_role_statement
        | grant_role_statement
        | revoke_role_statement
        | list_roles_statement
        | grant_permission_statement
        | revoke_permission_statement
        | list_permissions_statement
        | create_user_statement
        | alter_user_statement
        | drop_user_statement
        | list_users_statement
udf_statement::= create_function_statement
        | drop_function_statement
        | create_aggregate_statement
        | drop_aggregate_statement
udt_statement::= create_type_statement
        | alter_type_statement
        | drop_type_statement
trigger_statement::= create_trigger_statement
        | drop_trigger_statement

准备好的语句

CQL 支持准备好的语句。准备好的语句是一种优化,它允许仅解析一次查询,但使用不同的具体值执行多次。

任何使用至少一个绑定标记(请参见bind_marker)的语句都需要准备。之后,可以通过为每个标记提供具体值来执行语句。语句的准备和执行方式的具体细节取决于所使用的 CQL 驱动程序,您应该参考驱动程序文档。