---
title: "Grammar diagrams YCQL"
url: "https://docs.yugabyte.com/stable/api/ycql/grammar_diagrams/"
---

# Grammar diagrams YCQL

### alter\_table

```
alter_table ::= ALTER TABLE table_name 
                { ADD { column_name column_type } [ , ... ]
                  | DROP { column_name [ , ... ] }
                  | RENAME { column_name TO column_name } [ , ... ]
                  | WITH { property_name = property_literal } 
                    [ AND ... ] } [ ... ]
```

ALTERTABLE[table\_name](/stable/api/ycql/grammar_diagrams#table-name)ADD,[column\_name](/stable/api/ycql/grammar_diagrams#column-name)[column\_type](/stable/api/ycql/grammar_diagrams#column-type)DROP,[column\_name](/stable/api/ycql/grammar_diagrams#column-name)RENAME,[column\_name](/stable/api/ycql/grammar_diagrams#column-name)TO[column\_name](/stable/api/ycql/grammar_diagrams#column-name)WITHAND[property\_name](/stable/api/ycql/grammar_diagrams#property-name)=[property\_literal](/stable/api/ycql/grammar_diagrams#property-literal)

### column\_type

```
column_type ::= '<type>'
```

&lt;type&gt;

### create\_index

```output.ebnf
create_index ::= CREATE [ UNIQUE ] [ DEFERRED ] INDEX 
                 [ IF NOT EXISTS ] index_name ON  table_name ( 
                 partition_key_columns , [ clustering_key_columns ] )  
                 [ covering_columns ] [ index_properties ] 
                 [ WHERE index_predicate ]
```

CREATEUNIQUEDEFERREDINDEXIFNOTEXISTS[index\_name](/stable/api/ycql/grammar_diagrams#index-name)ON[table\_name](/stable/api/ycql/grammar_diagrams#table-name)([partition\_key\_columns](/stable/api/ycql/grammar_diagrams#partition-key-columns),[clustering\_key\_columns](/stable/api/ycql/grammar_diagrams#clustering-key-columns))[covering\_columns](/stable/api/ycql/grammar_diagrams#covering-columns)[index\_properties](/stable/api/ycql/grammar_diagrams#index-properties)WHERE[index\_predicate](/stable/api/ycql/grammar_diagrams#index-predicate)

### partition\_key\_columns

```
partition_key_columns ::= index_column | ( index_column [ , ... ] )
```

[index\_column](/stable/api/ycql/grammar_diagrams#index-column)(,[index\_column](/stable/api/ycql/grammar_diagrams#index-column))

### clustering\_key\_columns

```
clustering_key_columns ::= index_column [ , ... ]
```

,[index\_column](/stable/api/ycql/grammar_diagrams#index-column)

### index\_properties

```
index_properties ::= WITH 
                     { property_name = property_literal
                       | CLUSTERING ORDER BY ( 
                         { index_column [ ASC | DESC ] } [ , ... ] ) } 
                     [ AND ... ]
```

WITHAND[property\_name](/stable/api/ycql/grammar_diagrams#property-name)=[property\_literal](/stable/api/ycql/grammar_diagrams#property-literal)CLUSTERINGORDERBY(,[index\_column](/stable/api/ycql/grammar_diagrams#index-column)ASCDESC)

### index\_column

```
index_column ::= column_name | jsonb_attribute
```

[column\_name](/stable/api/ycql/grammar_diagrams#column-name)[jsonb\_attribute](/stable/api/ycql/grammar_diagrams#jsonb-attribute)

### jsonb\_attribute

```
jsonb_attribute ::= column_name [ -> ''attribute_name'' [ ... ] ] ->> 
                    ''attribute_name''
```

[column\_name](/stable/api/ycql/grammar_diagrams#column-name)-&gt;'attribute\_name'-&gt;&gt;'attribute\_name'

### covering\_columns

```
covering_columns ::= { COVERING | INCLUDE } ( column_name [ , ... ] )
```

COVERINGINCLUDE(,[column\_name](/stable/api/ycql/grammar_diagrams#column-name))

### index\_predicate

```
index_predicate ::= where_expression
```

[where\_expression](/stable/api/ycql/grammar_diagrams#where-expression)

### create\_keyspace

```
create_keyspace ::= CREATE { KEYSPACE | SCHEMA } [ IF NOT EXISTS ] 
                    keyspace_name keyspace_properties
```

CREATEKEYSPACESCHEMAIFNOTEXISTS[keyspace\_name](/stable/api/ycql/grammar_diagrams#keyspace-name)[keyspace\_properties](/stable/api/ycql/grammar_diagrams#keyspace-properties)

### keyspace\_properties

```
keyspace_properties ::= [ WITH REPLICATION = { keyspace_property 
                          [ , ... ] } ] 
                        [ AND DURABLE_WRITES = { 'true' | 'false' } ]
```

WITHREPLICATION={,[keyspace\_property](/stable/api/ycql/grammar_diagrams#keyspace-property)}ANDDURABLE\_WRITES=truefalse

### keyspace\_property

```
keyspace_property ::= property_name = property_literal
```

[property\_name](/stable/api/ycql/grammar_diagrams#property-name)=[property\_literal](/stable/api/ycql/grammar_diagrams#property-literal)

### create\_table

```
create_table ::= CREATE TABLE [ IF NOT EXISTS ] table_name ( 
                 table_schema ) [ table_properties ]
```

CREATETABLEIFNOTEXISTS[table\_name](/stable/api/ycql/grammar_diagrams#table-name)([table\_schema](/stable/api/ycql/grammar_diagrams#table-schema))[table\_properties](/stable/api/ycql/grammar_diagrams#table-properties)

### table\_schema

```
table_schema ::= { column_name column_type 
                   { PRIMARY KEY | STATIC } [ ... ]
                   | PRIMARY KEY ( ( column_name [ , ... ] ) 
                     [ , column_name [ ... ] ] ) } [ , ... ]
```

,[column\_name](/stable/api/ycql/grammar_diagrams#column-name)[column\_type](/stable/api/ycql/grammar_diagrams#column-type)PRIMARYKEYSTATICPRIMARYKEY((,[column\_name](/stable/api/ycql/grammar_diagrams#column-name)),[column\_name](/stable/api/ycql/grammar_diagrams#column-name))

### table\_properties

```
table_properties ::= WITH 
                     { property_name = property_literal
                       | CLUSTERING ORDER BY ( 
                         { column_name [ ASC | DESC ] } [ , ... ] )
                       | COMPACT STORAGE } [ AND ... ]
```

WITHAND[property\_name](/stable/api/ycql/grammar_diagrams#property-name)[=](/stable/api/ycql/grammar_diagrams#=)[property\_literal](/stable/api/ycql/grammar_diagrams#property-literal)CLUSTERINGORDERBY(,[column\_name](/stable/api/ycql/grammar_diagrams#column-name)ASCDESC)COMPACTSTORAGE

### create\_type

```
create_type ::= CREATE TYPE [ IF NOT EXISTS ] type_name ( 
                { field_name field_type } [ , ... ] )
```

CREATETYPEIFNOTEXISTS[type\_name](/stable/api/ycql/grammar_diagrams#type-name)(,[field\_name](/stable/api/ycql/grammar_diagrams#field-name)[field\_type](/stable/api/ycql/grammar_diagrams#field-type))

### field\_type

```
field_type ::= '<type>'
```

&lt;type&gt;

### drop\_keyspace

```
drop_keyspace ::= DROP { KEYSPACE | SCHEMA } [ IF EXISTS ] 
                  keyspace_name
```

DROPKEYSPACESCHEMAIFEXISTS[keyspace\_name](/stable/api/ycql/grammar_diagrams#keyspace-name)

### drop\_table

```
drop_table ::= DROP TABLE [ IF EXISTS ] table_name
```

DROPTABLEIFEXISTS[table\_name](/stable/api/ycql/grammar_diagrams#table-name)

### drop\_type

```
drop_type ::= DROP TYPE [ IF EXISTS ] type_name
```

DROPTYPEIFEXISTS[type\_name](/stable/api/ycql/grammar_diagrams#type-name)

### use\_keyspace

```
use_keyspace ::= USE keyspace_name
```

USE[keyspace\_name](/stable/api/ycql/grammar_diagrams#keyspace-name)

### delete

```
delete ::= DELETE FROM table_name 
               [ USING TIMESTAMP timestamp_expression ] WHERE 
               where_expression [ IF { [ NOT ] EXISTS | if_expression } ] 
               [ RETURNS STATUS AS ROW ]
```

DELETEFROM[table\_name](/stable/api/ycql/grammar_diagrams#table-name)USINGTIMESTAMP[timestamp\_expression](/stable/api/ycql/grammar_diagrams#timestamp-expression)WHERE[where\_expression](/stable/api/ycql/grammar_diagrams#where-expression)IFNOTEXISTS[if\_expression](/stable/api/ycql/grammar_diagrams#if-expression)RETURNS STATUS AS ROW

### where\_expression

```
where_expression ::= { column_name { < | <=
                                     | = | >=
                                     | > | IN
                                     | NOT IN } expression } 
                     [ AND ... ]
```

AND[column\_name](/stable/api/ycql/grammar_diagrams#column-name)&lt;&lt;==&gt;=&gt;INNOT IN[expression](/stable/api/ycql/grammar_diagrams#expression)

### if\_expression

```
if_expression ::= { column_name { < | <= | = | >= | > | IN | NOT IN } 
                  expression } [ AND ... ]
```

AND[column\_name](/stable/api/ycql/grammar_diagrams#column-name)&lt;&lt;==&gt;=&gt;INNOT IN[expression](/stable/api/ycql/grammar_diagrams#expression)

### insert

```
insert ::= INSERT INTO table_name ( column_name [ , ... ] ) VALUES ( 
           expression [ , ... ] )  
           [ IF { [ NOT ] EXISTS | if_expression } ] 
           [ USING using_expression ] 
           [ RETURNS STATUS AS ROW ]
```

INSERTINTO[table\_name](/stable/api/ycql/grammar_diagrams#table-name)(,[column\_name](/stable/api/ycql/grammar_diagrams#column-name))VALUES(,[expression](/stable/api/ycql/grammar_diagrams#expression))IFNOTEXISTS[if\_expression](/stable/api/ycql/grammar_diagrams#if-expression)USING[using\_expression](/stable/api/ycql/grammar_diagrams#using-expression)RETURNS STATUS AS ROW

### using\_expression

```
using_expression ::= ttl_or_timestamp_expression [ AND ... ]
```

AND[ttl\_or\_timestamp\_expression](/stable/api/ycql/grammar_diagrams#ttl-or-timestamp-expression)

### ttl\_or\_timestamp\_expression

```
ttl_or_timestamp_expression ::= TTL ttl_expression
                                | TIMESTAMP timestamp_expression
```

TTL[ttl\_expression](/stable/api/ycql/grammar_diagrams#ttl-expression)TIMESTAMP[timestamp\_expression](/stable/api/ycql/grammar_diagrams#timestamp-expression)

### expression

```
expression ::= '<expression>'
```

&lt;expression&gt;

### select

```
select ::= SELECT [ DISTINCT ] { * | column_name [ , ... ] } FROM 
           table_name  [ WHERE where_expression [ ALLOW FILTERING ] ]  
           [ IF if_expression ]  [ ORDER BY order_expression ]  
           [ LIMIT limit_expression ] [ OFFSET offset_expression ]
```

SELECTDISTINCT\*,[column\_name](/stable/api/ycql/grammar_diagrams#column-name)FROM[table\_name](/stable/api/ycql/grammar_diagrams#table-name)WHERE[where\_expression](/stable/api/ycql/grammar_diagrams#where-expression)ALLOW FILTERINGIF[if\_expression](/stable/api/ycql/grammar_diagrams#if-expression)ORDER BY[order\_expression](/stable/api/ycql/grammar_diagrams#order-expression)LIMIT[limit\_expression](/stable/api/ycql/grammar_diagrams#limit-expression)OFFSET[offset\_expression](/stable/api/ycql/grammar_diagrams#offset-expression)

### order\_expression

```
order_expression ::= ( { column_name [ ASC | DESC ] } [ , ... ] )
```

(,[column\_name](/stable/api/ycql/grammar_diagrams#column-name)ASCDESC)

### update

```
update ::= UPDATE table_name [ USING using_expression ] SET assignment 
           [ , ... ]  WHERE where_expression 
           [ IF { if_expression
                  | [ NOT ] EXISTS
                  | if_expression OR [ NOT ] EXISTS } ] 
           [ RETURNS STATUS AS ROW ]
```

UPDATE[table\_name](/stable/api/ycql/grammar_diagrams#table-name)USING[using\_expression](/stable/api/ycql/grammar_diagrams#using-expression)SET,[assignment](/stable/api/ycql/grammar_diagrams#assignment)WHERE[where\_expression](/stable/api/ycql/grammar_diagrams#where-expression)IF[if\_expression](/stable/api/ycql/grammar_diagrams#if-expression)NOTEXISTS[if\_expression](/stable/api/ycql/grammar_diagrams#if-expression)ORNOTEXISTSRETURNS STATUS AS ROW

### transaction\_block

```
transaction_block ::= BEGIN TRANSACTION  
                      { { insert | update | delete } ; } [ ... ]  END 
                      TRANSACTION ;
```

BEGINTRANSACTION[insert](/stable/api/ycql/grammar_diagrams#insert)[update](/stable/api/ycql/grammar_diagrams#update)[delete](/stable/api/ycql/grammar_diagrams#delete);ENDTRANSACTION;

### truncate

```
truncate ::= TRUNCATE [ TABLE ] table_name
```

TRUNCATETABLE[table\_name](/stable/api/ycql/grammar_diagrams#table-name)

### assignment

```
assignment ::= column_name = expression
```

[column\_name](/stable/api/ycql/grammar_diagrams#column-name)=[expression](/stable/api/ycql/grammar_diagrams#expression)

### ttl\_expression

```
ttl_expression ::= '<Integer Literal>'
```

&lt;Integer Literal&gt;

### timestamp\_expression

```
timestamp_expression ::= '<Integer Literal>'
```

&lt;Integer Literal&gt;

### limit\_expression

```
limit_expression ::= '<Integer Literal>'
```

&lt;Integer Literal&gt;

### offset\_expression

```
offset_expression ::= '<Integer Literal>'
```

&lt;Integer Literal&gt;

### keyspace\_name

```
keyspace_name ::= '<Text Literal>'
```

&lt;Text Literal&gt;

### property\_name

```
property_name ::= '<Text Literal>'
```

&lt;Text Literal&gt;

### property\_literal

```
property_literal ::= '<Text Literal>'
```

&lt;Text Literal&gt;

### table\_name

```
table_name ::= [ keyspace_name . ] '<Text Literal>'
```

[keyspace\_name](/stable/api/ycql/grammar_diagrams#keyspace-name).&lt;Text Literal&gt;

### index\_name

```
index_name ::= '<Text Literal>'
```

&lt;Text Literal&gt;

### column\_name

```
column_name ::= '<Text Literal>'
```

&lt;Text Literal&gt;

### type\_name

```
type_name ::= [ keyspace_name . ] '<Text Literal>'
```

[keyspace\_name](/stable/api/ycql/grammar_diagrams#keyspace-name).&lt;Text Literal&gt;

### field\_name

```
field_name ::= '<Text Literal>'
```

&lt;Text Literal&gt;

### alter\_role

```
alter_role ::= ALTER ROLE role_name WITH role_property [ AND ... ]
```

ALTERROLE[role\_name](/stable/api/ycql/grammar_diagrams#role-name)WITHAND[role\_property](/stable/api/ycql/grammar_diagrams#role-property)

### create\_role

```
create_role ::= CREATE ROLE [ IF NOT EXISTS ] role_name 
                [ WITH role_property [ AND ... ] ]
```

CREATEROLEIFNOTEXISTS[role\_name](/stable/api/ycql/grammar_diagrams#role-name)WITHAND[role\_property](/stable/api/ycql/grammar_diagrams#role-property)

### role\_property

```
role_property ::= PASSWORD = '<Text Literal>'
                  | LOGIN = '<Boolean Literal>'
                  | SUPERUSER = '<Boolean Literal>'
```

PASSWORD=&lt;Text Literal&gt;LOGIN=&lt;Boolean Literal&gt;SUPERUSER=&lt;Boolean Literal&gt;

### drop\_role

```
drop_role ::= DROP ROLE [ IF EXISTS ] role_name
```

DROPROLEIFEXISTS[role\_name](/stable/api/ycql/grammar_diagrams#role-name)

### grant\_role

```
grant_role ::= GRANT role_name TO role_name
```

GRANT[role\_name](/stable/api/ycql/grammar_diagrams#role-name)TO[role\_name](/stable/api/ycql/grammar_diagrams#role-name)

### revoke\_role

```
revoke_role ::= REVOKE role_name FROM role_name
```

REVOKE[role\_name](/stable/api/ycql/grammar_diagrams#role-name)FROM[role\_name](/stable/api/ycql/grammar_diagrams#role-name)

### grant\_permission

```
grant_permission ::= GRANT { all_permissions | permission } ON 
                     resource TO role_name
```

GRANT[all\_permissions](/stable/api/ycql/grammar_diagrams#all-permissions)[permission](/stable/api/ycql/grammar_diagrams#permission)ON[resource](/stable/api/ycql/grammar_diagrams#resource)TO[role\_name](/stable/api/ycql/grammar_diagrams#role-name)

### revoke\_permission

```
revoke_permission ::= REVOKE { all_permissions | permission } ON 
                      resource FROM role_name
```

REVOKE[all\_permissions](/stable/api/ycql/grammar_diagrams#all-permissions)[permission](/stable/api/ycql/grammar_diagrams#permission)ON[resource](/stable/api/ycql/grammar_diagrams#resource)FROM[role\_name](/stable/api/ycql/grammar_diagrams#role-name)

### all\_permissions

```
all_permissions ::= ALL [ PERMISSIONS ]
```

ALLPERMISSIONS

### role\_name

```
role_name ::= '<Text Literal>'
```

&lt;Text Literal&gt;

### permission

```
permission ::= { CREATE
                 | ALTER
                 | DROP
                 | SELECT
                 | MODIFY
                 | AUTHORIZE
                 | DESCRIBE
                 | EXECUTE } [ PERMISSION ]
```

CREATEALTERDROPSELECTMODIFYAUTHORIZEDESCRIBEEXECUTEPERMISSION

### resource

```
resource ::= ALL { KEYSPACES | ROLES }
             | KEYSPACE keyspace_name
             | [ TABLE ] table_name
             | ROLE role_name
```

ALLKEYSPACESROLESKEYSPACE[keyspace\_name](/stable/api/ycql/grammar_diagrams#keyspace-name)TABLE[table\_name](/stable/api/ycql/grammar_diagrams#table-name)ROLE[role\_name](/stable/api/ycql/grammar_diagrams#role-name)

### alter\_keyspace

```
alter_keyspace ::= ALTER { KEYSPACE | SCHEMA } keyspae_name 
                   keyspace_properties
```

ALTERKEYSPACESCHEMA[keyspae\_name](/stable/api/ycql/grammar_diagrams#keyspae-name)[keyspace\_properties](/stable/api/ycql/grammar_diagrams#keyspace-properties)

### explain

```
explain ::= EXPLAIN { select | update | insert | delete }
```

EXPLAIN[select](/stable/api/ycql/grammar_diagrams#select)[update](/stable/api/ycql/grammar_diagrams#update)[insert](/stable/api/ycql/grammar_diagrams#insert)[delete](/stable/api/ycql/grammar_diagrams#delete)
