今天给大家介绍下南大通用GBase 8a 的SQL规范,含标识符语法规则,注释规则、用户变量,以及保留字等。

1.1标识符语法规则

数据库、表、列和别名等对象的名称都称为标识符,这部分将描述GBase 8a MPP Cluster中标识符允许的语法规则。通过下表,给大家介绍下每一个类型标识符允许的最大长度和可使用的字符。

标识符

最大长度(字符)

允许的字符

数据库

英文48

中文48

a~z、A~Z、0~9、下划线,必须以字母或下划线开头,支持中文数据库。

英文56

中文21

a~z、A~Z、0~9、-、下划线、中文,必须以字母或下划线开头,支持中文表。

视图

英文56

中文50

a~z、A~Z、0~9、下划线,必须以字母或下划线开头,支持中文视图。

英文64

中文64

a~z、A~Z、0~9、下划线、中文,必须以字母或下划线开头,支持中文列。

别名

英文256

中文85

a~z、A~Z、0~9、下划线,必须以字母或下划线开头,支持中文别名。

存储过程

英文64

中文64

a~z、A~Z、0~9、下划线,必须以字母或下划线开头,支持中文存储过程。

用户变量

 

由a~z、A~Z、0~9、下划线组成,必须以字母或下划线开头。用户变量名大小写不敏感。

注意:

1、除了表内注明的限制,标识符不可以包含ASCII(0)或ASCII(255)。数据库、表和列名不应以空格结尾。

2、如果标识符是一个限制词或包含特殊字符,当用户使用它时,必须总是用``引用它,比如:SELECT * FROM `select`.id>100。

3、如果标识符长度超过最大长度限制,数据库、表、列、视图、存储过程的命令将报错,而别名将会截断至256个字符进行显示。

实际应用系统中,标识符不得使用GBase 8a MPP Cluster的保留字,也不能包含特殊字符。GBase 8a MPP Cluster数据库支持的保留字,请参见如下保留字章节的内容。

1.2 标识符限定词

GBase 8a MPP Cluster 允许名称由一个或多个标识符组成。组合名称的各个组成成分应该用英文句号字符“.”分隔开。组合名称的开始部分做为限定词来使用,它影响了上下文中后面的标识符的解释。在 GBase 8a MPP Cluster 中,用户可以使用下列表格中的任一种方式引用一个列:

列引用

含义

col_name

列col_name来自查询所用的任何一个表中对应字段。

table_name.col_name

列col_name来自当前数据库中的表table_name。

database_name.table_name.col_name

列col_name来自数据库database_name中的表table_name。

vc_name.database_name.table_name.col_name

列col_name来自虚拟集群vc_name的数据库database_name中的表table_name。

`column_name`

该字段是一个关键词或包含特殊字符。

组合标识符如果需要引用,则标识符的各部分都要各自引用,而不是把组合标识符作为一个整体来引用。例如:`gs-table`.`gs-column`合法, `gs-table.gs-column`不合法。

在一条语句的列引用中,不需要明确指定一个table_name、database_name.table_name或vc_name.database_name.table_name前缀,除非这个引用存在二义性。例如:

1)假设表t1和t2均包含一个字段c,当一个使用了t1和t2的SELECT检索c时,在这种情况下,字段c存在二义性,因为它在这个语句所使用的表不是唯一的,因而必须通过写出t1.c或t2.c来指明用户所需的是哪个表。

2)如果从数据库db1的表t和数据库db2的表t中检索,用户必须用db1.t.col_name和db2.t.col_name来指定引用哪个库表的列。

3)如果从vc1中数据库db1的表t和vc2中数据库db2的表t中检索,用户必须用vc1.db1.t.col_name和vc2.db2.t.col_name来指定引用哪个库表的列。

1.3注释语法

GBase 8a MPP Cluster支持三种注释风格:

“#”:单行注释;

“--”:单行注释,以“--”开头到该行结束为注释内容。注意“--”(引导号)注释要求第二个引导号后至少跟着一个空格;

“/*注释内容*/”:这种注释支持注释内容为一行或者连续的多行,还支持注释内容在行中间。/**/这个封闭的序列不一定在同一行表示,因此该语法允许多行注释。

注意: “--”(引导号)注释风格要求第二个引导号后至少跟着一个空格。这个语法和标准的SQL注释风格略有不同。

示例

示例1:使用“#”注释。

gbase> SELECT 1+1 FROM t;# This comment continues to the END of line
+-----+
| 1+1 |
+-----+
|   2 |
+-----+
1 row in set

示例2:使用“--”注释。

gbase> SELECT 1+1 FROM t;-- This comment continues to the END of line
+-----+
| 1+1 |
+-----+
|   2 |
+-----+
1 row in set

示例3:使用“/*单行*/”注释。

gbase> SELECT 1 /* this is an in-line comment */ + 1 FROM t;
+--------+
| 1  + 1 |
+--------+
|      2 |
+--------+
1 row in set

示例4:使用“/*多行*/”注释。

gbase> SELECT 1+
  /* 
   this is a
   multiple-line comment
  */
   1 FROM t;
+--------------+
| 1    +     1 |
+--------------+
|            2 |
+--------------+ 
1 row in set

1.4用户变量

GBase 8a MPP Cluster支持用户变量。用户变量的生命周期是会话级的,对其它会话不可见。当用户退出时,此用户的所有用户变量会自动释放。

用户变量的书写规则是:@var_name。

通过SET语法来定义并为变量赋值:

SET @var_name = expr [, @var_name = expr] …

“=”是赋值操作符。赋给每一个变量的expr值可以是实数、字符串或NULL。

通过SELECT语法查看用户变量的值:

