정의
정의 (Definitions)
출처: 문서
본문
규약 (Conventions)
CQL 문법을 지정할 때 이 문서에서는 다음 규약을 사용해요:
- 언어 규칙은 비공식적인 BNF 변형 표기법(Backus–Naur Form variant notation)으로 제공됩니다. 특히 선택 항목에는 대괄호(
[ item ])를, 반복 항목에는*와+를 사용해요(+는 최소 하나 이상을 의미). - 문법은 편의를 위해 다음 규약도 사용합니다: 비종단(non-terminal) 항목은 소문자로 표기하고(그 정의로 연결됨), 종단 키워드는 "전부 대문자"로 제공해요. 다만 키워드는 식별자이므로 실제로는 대소문자를 구분하지 않습니다. 또한 일부 초기 구성을 정규표현식으로 정의하는데,
re(<정규표현식>)으로 표시해요. - 문법은 문서화 목적으로 제공되며 세부적인 내용 일부는 생략합니다. 예를 들어
CREATE TABLE문의 마지막 컬럼 정의에 있는 쉼표는 선택적이지만, 이 문서의 문법이 그렇지 않다고 시사하더라도 존재하면 지원됩니다. 또한 문법이 받아들이는 모든 것이 반드시 유효한 CQL은 아닙니다. - 본문에서 키워드나 CQL 코드 조각을 참조할 때는 고정폭 글꼴로 표시됩니다.
식별자와 키워드
CQL 언어는 테이블, 컬럼 및 기타 객체를 식별하기 위해 식별자(identifier, 또는 이름)를 사용해요. 식별자는 정규표현식 [a-zA-Z][a-zA-Z0-9_]*과 일치하는 토큰입니다.
SELECT나 WITH 같은 많은 식별자는 키워드입니다. 언어에서 고정된 의미를 가지며 대부분 예약되어 있어요. 그 키워드 목록은 부록 A에서 확인할 수 있습니다.
식별자와 (따옴표 없이 쓰인) 키워드는 대소문자를 구분하지 않아요. 따라서 SELECT는 select나 sElEcT와 같고, myId는 myid나 MYID와 같습니다. 자주 쓰는 규약(특히 이 문서의 예제에서)은 키워드는 대문자로, 다른 식별자는 소문자로 쓰는 것입니다.
큐오트 식별자(quoted identifier)라고 하는 두 번째 종류의 식별자가 있어요. 이는 임의의 문자 시퀀스(비어 있지 않은)를 큰따옴표(")로 감싸서 정의합니다. 큐오트 식별자는 절대 키워드가 아니에요. 따라서 "select"는 예약 키워드가 아니며 컬럼을 참조하는 데 사용할 수 있어요(다만 이렇게 쓰는 것은 매우 권장되지 않습니다). 반면 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::= '"' (any character where " can appear if doubled)+ '"'
상수 (Constants)
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+
다시 말하면:
- 문자열 상수(string constant)는 작은따옴표(
')로 감싼 임의의 문자 시퀀스예요. 작은따옴표는 반복해서 포함할 수 있어요. 예:'It''s raining today'. 이는 큰따옴표를 사용하는 큐오트 식별자와 혼동하면 안 됩니다. 또는 문자열을 두 개의 달러 문자로 감싸서 정의할 수 있는데, 이 경우 이스케이프 없이 작은따옴표를 쓸 수 있어요(It's raining today). 이 후자의 형태는 사용자 정의 함수를 정의할 때 함수 본문에서 작은따옴표를 이스케이프할 필요가 없도록(달러보다 작은따옴표가 더 자주 등장하므로) 자주 사용됩니다. - 정수, 부동소수, 불리언 상수는 예상대로 정의돼요. 다만 float는 특수 상수
NaN과Infinity를 허용한다는 점에 유의하세요. - CQL은 UUID 상수를 지원해요.
- blob의 내용은 16진수로 제공되며
0x접두사로 시작합니다. - 특수
NULL상수는 값이 없음을 나타냅니다.
이 상수들이 어떻게 타입이 지정되는지는 데이터 타입 섹션을 참고하세요.
항 (Terms)
CQL에는 term이라는 개념이 있어요. term은 CQL이 지원하는 값의 종류를 나타냅니다. term은 다음과 같이 정의됩니다:
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
따라서 term은 다음 중 하나입니다:
- 상수(constant)
- 컬렉션(collection), 벡터(vector), 사용자 정의 타입(user-defined type), 또는 튜플(tuple) 중 하나의 리터럴(literal)
- 네이티브 함수 또는 사용자 정의 함수 중 하나의 함수 호출(function call)
- term 사이의 산술 연산(arithmetic operation)
- 타입 힌트(type hint)
- 바인드 마커(bind marker) — 실행 시점에 바인딩될 변수를 나타내요. 자세한 내용은 prepared-statement 섹션을 참고하세요. 바인드 마커는 익명(
?) 또는 이름 붙은(:some_name) 형태일 수 있어요. 후자는 변수를 참조하고 바인딩하기에 더 편리한 방법을 제공하므로 일반적으로 선호됩니다.
주석 (Comments)
CQL에서 주석은 이중 대시(--)나 이중 슬래시(//)로 시작하는 줄입니다.
/*와 */로 감싸는 멀티라인 주석도 지원됩니다(다만 중첩은 지원되지 않아요).
-- This is a comment
// This is a comment too
/* This is
a multi-line comment */
문 (Statements)
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
준비된 문 (Prepared Statements)
CQL은 prepared statement를 지원해요. prepared statement는 쿼리를 한 번만 파싱하고 서로 다른 구체적인 값으로 여러 번 실행할 수 있게 해주는 최적화입니다.
적어도 하나의 바인드 마커(위 bind_marker 참고)를 사용하는 모든 문은 준비되어야 합니다. 준비 후 그 문은 각 마커에 구체적인 값을 제공해 실행할 수 있어요. 문이 어떻게 준비되고 실행되는지의 정확한 세부 사항은 사용하는 CQL 드라이버에 따라 다르므로, 드라이버 문서를 참고해야 합니다.
더 알아보기 (Learn more)
- 데이터 타입 — 상수의 타입 결정
- 데이터 정의(DDL) — 키스페이스와 테이블 문
- 데이터 조작(DML) — SELECT·INSERT·UPDATE·DELETE