SQL Language Syntax Summary
The syntax for the SQL statements that are implemented in RaimaDB SQL is given below. Note that those items in red have not yet been implemented. Refer to "A Language for Describing a Language" for a description of how to read the syntax specification. C-style comments are explanatory and not part of the syntax.
SQL Syntax
RDM_SQL:
ddl_stmts | dml_stmtddl_stmts:
[create_schema]
| {RDM_DDL_stmt}...
| [persist_database]
| [commit_stmt]create_schema:
CREATE {SCHEMA | DATABASE} {database_name | db-uri}persist_db_stmt:
PERSIST DATABASE {database_name | db-uri}dml_stmt:
db_stmt | select_stmt | mod_stmt | trans_stmt | upd_stats_stmt | set_stmt
| create_procedure | create_function | drop_routine
| declare_simple_var
| asgt_stmtdb_stmt:
open_db_stmt | close_db_stmt | init_db_stmtmod_stmt:
insert_stmt | update_stmt | delete_stmt | import_stmt | export_stmttrans_stmt:
start_stmt
| savepoint_stmt
| release_stmt
| commit_stmt
| precommit_stmt
| rollback_stmtopen_db_stmt:
{OPEN DATABASE | USE} {database_name | db-uri} [open_mode]
| {OPEN DATABASE | USE} database_name AS UNION OF db-uri[, db-uri]...
open_mode:
open_mode_spec
| IN open_mode_spec [MODE]open_mode_spec:
SHARE | EXCLUSIVE | READ ONLYclose_db_stmt:
CLOSE DATABASE database_nameinit_db_stmt:
INITIALIZE [DATABASE] database_nameselect_stmt:
SELECT [FIRST | ALL | DISTINCT] select_item [, select_item]...
FROM table_ref [, table_ref]...
[WHERE conditional_expr]
[grouping | sorting | grouping sorting]
[LIMIT (num {ROWS | MINS | SECS | MSECS})]
[FOR UPDATE [OF column_name [, column_name]...]]grouping:
GROUP BY sort_col[, sort_col]... [HAVING conditional_expr]sorting:
ORDER BY sort_col [ASC | DESC][, sort_col [ASC | DESC]]...sort_col:
num | column_varselect_item:
named_expr
| [table_name.]*named_expr:
[HIDE] {column_var | value_expr} [[AS] alias_name]table_ref:
table_spec | table_jointable_spec:
[database_name.]table_name [[AS] correlation_name]
| (table_join)table_join:
natural_join | qualified_join | cross_joinnatural_join:
table_ref NATURAL [INNER | LEFT [OUTER]] JOIN table_specqualified_join:
table_ref [INNER | LEFT [OUTER]] JOIN table_spec
[USING (column_name [, column_name]...) | ON conditional_expr]cross_join:
table_ref CROSS JOIN table_specvalue_expr:
arith_expr | dt_expr | string_exprarith_expr: /* involving only numeric operands and operations */
operand [{+ | - | * | /} operand]…dt_expr: /* involving only date/time/timestamp operands and operations */
operand [{+ | -} operand]…string_expr: /* involving only string operands and operations */
operand [ || operand]…operand:
constant
| param_ref
| variable_ref
| function_ref
| sub_query
| ( value_expr )param_ref:
? | : param_namevariable_ref:
global_var | routine_var | column_varglobal_var:
[@] var_name
routine_var:
[routine_name. | block_name.]var_namecolumn_var:
[{table_name | correlation_name}.]column_namefunction_ref:
aggregate_fcn | scalar_fcnaggregate_fcn:
calc_fcn_name ( [DISTINCT] arith_expr )
| COUNT{* | column_var })
| {EVERY | ANY | SOME} ( conditional_expr )
| {MIN | MAX | INVAR} (value_expr)
| agg_udf_name( [DISTINCT] value_expr)
calc_fcn_name:
SUM | AVG | VAR_SAMP | VAR_POP | STDDEV_SAMP | STDDEV_POPscalar_fcn:
IF (conditional_expr, value_expr1, value_expr2)
| numeric_function | datetime_function | string_function | misc_function
| scalar_udf_name (value_expr1[, value_expr2]...)numeric_function:
abs(arith_expr)
| acos(arith_expr)
| asin(arith_expr)
| atan(arith_expr)
| atan2(arith_expr1, arith_expr2)
| {ceil | ceiling}(arith_expr)
| cos(arith_expr)
| cot(arith_expr)
| degrees(arith_expr)
| exp(arith_expr)
| floor(arith_expr)
| {ln | log}(arith_expr)
| mod(arith_expr1, arith_expr2)
| pi()
| power(arith_expr1, arith_expr2)
| rand(num)
| round(arith_expr)
| sign(arith_expr)
| sin(arith_expr)
| sqrt(arith_expr)
| tan(arith_expr)datetime_function:
age(dt_expr)
| {curdate | current_date}()
| {curtime | current_time}()
| {curts | current_timestamp}()
| dayofmonth(dt_expr)
| dayofweek(dt_expr)
| dayofyear(dt_expr)
| hour(dt_expr)
| minute(dt_expr)
| month(dt_expr)
| quarter(dt_expr)
| second(dt_expr)
| trunctime (dt_expr, tt_spec)
| week(dt_expr)
| year(dt_expr)string_function:
ASCII(string_expr)
| CHAR(num)
| {CHAR_LENGTH | CHARACTER_LENGTH}(string_expr)
| CONCAT(left_string_expr, right_string_expr)
| CONVERT(value_expr, {convert_type | { , width_num, convert_format})
| insstr(target_string_expr, offset_num, count_num, replacement_string_expr)
| lcase(string_expr)
| left(string_expr, count_num)
| length(string_expr)
| locate(match_string_expr, search_string_expr, startpos_num)
| ltrim(string_expr)
| octet_length(string_expr)
| position(match_string_expr, search_string_expr)
| repeat(string_expr, count_num)
| replace(string_expr, string_expr, string_expr)
| right(string_expr, count_num)
| rtrim(string_expr)
| substring(string_expr, startpos_num, length_num)
| trim(num, string_expr, string_expr)
| ucase(string_expr)
| unicode(string_expr)misc_function:
DATABASE()
| COALESCE(value_expr1, value_expr2, value_exprN)
| ROWNUMBER()
| IFNULL(value_expr1, value_expr2)
| TYPEOF(value_expr)
tt_spec:
"1S" | "5S" | "10S" | "15S" | "20S" | "30S" | "1M" | "5M"
| "10M" | "15M" | "20M" | "30M" | "1H" | "3H" | "4H"
| "6H" | "8H" | "12H"
convert_type:
CHAR | TINYINT | SMALLINT | INTEGER | BIGINT | REAL | DATE | TIME | TIMESTAMPconvert_format:
numeric_format | datetime_format
numeric_format:
"[<< | >> | ><]['text' | $][- | (][#,]#[.#[#]...][e | E]['text' | $ | %]"
datetime_format:
"[<< | >> | ><]['text' | spchar | date_code | time_code]..."
date_code:
m | mm | mmm | mon | mmmm | month
| d | dd | ddd | dddd | day
| yy | yyyy
time_code:
h | hh | m | mm | s | ss | .f[f]... | [a/p | am/pm | A/P | AM/PM]
conditional_expr:
relational_expr [{ AND | OR} relational_expr]...relational_expr:
value_expr [NOT] rel_oper value_expr
| value_expr [NOT] BETWEEN constant AND constant
| value_expr [NOT] IN (constant [, constant]...)
| column_ref IS [[NOT]]
| string_expr [NOT] NULL LIKE "string"
| [NOT] relational_expr
| ( conditional_expr )
| value_expr [NOT] rel_oper [{ANY | SOME} | ALL] sub_query
| value_expr [NOT]IN sub_query
| [NOT] EXISTS sub_queryrel_oper:
= | == /* equal */
| < /* less than */
| > /* greater than */
| <= /* less than or equal */
| >= /* greater than or equal */
| <> | != | /= /* not equal */sub_query:
( sub_select )sub_select:
SELECT {* | named_expr} FROM table_ref [, table_ref]...
[WHERE conditional_expr] [grouping]
insert_stmt:
INSERT INTO [database_name.]table_name [( column_name [, column_name]... )] data_sourcedata_source:
VALUES insert_value_list
| [FROM] select_stmtinsert_value_list:
[value_expr] [, [value_expr]]...
| ( [value_expr] [, [value_expr]]... )update_stmt:
UPDATE [database_name.]table_name [[AS] correlation_name]
SET column_name = value_expr [, column_name = value_expr]...
[WHERE {conditional_expr | CURRENT OF cursor_name}]delete_stmt:
DELETE [database_name.]table_name [[AS] correlation_name]
[WHERE {conditional_expr | CURRENT OF cursor_name}]start_stmt:
START TRANSACTION [transid_name] [transact_item [, transact_item]...]transact_item:
{READ {ONLY | WRITE} | UPDATE} [ON table_list]
| isolation level iso_leveltable_list:
database_name.]table_name [, [database_name.]table_name]...iso_level:
READ UNCOMMITTED
| READ COMMITED
| REPEATABLE READ
| SERIALIZABLE
savepoint_stmt:
SAVEPOINT savepoint_idrelease_stmt:
RELEASE SAVEPOINT savepoint_idrollback_stmt:
ROLLBACK [WORK] [[TO SAVEPOINT] savepoint_id]precommit_stmt:
PRECOMMIT [WORK]commit_stmt:
COMMIT [WORK]set_stmt:
set_global
| set_transaction
| set_default_open_mode
| set_storage_media
| set_option
| set_stats
set_global:
SET @var_name = value_expr
| SET (@var_name [, @var_name]... ) = ( value_expr [, value_expr]... )
set_transaction:
SET TRANSACTION READ {ONLY | WRITE} [ISOLATION LEVEL iso_level]
| SET TRANSACTION AUTOCOMMIT [TO | =] {ON | OFF}
set_default_open_mode:
SET [DEFAULT] OPEN MODE [TO | =] open_mode_specset_storage_media:
SET STORAGE [TO | =]
{ONDISK | INMEMORY_VOLATILE | INMEMORY_KEEP | INMEMORY_PERSIST}set_option:
SET DATE FORMAT [TO | =]
{"YYYY-MM-DD" | "MM-DD-YYYY" | "DD-MM-YYYY"
| "YYYY/MM/DD" | "MM/DD/YYYY" | "DD/MM/YYYY"}
| SET TIME FORMAT [TO | =] "HH[:MM[:SS[:F[F[F[F]]]]]]"
| SET WILD ALL [TO | =] {"%" | "*"}
| SET WILD ONE [TO | =] {"_" | "." | "?"}
| SET TIMEOUT [TO | =] integer
| SET {DISTINCT | GROUP BY | ORDER BY} CACHE SIZE [TO | =] integer
| SET SORT COST FACTOR [TO | =] decimal
| SET IGNORE IMPORT ERROR [TO | =] {ON | OFF}set_stats:
SET {STATISTICS | STATS}
[ HISTOSIZE [=] num ]
[ SAMPLING [=] (pct_num, minrows_num, maxrows_num) ]
[ AUTORUN [=] (pct_num, minrows_num) ]
[ THREADS [=] num]
create_procedure:
CREATE PROCEDURE [database_name.]proc_name [(proc_arg_decl[, proc_arg_decl]...)]
[LANGUAGE SQL]
[[NOT] DETERMINISTIC]
[CONTAINS SQL | {MODIFIES | READS} SQL DATA]
sqlproc_stmtproc_arg_decl:
[IN | OUT | INOUT] arg_name var_type
var_type:
non_numeric_vartype | numeric_vartype
non_numeric_vartype:
{CHAR | VARCHAR} [(length_num)]
| {BINARY | VARBINARY} (length_num)
| DATE | TIME | TIMESTAMP
| UUID
| ROWID
numeric_vartype:
REAL | FLOAT | DOUBLE
| BOOLEAN | TINYINT | SMALLINT | INTEGER | BIGINT
| DECIMAL [(precision_num [, scale_num)]create_function:
CREATE FUNCTION [database_name.]func_name ( [fcn_arg_decl [, fcn_arg_decl]...] )
RETURNS var_type
[LANGUAGE SQL]
[[NOT] DETERMINISTIC]
[CONTAINS SQL | {MODIFIES | READS} SQL DATA]
sqlproc_stmtfcn_arg_decl:
arg_name var_type
var_type:
non_numeric_vartype | numeric_vartype
non_numeric_vartype:
{CHAR | VARCHAR} [(length_num)]
| {BINARY | VARBINARY} (length_num)
| DATE | TIME | TIMESTAMP
| UUID
| ROWID
numeric_vartype:
REAL | FLOAT | DOUBLE
| BOOLEAN | TINYINT | SMALLINT | INTEGER | BIGINT
| DECIMAL [(precision_num [, scale_num)]create_function:
CREATE FUNCTION [database_name.]func_name ( [fcn_arg_decl [, fcn_arg_decl]...] )
RETURNS var_type
[LANGUAGE SQL]
[[NOT] DETERMINISTIC]
[CONTAINS SQL | {MODIFIES | READS} SQL DATA]
sqlproc_stmtfcn_arg_decl:
arg_name var_typedrop_routine:
drop_proc | drop_funcdrop_proc:
DROP PROCEDURE proc_namedrop_func:
DROP FUNCTION func_namecompound_stmt:
[ label_name:] BEGIN [[[NOT]] ATOMIC | TRANSACTION]
declarations
statement_list
END [ label_name]
declarations:
[{declare_variable | declare_conditions} ;]...
| [declare_cursor ;]...
| [declare_handler ;]...declare_variable:
DECLARE var_name[, var_name]... var_type [DEFAULT constant]declare_condition:
DECLARE cond_name CONDITION [FOR SQLSTATE [VALUE] "string"]
| DECLARE cond_name CONDITION [FOR SQLCODE [VALUE] code_name]declare_cursor:
DECLARE cursor_name CURSOR [{WITH | WITHOUT} RETURN] FOR select_stmtdeclare_handler:
DECLARE {CONTINUE | EXIT | UNDO} HANDLER FOR condition_value_list sqlproc_stmt
condition_value_list:
condition_value[, condition_value]...
condition_value:
specific_condition | SQLEXCEPTION | SQLWARNING | NOT FOUND
specific_condition:
cond_name
| FOR SQLSTATE [VALUE] "string"
| FOR SQLCODE [VALUE] {code_name | code_num}statement_list:
sqlproc_stmt ; [sqlproc_stmt ;]...sqlproc_stmt:
compound_stmt
| select_stmt
| update_stmt
| delete_stmt
| insert_stmt
| trans_stmt
| call_stmt
| asgt_stmt
| prepare_stmt
| execute_stmt
| deallocate_stmt
| open_stmt
| fetch_stmt
| getdiags_stmt
| control_stmtcall_stmt:
CALL [database_name.]proc_name [(proc_arg[, proc_arg]...)]proc_arg:
value_expr | var_nameasgt_stmt:
SET var_ref = value_expr
| SET ( var_ref [, var_ref]... ) = ( value_expr [, value_expr]... )
var_ref:
[@]var_name
control_stmt:
if_stmt
| case_stmt
| loop_stmt
| while_stmt
| repeat_stmt
| for_stmt
| iterate_stmt
| leave_stmt
| signal_stmt
| resignal_stmt
| return_stmt
if_stmt:
IF conditional_expr THEN statement_list
[ELSEIF conditional_expr THEN statement_list]...
[ELSE statement_list]
END IF
case_stmt:
CASE value_expr
{WHEN = value_expr THEN statement_list}...
[ELSE {OKAY | statement_list}]
END CASE
| CASE
{WHEN conditional_expr THEN statement_list}...
[ELSE {OKAY | statement_list}]
END CASE
loop_stmt:
[ label_name:] LOOP statement_list END LOOP [ label_name]
while_stmt:
[ label_name:] WHILE conditional_expr
statement_list
END WHILE [ label_name]
repeat_stmt:
[ label_name:] REPEAT
statement_list
UNTIL conditional_expr END REPEAT [ label_name]
for_stmt:
[ label_name:] FOR [for_loop_var_name AS] [cursor_name CURSOR FOR]
select_stmt
DO
statement_list
END FOR [ label_name]
iterate_stmt:
ITERATE label_name
leave_stmt:
LEAVE label_name
getdiags_stmt:
GET [CURRENT | STACKED] DIAGNOSTICS stmt_info[, stmt_info]...
| GET [CURRENT | STACKED] DIAGNOSTICS {EXCEPTION | CONDITION} cond_info[, cond_info}...
stmt_info:
var_name = stmt_item
stmt_item:
COMMAND_FUNCTION | COMMAND_FUNCTION_CODE
| DYNAMIC_FUNCTION | DYNAMIC_FUNCTION_CODE
| MORE | NUMBER | ROW_COUNT | TRANSACTION_ACTIVE
cond_info:
var_name = cond_item
cond_item:
RETURNED_SQLSTATE | RETURNED_SQLCODE | MESSAGE_LENGTH | MESSAGE_TEXT
| SQLCODE_NAME | CONDITION_IDENTIFIER | CONDITION_NUMBER
| CURSOR_NAME | ROUTINE_NAME | SOURCE_FILE
| STATEMENT_NUMBER | LINE_NUMBER | COLUMN_NUMBER
signal_stmt:
SIGNAL specific_condition [SET MESSAGE_TEXT = "string"]
resignal_stmt:
RESIGNAL specific_condition [SET MESSAGE_TEXT = "string"]
return_stmt:
RETURN {value_expr | NULL}
prepare_stmt:
PREPARE stmt_name FROM {var_name | string_expr}
execute_stmt:
EXECUTE stmt_name [INTO var_name[, var_name]...]
deallocate_stmt:
DEALLOCATE PREPARE stmt_nameopen_stmt:
OPEN cursor_namefetch_stmt:
FETCH [NEXT] [FROM] cursor_name INTO var_name[, var_name]...close_stmt:
CLOSE cursor_name