1、GBase 8a学习总结技术产品规范/项目名称设计方案朗新云商项目开发部2017年10月修改履历版本号修改编号更改简要描述更改人批准人1 GBase数据类型及SQL语句1.1 GBase 8a数据类型GBase 8a MPP Cluster 支持SQL92 中定义的绝大多数数据类型,同时也支持SQL99 和SQL2000 中定义的数据类型。GBase 8a MPP Cluster 支持的数据类型,如下表所示:GBase 8a MPP Cluster的数据类型数值型TINYINTINTBIGINTFLOATDOUBLEDECIMAL字符型CHARVARCHARTEXT二进制类型BLOB日期和时间
2、型DATEDATETIMETIMETIMESTAMP1.1.1 数值类型GBase 8a MPP Cluster 支持的数值类型,如下表所示:类型名称最小值最大值占用字节TINYINT-1271271SMALLINT-32767327672INT(INTEGER)-47474BIGINT-8068068FLOAT+38+384DOUBLE+308+3088DECIMAL(M,D)-(1E+M -1)/(1E+D)(1E+M -1)/(1E+D)动态计算1.1.2 字符类型GBase 8a MPP Cluster 目前支持三种字符类型,如下表所示:类型名称最大长度(字符)备注CHAR255不足指
3、定长度,右边空格补充VARCHAR10922不足指定长度,不会补充TEXT10922不能为它指定DEFAULT 值1.1.3 二进制数据类型GBase 8a MPP Cluster 目前支持以下二进制数据类型,如下表所示:类型名称最大长度(字节)BLOB32767使用BLOB 数据类型,有如下约束: BLOB 列支持32KB 的存储容量。 创建表时,BLOB 列不可以有DEFAULT 值。 查询语句中,BLOB 列不支持过滤条件。 查询语句中,BLOB 列不支持OLAP 函数。1.1.4 日期和时间类型类型名称最小值最大值格式DATE0001-01-019999-12-31YYYY-MM-dd
4、DATETIME0001-01-0100:00:9999-12-3123:59:59YYYY-MM-ddHH:MI:TIME-838:59:59838:59:59HHH:MI:SSTIMESTAMP1970-01-0108:00:012038-01-0100:59:59YYYY-MM-DDHH:MI:SSTIMESTAMP 使用限制:以下限制说明,是针对TIMESTAMP 数据列自动更新时的场景:1. 在一张表中,只能自动更新表中第一个出现的TIMESTAMP 列,并且必须使用DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP来定义。2.
5、 在一张表中,使用DEFAULT CURRENT_TIMESTAMP ON UPDATECURRENT_TIMESTAMP 来指定TIMESTAMP 列自动更新时,只能使用一次,且用于第一个TIMESTAMP 列。3. 从不同节点发起的SQL 语句,TIMESTAMP 列更新的时间为发起节点的本地时间;如果从不同的发起点发起SQL,而各个节点的本地时间又不同步,则无法保证TIMESTAMP 列更新值一致。1.2 SQL语言基础本章对GBase 8a MPP Cluster 的SQL 语句的下列元素进行讨论:数值,例如字符串和数字;标识符,比如表和列名字;用户和系统变量;注释。1.2.1 数值这
6、部分主要介绍在GBase 8a MPP Cluster 中使用的数值。包括字符串,数字,十六进制值,布尔值和NULL。1.2.1.1 字符串字符串是多个字符组成的一个字符序列,由单引号?或双引号?字符包围。例如:a string在一个字符串中,确定的序列具有特殊的含义,每个序列以反斜线符号?开头,称为转义字符。GBase 8a MPP Cluster 识别下列转义字符:转义字符描述0ASCII 0 (NUL)字符。ASCII 39 单引号?字符。”ASCII 34 双引号?字符。bASCII 8 退格符。nASCII 10 换行符。rASCII 13 回车符。tASCII 9 制表符(TAB)
7、。ASCII 92 反斜线?字符。如果用户想要把二进制数据插入到BLOB 字段中,下列字符必须由转义序列表示:字符描述NULNUL byte (ASCII 0)。需要用?0?(一个反斜线和一个ASCII?0?字符)表示。反斜线(ASCII 92)。需要用?表示。单引号(ASCII 39)。需要用?表示。”双引号(ASCII 34)。需要用?表示。1.2.1.2 数字整数被表示为一个数字序列。浮点数使用?.?作为一个十进制数的分隔符。这两个数字类型可以前置?-?以表示一个负值。有效整数的示例:1221、0、-32有效浮点数的示例:+10、+131.2.1.3 十六进制值GBase 8a MPP
8、Cluster 支持十六进制数值。在数字的上下文语境中,它们作为等价于整数使用。在字符串的上下文语境中,它们作为一个字符串,每一对十六进制数字被解释为对应ASCII 码的字符。十六进制转字符,表达式?xhexstring?是基于标准SQL 的,表达式0x 是基于ODBC 的。二者是等价的。使用HEX()函数可以将一个字符串或数值转换为一个十六进制格式的字符串。1.2.1.4 布尔值常量TURE 相当于1,而常量FALSE 相当于0。常量的名字对大小写不敏感。示例1:查询TRUE 和FALSE 对应的值。gbase SELECT TRUE, true, FALSE, false FROM t;+
9、-+-+-+-+| TRUE | TRUE | FALSE | FALSE |+-+-+-+-+| 1 | 1 | 0 | 0 |+-+-+-+-+1 row in set1.2.1.5 NULL值NULL 不区分大小写。注意:NULL 值不同于数字类型的0 或字符串类型的空串。1.2.2 数据库、表、列和别名数据库、表、列和别名等都是标识符,这部分描述GBase 8a MPP Cluster中标识符允许的语法规则。下面的表描述了对于每一个类型标识符允许的最大长度和可使用的字符。标识符最大长度(字符)允许的字符数据库52az、AZ、09、下划线,必须以字母或下划线开头。表52az、AZ、09、
10、下划线,必须以字母或下划线开头。视图52az、AZ、09、下划线,必须以字母或下划线开头。列52az、AZ、09、下划线,必须以字母或下划线开头。别名52az、AZ、09、下划线,必须以字母或下划线开头。存储过程52az、AZ、09、下划线,必须以字母或下划线开头。实际应用系统中,标识符不得使用GBase 8a MPP Cluster 的保留字,也不能包含特殊字符。1.2.3 标识符限定词GBase 8a MPP Cluster 允许名称由一个或多个标识符组成。组合名称的各个组成成分应该用英文句号字符?.?分割开。组合名称的开始部分做为限定词来使用,它影响了上下文中后面的标识符的解释。在GBa
11、se 8a MPP Cluster 中,用户可以使用下列表格中的任一种方式引用一个列:列引用含义col_name列col_name来自查询所用的任何一个表中对应字段。列col_name来自当前数据库中的表table_name。列col_name来自数据库database_name中的表table_name。column_name该字段是一个关键词或包含特殊字符。组合标识符如果需要引用则标识符的各部分都要各自引用,而不是把组合标识符作为一个整体来引用。例如:gs-table.gs-column合法, whereas不合法。在一条语句的列引用中,不需要明确指定一个table_name 或 前缀,除
12、非这个引用存在二义性。例如,假设表t1和t2 均包含一个字段c,当用一个使用了t1 和t2 的SELECT 检索c 时,在这种情况下,字段c 存在二义性,因为它在这个语句所使用的表中不是唯一的,因而必须通过写出 或 来指明用户所需的是哪个表。同样的,如果从数据库db1 的表t 和数据库db2 的表t 中检索,用户必须用和 来指定引用哪个库表的列。1.2.4 注释语法GBase 8a MPP Cluster 支持三种注释风格。# 到该行结束。- 到该行结束。注意?-?(引导号)注释风格要求第二个引导号后至少跟着一个空格(或者一个控制字符例如换行)。这个语法和标准的SQL 注释风格有点不同。/*行
13、中间或多个行*/。这个封闭的序列不一定在同一行表示,因此该语法允许多行注释。1.2.5 用户变量GBase 8a MPP Cluster 支持用户变量。用户变量的生命周期是会话级的,对其它会话不可见。当用户退出时,此用户的所有用户变量会自动释放。用户变量的写法是:var_name。一个变量名可以由az、AZ、09、下划线组成,必须以字母或下划线开头。用户变量名大小写不敏感。通过SET 语法来定义并为变量赋值。SET var_name = expr , var_name = expr .?=?是赋值操作符。赋给每一个变量的expr 值可以是整数、实数、字符串、或NULL。通过SELECT 语法查
14、看用户变量的值。SELECT var_name , var_name .示例1:使用SET 语句为变量赋值。gbase SET t1=abc,t2=null,t3=4;Query OK, 0 rows affectedgbase SELECT t1,t2,t3; +-+-+-+| t1 | t2 | t3 |+-+-+-+| abc | NULL | 4 |+-+-+-+1 row in set用户变量可以用于表达式所允许的任何地方。注意,必须明确指定常量的上下文中不能使用变量,例如,在SELECT 的LIMIT 子句中。如果用户使用的变量没有初始化,那么它的值就为NULL。1.3 操作符和函
15、数在SQL 语句中可以使用表达式,表达式可以包含常量,字段,NULL,操作符和函数。本章描述GBase 8a MPP Cluster 中用于写在表达式中的操作符和函数。包含NULL 的表达式总是得出NULL 值结果,除非表达式中的操作和函数在文档中有另外的说明。1.3.1 操作符1.3.1.1 操作符优先级操作符优先级在下面列出,从最高到最低。同一行的操作符具有同样的优先级。BINARY,COLLATE!-(unary minus),(unary bit inversion) *,/,DIV,%,MOD-,+&|=,=,=,!=,IS,LIKE,REGEXP,INBETWEEN,CASE,WH
16、EN,THEN,ELSENOT&,ANDOR,XOR:=1.3.1.2 圆括号(.)括号,使用它来规定一个表达式的运算顺序,放在括号里的操作符优先执行。示例1:不使用括号,表达式先执行乘法操作,再执行加法操作。gbase SELECT 1+2*3 FROM t;+-+| 1+2*3 |+-+| 7 |+-+1 row in set示例2:使用括号,表达式先执行括号中的加法操作,再执行括号外的乘法操作。gbase SELECT (1+2)*3 FROM t;+-+| (1+2)*3 |+-+| 9 |+-+1 row in set1.3.1.3 比较函数和操作符比较运算的结果是1(TRUE)、0
17、((FALSE)或NULL。这些运算可用于数字和字符串上。根据需要,字符串将会自动地被转换到数字,而数字也可自动转换为字符串。说明:本章中的一些函数(如GREATEST()和LEAST())的所得值虽然不包括1(TRUE)、0(FALSE)或NULL,但对参数值进行比较时,也会基于下述规则。GBase 8a MPP Cluster 使用下列规则进行数值比较: 如果一个或两个参数是NULL,比较的结果是NULL,除了比较符(含有NULL 参数时,比较结果不是NULL)。 如果在一个比较操作中两个参数均是字符串,它们作为字符串被比较。 如果两个参数均是整数,它们作为整数被比较。 如果比较操作中,一
18、个参数为字符串,另一个为整数,则以操作符左侧参数的数据类型为准。 十六进制值如果不与一个数字进行比较,那么它将当作一个二进制字符串。 如果参数之一是DATETIME 列,而另一参数是一个常量,在比较执行之前,这个常量被转换为一个时间戳。需要注意的是IN()中的参数不是这样的。为了安全起见,建议用户在比较时使用完整的DATETIME/DATE/TIME 字符串。 在所有其它情况下,参数作为浮点(REAL)数字被比较。 要转换一个值成为一个特殊的类型,用户可以使用CAST()函数。GBase 8a MPP Cluster主要的比较函数和操作符包括:1.3.1.3.1 = 等于a=b如果两个操作数相
19、等,则返回1。1.3.1.3.2 NULL值安全等于NULL 值安全等于。这个操作符像?=?操作符一样执行相等比较。如果所有的操作数是NULL,那么返回的是1 而不是NULL。如果有且只有一个操作数是NULL,那么返回的是0 而不是NULL。1.3.1.3.3 , != 不等于ab 或a!=b如果两个操作数不相等,则返回1。1.3.1.3.4 = 小于或者等于a=b如果a 小于或等于b,则返回1。1.3.1.3.5 小于a= 大于或者等于a=b如果a 大于或等于b,则返回1。1.3.1.3.7 大于ab如果a 大于b,则返回1。1.3.1.3.8 is boolean_value ,is no
20、t boolean_value根据一个布尔值来检验一个值,此处的布尔值可以是TRUE、FALSE 或UNKNOWN。1.3.1.3.9 expr BETWEEN min AND max如果expr 的值在min 和max 之间(包括min 和max),返回1,否则返回0。若所有参数都是同一类型,则上述关系相当于表达式(min = expr AND expr= max)。其它类型的转换根据本章开篇所述规律进行,且适用于三种参数中任意一种。1.3.1.3.10 expr NOT BETWEEN min AND max等同于NOT(expr BETWEEN min AND max)。1.3.1.3.
21、11 COALESCE(value,.)返回值为列表当中的第一个非NULL 值,在全部为NULL 值的情况下返回值为NULL。1.3.1.3.12 GREATEST(value1,value2,.)当有两个或多个参数时,返回值为最大的参数值。当参数中有一个为NULL 时,直接返回NULL。当参数都是字符串时,默认是不区分大小写的,如果希望字符串值的参数进行大小写敏感,则在需要敏感的字符串参数前加上BINARY。这些参数比较使用下列规则: 如果返回值在INTEGER 上下文中或者所有的参数是整型值,那么它们使用整数比较; 如果返回值在REAL 上下文中或者所有的参数是实数值,那么它们使用实数比较
22、; 如果所有的参数是大小写敏感的字符串,那么参数比较也是大小写敏感的; 其它情况下,参数比较大小写不敏感。1.3.1.3.13 expr IN (value,.)如果expr 是IN 列表中的任一值,它将返回1,否则返回0。如果所有的值均是常量,那么所有的值被按照expr 的类型进行计算和排序。1.3.1.3.14 expr NOT IN (value,.)等价于NOT(expr IN (value,.)。1.3.1.3.15 ISNULL(expr)如果expr 为NULL,ISNULL()的返回值为1,否则返回值为0。1.3.1.3.16 LEAST(value1,value2,.)有两个
23、或者更多的参数,返回最小的参数值。假如任意一个变量为NULL,则LEAST()的返回值为NULL。LEAST()对参数进行比较所依据的规则同GREATEST()相同。1.3.1.4 逻辑操作符在SQL 中,所有的逻辑操作符返回的值均为TRUE、FALSE 或NULL(UNKNOWN),它们是由1(TRUE)、0(FALSE)和NULL 来实现的。1.3.1.4.1 NOT,!逻辑非如果操作数为0,返回1;如果操作数为非零,返回0;如果操作数为NULL,返回NULL。1.3.1.4.2 XOR逻辑异或当任意一个操作数为NULL 时,返回值为NULL。对于非NULL 的操作数:真(1)异或假(0)
24、的结果是真,假(0)异或真(1)的结果也是真。真(1)异或真(1)的结果是假,假(0)异或假(0)的结果是假。就是说两个值不相同,则异或结果为真,反之,为假。1.3.1.5 转换操作符和函数1.3.1.5.1 BINARY在字符串前使用BINARY 操作符,可以使得参数值的比较区分大小写。1.3.1.5.2 CAST和CONVERT函数CAST(expr AS type),CONVERT(expr,type),CONVERT(expr USINGtranscoding_name)CAST()和CONVERT()函数可以用于将一个类型的数值转换到另一个类型。type 可以是下列值之一:CHAR、
25、DATE、DATETIME、DECIMAL、TIMECAST()和CONVERT(.USING.)是标准的SQL 语法。CAST(str AS BINARY)等价于BINARY str。CAST(expr AS CHAR)把表达式看作是默认字符集中的字符串。注意:一个CAST()到DATE,DATETIME,或TIME 只是标识此列,使其变为一个指定的数据类型,而不是改变列的值。CAST()的最终执行结果将会转化为正确的列类型。1.3.2 控制流函数1.3.2.1 CASECASE value WHEN compare-value THEN result WHEN compare-value
26、THEN result . ELSE result END逐一匹配,当满足value=compare-value 时,返回对应的result,如果未找到匹配项,则返回ELSE 后的result。如果没有ELSE 子句,默认返回NULL。CASE WHEN condition THEN result WHEN condition THEN result . ELSE result END逐一判断,当condition 为TRUE 时,返回对应的result,如果condition全为FALSE,则返回ELSE 后的result。如果没有ELSE 子句,默认返回NULL。一个CASE 表达式的默认
27、返回值类型是所有返回值的相容集合类型,具体情况视其所在语境而定: 如用在字符串语境中,则返回结果为字符串; 如用在数字语境中,则返回结果为十进制值的实数值或整数值。1.3.2.2 DECODEDECODE(value,value1,result1, value2,result2, value3,result3,. , result)类似于CASE value WHER value1 THEN value1,唯一区别是如果value 为null 值,可以和后面的null 值匹配。1.3.2.3 IF(expr1,expr2,expr3)如果expr1 为TRUE (expr1 0 and exp
28、r1 NULL),则IF()的返回值为expr2;否则返回值为expr3。IF()的返回值规则同CASE 表达式返回值的规则。1.3.2.4 IFNULL(expr1,expr2)如果expr1 不为NULL,则IFNULL()的返回值为expr1,否则其返回值为expr2。IFNULL()的返回值是数字或是字符串,具体情况取决于使用它的上下文环境。等价于IF(expre1,expre1,expre2)。1.3.2.5 NULLIF(expr1,expr2)如果expr1 = expr2 成立,返回值为NULL,否则返回值为expr1。等价于CASE WHEN expr1 = expr2 THEN NULL ELSE expr1 END。1.3.3 字符串函数在此列举几个应用比较多的字符串函数,如下:1、CHAR_LENGTH(str)返回字符串str 的字符长度,以字符进行计算。2、CONCAT(str1,str2,.)返
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1