本章对 GBase 8a MPP Cluster 的 SQL 语句的下列元素进行讨论:
(1)数值,例如字符串和数字;
(2) 数据库、表、列和别名;
(3)标识符限定时间,比如表和列名字;
(4)注释语法;
(5)用户变量。
数值
这部分主要介绍在 GBase 8a MPP Cluster 中使用的数值(https://mp.csdn.net/mp_blog/creation/editor/122479297)。包括字符串,数字,十六进制值,布尔值和 NULL 值。
字符串
字符串是多个字符组成的一个字符序列,由单引号‚'‛或双引号‚"‛字符包围。
例如: 'a string'
在一个字符串中,确定的序列具有特殊的含义,每个序列以反斜线符号‚\‛开头,称为转义字符。 GBase 8a MPP Cluster 识别下列转义字符:
转义字符 | 描 述 |
\0 | ASCII 0 (NUL)字符。 |
\' | ASCII 39 单引号‚'‛字符。 |
\" | ASCII 34 双引号‚"‛字符。 |
\b | ASCII 8 退格符。 |
\n | ASCII 10 换行符。 |
\r | ASCII 13 回车符。 |
\t | ASCII 9 制表符(TAB)。 |
\\ | ASCII 92 反斜线‚\‛字符。 |
这些符号是大小写敏感的。例如:‚\b‛被解释为一个退格,但是‚\B‛被解释为‚B‛。
在其它的所有转义字符中,忽略反斜线符号。换句话说,反斜线用来解释转义字符而不是被转义。
当字符串中包含引号时:
字符串用单引号‚'‛来引用的,该字符串中的单引号‚'‛字符可以用‚''‛方式转义。
用户也可以继续使用在引号前加一个转义字符‚\‛的方式进行转义。
字符串是用单引号‚'‛来引用的,该字符串中的双引号‚"‛不需要特殊对待而且不必被重复或转义。
下面的示例说明了 SELECT 语句对引号和转义是如何工作的。
示例 1:使用单引号‚'‛,双引号‚"‛,转义字符‚\‛包围字符串。
gbase> SELECT 'hello', '"hello"', '""hello""', 'hel''lo', '\'hello';
+-------+---------+-----------+--------+--------+
| hello | "hello" | ""hello"" | hel'lo | 'hello |
+-------+---------+-----------+--------+--------+
| hello | "hello" | ""hello"" | hel'lo | 'hello |
+-------+---------+-----------+--------+--------+
1 row in set
示例 2:字符串中存在转义字符‚\‛。
gbase> SELECT 'This\nIs\nFour\nLines';
+--------------------+
| This
Is
Four
Lines |
+--------------------+
| This
Is
Four
Lines |
+--------------------+
1 row in set
示例 3:不存在转义含义时,忽略反斜线符号。
gbase> SELECT 'disappearing\ backslash';
+------------------------+
| disappearing backslash |
+------------------------+
| disappearing backslash |
+------------------------+
1 row in set
如果用户想要把二进制数据插入到 BLOB 字段中,下列字符必须由转义序列表示:
字 符 | 描 述 |
NUL | NUL byte (ASCII 0)。需要用‚\0‛(一个反斜线和一个ASCII ‚0‛字符)表示。 |
\ | 反斜线(ASCII 92)。需要用‚\\‛表示。 |
' | 单引号(ASCII 39)。需要用‚\'‛表示。 |
" | 双引号(ASCII 34)。需要用‚\"‛表示。 |
示例 4:创建的表中 productBlob 字段的类型为 BLOB,插入的数据中存在转义字符。
gbase> DROP TABLE IF EXISTS products;
Query OK, 0 rows affected
gbase> CREATE TABLE products (productBlob BLOB);
Query OK, 0 rows affected
gbase> INSERT INTO products values('abdcdrf\\ghi\'jklm\"nopqrs\0tuvwxyz');
Query OK, 1 row affected
gbase> SELECT productBlob FROM products;
+---------------------------------+
| productBlob |
+---------------------------------+
| abdcdrf\ghi'jklm"nopqrs tuvwxyz |
+---------------------------------+
1 row in set
当编写程序时,任何一个字符串都有可能包含这些特殊的字符,因此在这些字符作为 SQL 语句中的数据传到 GBase 8a MPP Cluster 之前必须进行适当的转义。
数字
整数被表示为一个数字序列。浮点数使用‚.‛作为一个十进制数的分隔符。这两种数字类型可以前置‚-‛以表示一个负值。
有效整数的示例:
1221、 0、 -32
示例 1: 0xa 等价于整数 10。
gbase> SELECT -32;
+-----+
| -32 |
+-----+
| -32 |
+-----+
1 row in set
有效浮点数的示例:
-32032.6809E+10、 148.00E+13
十六进制值
GBase 8a MPP Cluster 支持十六进制数值。
在数字的上下文语境中,它们作为数值等价于整数使用。
在字符串的上下文语境中,它们作为一个字符串,每一组十六进制数字被解释为对应 ASCII 码的字符。
示例 1: 0xa 等价于整数 10。
gbase> SELECT 0xa+1;
+-------+
| 0xa+1 |
+-------+
| 11 |
+-------+
1 row in set
示例 2:将‚4742617365‛转换成对应的 ASCII 码。
gbase> SELECT x'4742617365';
+---------------+
| x'4742617365' |
+---------------+
| GBase |
+---------------+
1 row in set
示例 3:将‚5061756c‛转换成对应的 ASCII 码。
gbase> SELECT 0x5061756c;
+------------+
| 0x5061756c |
+------------+
| Paul |
+------------+
1 row in set
表达式‚x'hexstring'‛是基于标准 SQL 的,表达式 0x 是基于 ODBC 的。二者是等价的。
示例 4:使用 HEX()函数可以将一个字符串或数值转换为一个十六进制格
式的字符串。
gbase> SELECT HEX('cat');
+------------+
| HEX('cat') |
+------------+
| 636174 |
+------------+
1 row in set
gbase> SELECT 0x636174;
+----------+
| 0x636174 |
+----------+
| cat |
+----------+
1 row in set
布尔值
常量 TURE 相当于 1,而常量 FALSE 相当于 0。
常量的 TRUE 和 FALSE 对大小写不敏感。
示例 1:查询 TRUE 和 FALSE 对应的值。
gbase> SELECT TRUE, true, FALSE, false;
+------+------+-------+-------+
| TRUE | TRUE | FALSE | FALSE |
+------+------+-------+-------+
| 1 | 1 | 0 | 0 |
+------+------+-------+-------+
1 row in set
NULL值
NULL 不区分大小写。
注意: NULL 值不同于数值类型的 0 或字符串类型的空串。
数据库、表、列和别名
数据库、表、列和别名等都是标识符,这部分描述 GBase 8a MPP Cluster中标识符允许的语法规则。
下面的表描述了对于每一个类型标识符允许的最大长度和可使用的字符
标识符 | 最大长度(字符) | 允许的字符 |
数据库 | 64 | a~z、 A~Z、 0~9、 下划线,必须以字母或下划 线开头。 |
表 | 56 | a~z、 A~Z、 0~9、 下划线,必须以字母或下划 线开头。 |
视图 | 56 | a~z、 A~Z、 0~9、 下划线,必须以字母或下划 线开头。 |
列 | 64 | a~z、 A~Z、 0~9、 “-”、下划线,必须以字母或 下划线开头。 |
别名 | 255 | a~z、 A~Z、 0~9、 下划线,必须以字母或下划 线开头。 |
存储过程 | 64 | a~z、 A~Z、 0~9、 下划线,必须以字母或下划 线开头。 |
注:
1、除了表内注明的限制,标识符不可以包含 ASCII(0)或 ASCII(255)。数据库、表和列名不应以空格结尾;
2、如果标识符是一个限制词或包含特殊字符,当用户使用它时,必须总是用反单引号‚`‛ 引用它,比如: select * from `select` where id>100;;
3、如果标识符长度超过最大长度限制,数据库、表、列、视图、存储过程的命令将报错,而别名将会截断至 255 个字符进行显示。
GBase 8a MPP Cluster 数据库支持的保留字,请参见附录部分的 GBase 8aMPP Cluster 分析型数据库保留字。
实际应用系统中,标识符不得使用 GBase 8a MPP Cluster 的保留字,也不能包含特殊字符。
当库名、表名为中文时,最大支持的汉字个数如下:
1、 库名最大支持 51 个汉字;
2、 表名最大支持 21 个汉字。
标识符限定词
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。 |
`column_name` | 该字段是一个关键词或包含特殊字符。 |
组合名称如果需要引用则标识符的各部分都要各自引用,而不是把组合标识符作为一个整体来引用。例如: `gs-table`.`gs-column`合法,`gs-table.gs-column`不合法。
在一条语句的列引用中,不需要明确指定一个 table_name 或database_name.table_name 前缀,除非这个引用存在二义性。例如,假设表t1 和 t2 均包含一个字段 c,当用一个使用了 t1 和 t2 的 SELECT 检索 c 时,在这种情况下,字段 c 存在二义性,因为它在这个语句所使用的表中不是唯一的,因而必须通过写出 t1.c 或 t2.c 来指明用户所需的是哪个表。同样的,如果从数据库 db1 的表 t 和数据库 db2 的表 t 中检索,用户必须用db1.t.col_name 和 db2.t.col_name 来指定引用哪个库表的列。
注释语法
GBase 8a MPP Cluster 支持三种注释风格:
1) # 到该行结束;
2) -- 到该行结束。注意‚-- ‛(引导号)注释风格要求第二个引导号后至少跟着一个空格(或者一个控制字符例如换行)。这个语法和标准的 SQL注释风格有点不同;
3) /*行中间或多个行*/。这个封闭的序列不一定在同一行表示,因此该语法允许多行注释。
示例 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
用户变量
GBase 8a MPP Cluster 支持用户自定义变量。用户变量的生命周期是会话级的,对其它会话不可见。当用户退出会话时,此会话的所有用户变量会自动释放。
用户变量的写法是: @var_name。一个变量名可以由 a~z、 A~Z、 0~9、下划线组成,必须以字母或下划线开头。用户变量名大小写不敏感。
- 通过 SET 语法来定义并为变量赋值。
SET @var_name = expr [, @var_name = expr] ...‚=‛是赋值操作符。赋给每一个变量的 expr 值可以是整数、实数、字符串或 NULL。
- 通过 SELECT 语法查看用户变量的值。
SELECT @var_name [, @var_name] ...
示例:使用 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
用户变量可以用于表达式所允许的任何地方。注意,必须明确指定常量的上下文中不能使用变量,例如,在 SELECT 的 LIMIT 子句中。
如果用户使用的变量没有初始化,那么它的值就为 NULL。