标识符和关键字:
CQL语言使用标识符(或名称)来标识表,列和其他对象。标识符是一个与正则表达式[a-zA-Z][a-zA-Z0-9_]*匹配的token。许多像SELECT或WITH这样的标识符是关键字。 他们对语言有固定的意义,大多数是保留的关键字。
标识符和关键字不区分大小写。 因此SELECT与select或sElEcT相同,myId与myid或MYID相同。 通常使用的惯例(特别是本文档的示例)使用大写字母表示关键字,小写字母表示其他标识符。还有一种标识符称为引号标识符,通过在双引号(“)中包含任意非空字符序列来定义。引号标识符永远不是关键字,因此“select”不是保留关键字,其可以用于引用列。 此外,与不带引号的标识符和关键字相反,带引号的标识符区分大小写("My Quoted Id"不同于 "my quoted id")。匹配[a-zA-Z] [a-zA-Z0-9 _] *的完全小写的引号标识符等效于通过删除双引号获得的非引号标识符(因此“myid”等同于myid和myId 但不同于“myId”)。 在带引号的标识符中,可以通过重复双引号来以转义它,因此"foo""bar"是有效的标识符。
注:引号标识符允许声明具有任意名称的列,并且这些列有时可能与服务器使用的特定名称冲突。 例如,当使用条件更新时,服务器将使用包含名为“[applied]”的特殊结果的结果集进行响应。 如果你已经声明了一个这样的名字的列,这可能会混淆一些工具,应该避免。 一般来说,非引号标识符应该是首选,但是如果你使用带引号的标识符,强烈建议避免使用方括号括起来的任何名称(如“[applied]”)和任何看起来像函数调用的名称(如“f(x )“)。
更正式地说,我们有:
常量:
CQL定义了如下这些类型的常量:
(1)字符串常量是由单引号(')括起来的任意字符序列。 可以通过重复单引号来包括单引号。'It''s raining today'。 这些不要与使用双引号的带引号的标识符和关键字混淆。 或者,可以通过用两个美元字符包围任意字符序列来定义字符串,在这种情况下,单引号可以在不转义的情况下使用。 后者形式通常用于定义用户定义的函数,以避免在函数体中转义单引号字符。
(2)Integer,float和boolean常量都按预期进行定义。 但是请注意,float允许特殊的NaN和Infinity(无穷大常数)。
(3)CQL支持UUID常量。
(4)BLOB内容以十六进制形式提供,并且以0x作为前缀。
(5)特殊的NULL常量表示不存在值。
Term:
term必是下列内容之一:
(1)常数。
(2)集合、用户定义类型或元组的字面量。
(3)函数调用
(4)类型提示
(5) 绑定标记,表示在执行时绑定的变量。 绑定标记可以是匿名(?)的也可以是命名(:some_name)的。 后一种形式提供了一种更方便的方式来引用变量来绑定它,并且通常是优选的。
注释:
CQL中的注释是以双破折号( - )或双斜线(//)开头的行。
多行注释也通过/ *和* /中的机箱支持(但不支持嵌套)。
示例:
语句:
CQL由可以划分为以下类别的语句组成:
数据定义语句,用于定义和更改数据的存储方式(键空间和表)
数据操作语句,用于选择,插入和删除数据
二级索引语句
物化视图语句
数据库角色语句
权限声明
用户定义函数语句
用户定义类型语句
触发器语句
以下为CQL所有语句:
预编译:
CQL支持预编译语句。 预编译语句是一种优化,它允许只解析一次查询,但使用不同的具体值执行多次。任何至少使用一个绑定标记的语句都需要使用预编译,使用预编译之后可以通过为其每个标记提供的具体值来执行语句。语句如何预编译并执行的确切细节取决于所使用的CQL驱动程序,需要参考驱动程序文档。
CQL语言使用标识符(或名称)来标识表,列和其他对象。标识符是一个与正则表达式[a-zA-Z][a-zA-Z0-9_]*匹配的token。许多像SELECT或WITH这样的标识符是关键字。 他们对语言有固定的意义,大多数是保留的关键字。
标识符和关键字不区分大小写。 因此SELECT与select或sElEcT相同,myId与myid或MYID相同。 通常使用的惯例(特别是本文档的示例)使用大写字母表示关键字,小写字母表示其他标识符。还有一种标识符称为引号标识符,通过在双引号(“)中包含任意非空字符序列来定义。引号标识符永远不是关键字,因此“select”不是保留关键字,其可以用于引用列。 此外,与不带引号的标识符和关键字相反,带引号的标识符区分大小写("My Quoted Id"不同于 "my quoted id")。匹配[a-zA-Z] [a-zA-Z0-9 _] *的完全小写的引号标识符等效于通过删除双引号获得的非引号标识符(因此“myid”等同于myid和myId 但不同于“myId”)。 在带引号的标识符中,可以通过重复双引号来以转义它,因此"foo""bar"是有效的标识符。
注:引号标识符允许声明具有任意名称的列,并且这些列有时可能与服务器使用的特定名称冲突。 例如,当使用条件更新时,服务器将使用包含名为“[applied]”的特殊结果的结果集进行响应。 如果你已经声明了一个这样的名字的列,这可能会混淆一些工具,应该避免。 一般来说,非引号标识符应该是首选,但是如果你使用带引号的标识符,强烈建议避免使用方括号括起来的任何名称(如“[applied]”)和任何看起来像函数调用的名称(如“f(x )“)。
更正式地说,我们有:
identifier ::=unquoted_identifier
|quoted_identifier
unquoted_identifier ::= re('[a-zA-Z][a-zA-Z0-9_]*') quoted_identifier ::= '"' (任意"可以加倍出现的字符)+ '"'
常量:
CQL定义了如下这些类型的常量:
constant ::=解释说明:string
|integer
|float
|boolean
|uuid
|blob
| NULL string ::= '\'' (任意'可以加倍出现的字符)+ '\'' '$$' (除“$$”之外的任何字符) '$$' 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
+
(1)字符串常量是由单引号(')括起来的任意字符序列。 可以通过重复单引号来包括单引号。'It''s raining today'。 这些不要与使用双引号的带引号的标识符和关键字混淆。 或者,可以通过用两个美元字符包围任意字符序列来定义字符串,在这种情况下,单引号可以在不转义的情况下使用。 后者形式通常用于定义用户定义的函数,以避免在函数体中转义单引号字符。
(2)Integer,float和boolean常量都按预期进行定义。 但是请注意,float允许特殊的NaN和Infinity(无穷大常数)。
(3)CQL支持UUID常量。
(4)BLOB内容以十六进制形式提供,并且以0x作为前缀。
(5)特殊的NULL常量表示不存在值。
Term:
term ::=解释说明:constant
|literal
|function_call
|type_hint
|bind_marker
literal ::=collection_literal
|udt_literal
|tuple_literal
function_call ::=identifier
'(' [term
(','term
)* ] ')' type_hint ::= '('cql_type
`)` term bind_marker ::= '?' | ':'identifier
term必是下列内容之一:
(1)常数。
(2)集合、用户定义类型或元组的字面量。
(3)函数调用
(4)类型提示
(5) 绑定标记,表示在执行时绑定的变量。 绑定标记可以是匿名(?)的也可以是命名(:some_name)的。 后一种形式提供了一种更方便的方式来引用变量来绑定它,并且通常是优选的。
注释:
CQL中的注释是以双破折号( - )或双斜线(//)开头的行。
多行注释也通过/ *和* /中的机箱支持(但不支持嵌套)。
示例:
-- This is a comment // This is a comment too /* This is a multi-line comment */
语句:
CQL由可以划分为以下类别的语句组成:
数据定义语句,用于定义和更改数据的存储方式(键空间和表)
数据操作语句,用于选择,插入和删除数据
二级索引语句
物化视图语句
数据库角色语句
权限声明
用户定义函数语句
用户定义类型语句
触发器语句
以下为CQL所有语句:
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支持预编译语句。 预编译语句是一种优化,它允许只解析一次查询,但使用不同的具体值执行多次。任何至少使用一个绑定标记的语句都需要使用预编译,使用预编译之后可以通过为其每个标记提供的具体值来执行语句。语句如何预编译并执行的确切细节取决于所使用的CQL驱动程序,需要参考驱动程序文档。