gbase8a学习总结.docx
《gbase8a学习总结.docx》由会员分享,可在线阅读,更多相关《gbase8a学习总结.docx(41页珍藏版)》请在冰豆网上搜索。
![gbase8a学习总结.docx](https://file1.bdocx.com/fileroot1/2023-8/5/059c10c0-8e4c-4681-963f-e3417d5c9eb0/059c10c0-8e4c-4681-963f-e3417d5c9eb01.gif)
gbase8a学习总结
技术产品规范/项目名称
设计方案
朗新云商项目开发部
2017年10月
修改履历
版本号
修改编号
更改简要描述
更改人
批准人
1GBase数据类型及SQL语句
1.1GBase8a数据类型
GBase8aMPPCluster支持SQL92中定义的绝大多数数据类型,同时也支持SQL99和SQL2000中定义的数据类型。
GBase8aMPPCluster支持的数据类型,如下表所示:
GBase8aMPPCluster的数据类型
数值型
TINYINT
INT
BIGINT
FLOAT
DOUBLE
DECIMAL
字符型
CHAR
VARCHAR
TEXT
二进制类型
BLOB
日期和时间型
DATE
DATETIME
TIME
TIMESTAMP
1.1.1数值类型
GBase8aMPPCluster支持的数值类型,如下表所示:
类型名称
最小值
最大值
占用字节
TINYINT
-127
127
1
SMALLINT
-32767
32767
2
INT(INTEGER)
-47
47
4
BIGINT
-806
806
8
FLOAT
+38
+38
4
DOUBLE
+308
+308
8
DECIMAL[(M[,D])]
-(1E+M-1)/(1E+D)
(1E+M-1)/(1E+D)
动态计算
1.1.2字符类型
GBase8aMPPCluster目前支持三种字符类型,如下表所示:
类型名称
最大长度(字符)
备注
CHAR
255
不足指定长度,右边空格补充
VARCHAR
10922
不足指定长度,不会补充
TEXT
10922
不能为它指定DEFAULT值
1.1.3二进制数据类型
GBase8aMPPCluster目前支持以下二进制数据类型,如下表所示:
类型名称
最大长度(字节)
BLOB
32767
使用BLOB数据类型,有如下约束:
BLOB列支持32KB的存储容量。
创建表时,BLOB列不可以有DEFAULT值。
查询语句中,BLOB列不支持过滤条件。
查询语句中,BLOB列不支持OLAP函数。
1.1.4日期和时间类型
类型名称
最小值
最大值
格式
DATE
0001-01-01
9999-12-31
YYYY-MM-dd
DATETIME
0001-01-01
00:
00:
9999-12-31
23:
59:
59
YYYY-MM-dd
HH:
MI:
TIME
-838:
59:
59
838:
59:
59
HHH:
MI:
SS
TIMESTAMP
1970-01-01
08:
00:
01
2038-01-01
00:
59:
59
YYYY-MM-DD
HH:
MI:
SS
TIMESTAMP使用限制:
以下限制说明,是针对TIMESTAMP数据列自动更新时的场景:
1.在一张表中,只能自动更新表中第一个出现的TIMESTAMP列,并且必
须使用DEFAULTCURRENT_TIMESTAMPONUPDATECURRENT_TIMESTAMP
来定义。
2.在一张表中,使用DEFAULTCURRENT_TIMESTAMPONUPDATE
CURRENT_TIMESTAMP来指定TIMESTAMP列自动更新时,只能使用一次,
且用于第一个TIMESTAMP列。
3.从不同节点发起的SQL语句,TIMESTAMP列更新的时间为发起节点的
本地时间;如果从不同的发起点发起SQL,而各个节点的本地时间又
不同步,则无法保证TIMESTAMP列更新值一致。
1.2SQL语言基础
本章对GBase8aMPPCluster的SQL语句的下列元素进行讨论:
数值,例如字符串和数字;
标识符,比如表和列名字;
用户和系统变量;
注释。
1.2.1数值
这部分主要介绍在GBase8aMPPCluster中使用的数值。
包括字符串,数字,十六进制值,布尔值和NULL。
1.2.1.1字符串
字符串是多个字符组成的一个字符序列,由单引号‚'‛或双引号‚"‛字符包围。
例如:
'astring'
在一个字符串中,确定的序列具有特殊的含义,每个序列以反斜线符号‚\‛开头,称为转义字符。
GBase8aMPPCluster识别下列转义字符:
转义字符
描述
\0
ASCII0(NUL)字符。
\’
ASCII39单引号‚'‛字符。
\”
ASCII34双引号‚"‛字符。
\b
ASCII8退格符。
\n
ASCII10换行符。
\r
ASCII13回车符。
\t
ASCII9制表符(TAB)。
\\
ASCII92反斜线‚\‛字符。
如果用户想要把二进制数据插入到BLOB字段中,下列字符必须由转义序列表示:
字符
描述
NUL
NULbyte(ASCII0)。
需要用‚\0‛(一个反斜线和一个ASCII‚0‛字符)表示。
\
反斜线(ASCII92)。
需要用‚\\‛表示。
’
单引号(ASCII39)。
需要用‚\'‛表示。
”
双引号(ASCII34)。
需要用‚\"‛表示。
1.2.1.2数字
整数被表示为一个数字序列。
浮点数使用‚.‛作为一个十进制数的分隔符。
这两个数字类型可以前置‚-‛以表示一个负值。
有效整数的示例:
1221、0、-32
有效浮点数的示例:
+10、+13
1.2.1.3十六进制值
GBase8aMPPCluster支持十六进制数值。
在数字的上下文语境中,它们作为等价于整数使用。
在字符串的上下文语境中,它们作为一个字符串,每一对十六进制数字被解释为对应ASCII码的字符。
十六进制转字符,表达式‚x'hexstring'‛是基于标准SQL的,表达式0x是基于ODBC的。
二者是等价的。
使用HEX()函数可以将一个字符串或数值转换为一个十六进制格式的字符串。
1.2.1.4布尔值
常量TURE相当于1,而常量FALSE相当于0。
常量的名字对大小写不敏感。
示例1:
查询TRUE和FALSE对应的值。
gbase>SELECTTRUE,true,FALSE,falseFROMt;
+------+------+-------+-------+
|TRUE|TRUE|FALSE|FALSE|
+------+------+-------+-------+
|1|1|0|0|
+------+------+-------+-------+
1rowinset
1.2.1.5NULL值
NULL不区分大小写。
注意:
NULL值不同于数字类型的0或字符串类型的空串。
1.2.2数据库、表、列和别名
数据库、表、列和别名等都是标识符,这部分描述GBase8aMPPCluster中标识符允许的语法规则。
下面的表描述了对于每一个类型标识符允许的最大长度和可使用的字符。
标识符
最大长度(字符)
允许的字符
数据库
52
a~z、A~Z、0~9、下划线,必须以字母或下划线开头。
表
52
a~z、A~Z、0~9、下划线,必须以字母或下划线开头。
视图
52
a~z、A~Z、0~9、下划线,必须以字母或下划线开头。
列
52
a~z、A~Z、0~9、下划线,必须以字母或下划线开头。
别名
52
a~z、A~Z、0~9、下划线,必须以字母或下划线开头。
存储过程
52
a~z、A~Z、0~9、下划线,必须以字母或下划线开头。
实际应用系统中,标识符不得使用GBase8aMPPCluster的保留字,也不能包含特殊字符。
1.2.3标识符限定词
GBase8aMPPCluster允许名称由一个或多个标识符组成。
组合名称的各个组成成分应该用英文句号字符‚.‛分割开。
组合名称的开始部分做为限定词来使用,它影响了上下文中后面的标识符的解释。
在GBase8aMPPCluster中,用户可以使用下列表格中的任一种方式引用一个列:
列引用
含义
col_name
列col_name来自查询所用的任何一个表中对应字段。
列col_name来自当前数据库中的表table_name。
列col_name来自数据库database_name中的表table_name。
`column_name`
该字段是一个关键词或包含特殊字符。
组合标识符如果需要引用则标识符的各部分都要各自引用,而不是把组合标识符作为一个整体来引用。
例如:
`gs-table`.`gs-column`合法,whereas``不合法。
在一条语句的列引用中,不需要明确指定一个table_name或前缀,除非这个引用存在二义性。
例如,假设表t1和t2均包含一个字段c,当用一个使用了t1和t2的SELECT检索c时,在这种情况下,字段c存在二义性,因为它在这个语句所使用的表中不是唯一的,因而必须通过写出或来指明用户所需的是哪个表。
同样的,如果从数据库db1的表t和数据库db2的表t中检索,用户必须用和来指定引用哪个库表的列。
1.2.4注释语法
GBase8aMPPCluster支持三种注释风格。
#到该行结束。
--到该行结束。
注意‚--‛(引导号)注释风格要求第二个引导号后至少跟着一个空格(或者一个控制字符例如换行)。
这个语法和标准的SQL注释风格有点不同。
/*行中间或多个行*/。
这个封闭的序列不一定在同一行表示,因此该语法允许多行注释。
1.2.5用户变量
GBase8aMPPCluster支持用户变量。
用户变量的生命周期是会话级的,对其它会话不可见。
当用户退出时,此用户的所有用户变量会自动释放。
用户变量的写法是:
@var_name。
一个变量名可以由a~z、A~Z、0~9、下划线组成,必须以字母或下划线开头。
用户变量名大小写不敏感。
通过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;
QueryOK,0rowsaffected
gbase>SELECT@t1,@t2,@t3;
+------+------+------+
|@t1|@t2|@t3|
+------+------+------+
|abc|NULL|4|
+------+------+------+
1rowinset
用户变量可以用于表达式所允许的任何地方。
注意,必须明确指定常量的上下文中不能使用变量,例如,在SELECT的LIMIT子句中。
如果用户使用的变量没有初始化,那么它的值就为NULL。
1.3操作符和函数
在SQL语句中可以使用表达式,表达式可以包含常量,字段,NULL,操作符和函数。
本章描述GBase8aMPPCluster中用于写在表达式中的操作符和函数。
包含NULL的表达式总是得出NULL值结果,除非表达式中的操作和函数在文档中有另外的说明。
1.3.1操作符
1.3.1.1操作符优先级
操作符优先级在下面列出,从最高到最低。
同一行的操作符具有同样的优先级。
BINARY,COLLATE
!
-(unaryminus),~(unarybitinversion)
^
*,/,DIV,%,MOD
-,+
<<,>>
&
|
=,<=>,>=,>,<=,<,<>,!
=,IS,LIKE,REGEXP,IN
BETWEEN,CASE,WHEN,THEN,ELSE
NOT
&&,AND
OR,XOR
:
=
1.3.1.2圆括号
(...)
括号,使用它来规定一个表达式的运算顺序,放在括号里的操作符优先执行。
示例1:
不使用括号,表达式先执行乘法操作,再执行加法操作。
gbase>SELECT1+2*3FROMt;
+-------+
|1+2*3|
+-------+
|7|
+-------+
1rowinset
示例2:
使用括号,表达式先执行括号中的加法操作,再执行括号外的乘法操作。
gbase>SELECT(1+2)*3FROMt;
+---------+
|(1+2)*3|
+---------+
|9|
+---------+
1rowinset
1.3.1.3比较函数和操作符
比较运算的结果是1(TRUE)、0((FALSE)或NULL。
这些运算可用于数字和字符串上。
根据需要,字符串将会自动地被转换到数字,而数字也可自动转换为字符串。
说明:
本章中的一些函数(如GREATEST()和LEAST())的所得值虽然不包括1(TRUE)、0(FALSE)或NULL,但对参数值进行比较时,也会基于下述规则。
GBase8aMPPCluster使用下列规则进行数值比较:
如果一个或两个参数是NULL,比较的结果是NULL,除了<=>比较符(含有NULL参数时,比较结果不是NULL)。
如果在一个比较操作中两个参数均是字符串,它们作为字符串被比较。
如果两个参数均是整数,它们作为整数被比较。
如果比较操作中,一个参数为字符串,另一个为整数,则以操作符左侧参数的数据类型为准。
十六进制值如果不与一个数字进行比较,那么它将当作一个二进制字符串。
如果参数之一是DATETIME列,而另一参数是一个常量,在比较执行之前,这个常量被转换为一个时间戳。
需要注意的是IN()中的参数不是这样的。
为了安全起见,建议用户在比较时使用完整的DATETIME/DATE/TIME字符串。
在所有其它情况下,参数作为浮点(REAL)数字被比较。
要转换一个值成为一个特殊的类型,用户可以使用CAST()函数。
GBase8aMPPCluster主要的比较函数和操作符包括:
1.3.1.3.1=等于
a=b
如果两个操作数相等,则返回1。
1.3.1.3.2<=>NULL值安全等于
NULL值安全等于。
这个操作符像‚=‛操作符一样执行相等比较。
如果所有的操作数是NULL,那么返回的是1而不是NULL。
如果有且只有一个操作数是NULL,那么返回的是0而不是NULL。
1.3.1.3.3<>,!
=不等于
a<>b或a!
=b
如果两个操作数不相等,则返回1。
1.3.1.3.4<=小于或者等于
a<=b
如果a小于或等于b,则返回1。
1.3.1.3.5<小于
a
如果a小于b,则返回1。
1.3.1.3.6>=大于或者等于
a>=b
如果a大于或等于b,则返回1。
1.3.1.3.7>大于
a>b
如果a大于b,则返回1。
1.3.1.3.8isboolean_value,isnotboolean_value
根据一个布尔值来检验一个值,此处的布尔值可以是TRUE、FALSE或
UNKNOWN。
1.3.1.3.9exprBETWEENminANDmax
如果expr的值在min和max之间(包括min和max),返回1,否则返回0。
若所有参数都是同一类型,则上述关系相当于表达式(min<=exprANDexpr<=max)。
其它类型的转换根据本章开篇所述规律进行,且适用于三种参数中任意一种。
1.3.1.3.10exprNOTBETWEENminANDmax
等同于NOT(exprBETWEENminANDmax)。
1.3.1.3.11COALESCE(value,...)
返回值为列表当中的第一个非NULL值,在全部为NULL值的情况下返回值为NULL。
1.3.1.3.12GREATEST(value1,value2,...)
当有两个或多个参数时,返回值为最大的参数值。
当参数中有一个为NULL时,直接返回NULL。
当参数都是字符串时,默认是不区分大小写的,如果希望字符串值的参数进行大小写敏感,则在需要敏感的字符串参数前加上BINARY。
这些参数比较使用下列规则:
如果返回值在INTEGER上下文中或者所有的参数是整型值,那么它们使用整数比较;
如果返回值在REAL上下文中或者所有的参数是实数值,那么它们使用实数比较;
如果所有的参数是大小写敏感的字符串,那么参数比较也是大小写敏感的;
其它情况下,参数比较大小写不敏感。
1.3.1.3.13exprIN(value,...)
如果expr是IN列表中的任一值,它将返回1,否则返回0。
如果所有的值均是常量,那么所有的值被按照expr的类型进行计算和排序。
1.3.1.3.14exprNOTIN(value,...)
等价于NOT(exprIN(value,...))。
1.3.1.3.15ISNULL(expr)
如果expr为NULL,ISNULL()的返回值为1,否则返回值为0。
1.3.1.3.16LEAST(value1,value2,...)
有两个或者更多的参数,返回最小的参数值。
假如任意一个变量为NULL,则LEAST()的返回值为NULL。
LEAST()对参数进行比较所依据的规则同GREATEST()相同。
1.3.1.4逻辑操作符
在SQL中,所有的逻辑操作符返回的值均为TRUE、FALSE或NULL(UNKNOWN),它们是由1(TRUE)、0(FALSE)和NULL来实现的。
1.3.1.4.1NOT,!
逻辑非
如果操作数为0,返回1;如果操作数为非零,返回0;如果操作数为NULL,返回NULL。
1.3.1.4.2XOR逻辑异或
当任意一个操作数为NULL时,返回值为NULL。
对于非NULL的操作数:
真
(1)异或假(0)的结果是真,假(0)异或真
(1)的结果也是真。
真
(1)异或真
(1)的结果是假,假(0)异或假(0)的结果是假。
就是说两个值不相同,则异或结果为真,反之,为假。
1.3.1.5转换操作符和函数
1.3.1.5.1BINARY
在字符串前使用BINARY操作符,可以使得参数值的比较区分大小写。
1.3.1.5.2CAST和CONVERT函数
CAST(exprAStype),CONVERT(expr,type),CONVERT(exprUSINGtranscoding_name)
CAST()和CONVERT()函数可以用于将一个类型的数值转换到另一个类型。
type可以是下列值之一:
CHAR、DATE、DATETIME、DECIMAL、TIME
CAST()和CONVERT(...USING...)是标准的SQL语法。
CAST(strASBINARY)等价于BINARYstr。
CAST(exprASCHAR)把表达式看作是默认字符集中的字符串。
注意:
一个CAST()到DATE,DATETIME,或TIME只是标识此列,使其变为一个指定的数据类型,而不是改变列的值。
CAST()的最终执行结果将会转化为正确的列类型。
1.3.2控制流函数
1.3.2.1CASE
CASEvalueWHEN[compare-value]THENresult[WHEN[compare-value]THENresult...][ELSEresult]END
逐一匹配,当满足value=compare-value时,返回对应的result,如果未找到匹配项,则返回ELSE后的result。
如果没有ELSE子句,默认返回NULL。
CASEWHEN[condition]THENresult[WHEN[condition]THENresult...][ELSEresult]END
逐一判断,当condition为TRUE时,返回对应的result,如果condition全为FALSE,则返回ELSE后的result。
如果没有ELSE子句,默认返回NULL。
一个CASE表达式的默认返回值类型是所有返回值的相容集合类型,具体情况视其所在语境而定:
如用在字符串语境中,则返回结果为字符串;
如用在数字语境中,则返回结果为十进制值的实数值或整数值。
1.3.2.2DECODE
DECODE(value,value1,result1,value2,result2,value3,result3,...,result)
类似于CASEvalueWHERvalue1THENvalue1,唯一区别是如果value为null值,可以和后面的null值匹配。
1.3.2.3IF(expr1,expr2,expr3)
如果expr1为TRUE(expr1<>0andexpr1<>NULL),则IF()的返回值为expr2;否则返回值为expr3。
IF()的返回值规则同CASE表达式返回值的规则。
1.3.2.4IFNULL(expr1,expr2)
如果expr1不为NULL,则IFNULL()的返回值为expr1,否则其返回值为expr2。
IFNULL()的返回值是数字或是字符串,具体情况取决于使用它的上下文环境。
等价于IF(expre1,expre1,expre2)。
1.3.2.5NULLIF(expr1,expr2)
如果expr1=expr2成立,返回值为NULL,否则返回值为expr1。
等价于CASEWHENexpr1=expr2THENNULLELSEexpr1END。
1.3.3字符串函数
在此列举几个应用比较多的字符串函数,如下:
1、CHAR_LENGTH(str)
返回字符串str的字符长度,以字符进行计算。
2、CONCAT(str1,str2,...)
返回结果为