SELECT @var_name [, @var_name] ... 

示例

示例1:使用SET语句为变量赋值。

gbase> SET @t1='abc',@t2=null,@t3=4;
Query OK, 0 rows affected
gbase> SELECT @t1,@t2,@t3;
+------+------+------+
| @t1  | @t2  | @t3  |
+------+------+------+
| abc  | NULL |    4 |
+------+------+------+
1 row in set

用户变量可以用于表达式所允许的任何地方。如果用户使用的变量没有初始化,那么它的值就为NULL。

注意:常量的上下文中不能使用变量,例如,在SELECT的LIMIT子句中。

1.5 保留字

如下表格列出了列出了GBase 8a MPP Cluster支持的SQL保留字,请大家参考。

ACCESSIBLE

ADD

ALL

ALTER

ANALYZE

AND

AS

ASC

ASENSITIVE

BEFORE

BETWEEN

BIGINT

BINARY

BIT_AND

BIT_OR

BIT_XOR

BLOB

BOTH

BY

 

 

CALL

CASCADE

CASE

CAST

CHANGE

CHAR

CHARACTER

CHECK

CLUSTER

COLLATE

COLUMN

COMPRESS

CONDITION

CONNECT

CONSTRAINT

CONTINUE

CONVERT

COUNT

CREATE

CROSS

CURDATE

CURDATETIME

CURRENT_DATE

CURRENT_DATETIME

CURRENT_TIME

CURRENT_TIMESTAMP

CURRENT_USER

CURSOR

CURTIME

 

DATABASE

DATABASES

DATE_ADD

DATE_SUB

DAY_HOUR

DAY_MICROSECOND

DAY_MINUTE

DAY_SECOND

DEC

DECIMAL

DECLARE

DEFAULT

DELAYED

DELETE

DENSE_RANK

DESC

DESCRIBE

DETERMINISTIC

DISTINCT

DISTINCTROW

DISTRIBUTE

DISTRIBUTED

DIV

DOUBLE

DROP

DUAL

 

EACH

ELSE

ELSEIF

ENCLOSED

ESCAPED

EXISTS

EXIT

EXPLAIN

EXTRACT

EXCEPT

 

 

FALSE

FETCH

FLOAT

FLOAT4

FLOAT8

FOR

FORCE

FOREIGN

FROM

FULL

FULLTEXT

 

GCEXPORT

GCIMPORT

GCLOCAL

GCLUSTER

GCLUSTER_LOCAL

GET

GRANT

GROUP

GROUPED

GROUP_CONCAT

HAVING

HIGH_PRIORITY

HOUR_MICROSECOND

HOUR_MINUTE

HOUR_SECOND

IF

IGNORE

IN

INDEX

INFILE

INITNODEDATAMAP

INNER

INOUT

INPATH

INSENSITIVE

INSERT

INT

INT1

INT2

INT3

INT4

INT8

INTEGER

INTERSECT

INTERVAL

INTO

IS

ITERATE

JOIN

KEY

KEYS

KILL

LAG

LEAD

LEADING

LEAVE

LEFT

LEVEL

LIKE

LIMIT

LIMIT_STORAGE_SIZE

LINEAR

LINES

LINK

LOAD

LOCALTIME

LOCALTIMESTAMP

LOCK

LONG

LONGBLOB

LONGTEXT

LOOP

LOW_PRIORITY

MASTER_SSL_VERIFY_SERVER_CERT

MATCH

MAX

MEDIUMBLOB

MEDIUMINT

MEDIUMTEXT

MERGE

MID

MIDDLEINT

MIN

MINUS

MINUTE_MICROSECOND

MINUTE_SECOND

MOD

MODIFIES

NATURAL

NOCOPIES

NOCYCLE

NOT

NOW

NO_WRITE_TO_BINLOG

NULL

NUMERIC

 

ON

OPTIMIZE

OPTION

OPTIONALLY

OR

ORDER

ORDERED

OUT

OUTER

OUTFILE

OVER

 

POSITION

PRECEDING

PRIMARY

PRIOR

PROCEDURE

PURGE

RANGE

RANK

READ

READS

READ_WRITE

REAL

REFERENCES

REFRESH

REFRESHNODEDATAMAP

REGEXP

RELEASE

RENAME

REPEAT

REPLACE

REQUIRE

RESTRICT

RETURN

REVERT

REVOKE

RIGHT

RLIKE

SCHEMA

SCHEMAS

SCN_NUMBER

SECOND_MICROSECOND

SEGMENT_ID

SELECT

SELF

 

 

SENSITIVE

SEPARATOR

SET

SHOW

SMALLINT

SORT

SPATIAL

SPECIFIC

SQL

SQLEXCEPTION

SQLSTATE

SQLWARNING

SQL_BIG_RESULT

SQL_CALC_FOUND_ROWS

SQL_SMALL_RESULT

SSL

START

STARTING

STD

STDDEV

STDDEV_POP

STDDEV_SAMP

STRAIGHT_JOIN

 

TABLE

TARGET

TERMINATED

THEN

TINYBLOB

TINYINT

TINYTEXT

TO

TRAILING

TRIGGER

TRIM

TRUE

UNDO

UNION

UNIQUE

UNLOCK

UNSIGNED

UPDATE

USAGE

USE

USING

UTC_DATE

UTC_DATETIME

UTC_TIME

UTC_TIMESTAMP

 

 

VALUES

VARBINARY

VARCHAR

VARCHARACTER

VARYING

VAR_SAMP

WHEN

WHERE

WHILE

WITH

WRITE

 

XOR

 

 

YEAR_MONTH

 

 

ZEROFILL

 

 

以上就是今天的内容,感谢大家~