一 DDL 语句
介绍 GBase 8a 用于创建数据库对象的 DDL 语句
1.1DATABASE
1.1.1 CREATE DATABASE
CREATE DATABASE [IF NOT EXISTS] database_name
CREATE DATABASE 是以给定的名称创建一个数据库。用户需要获得创建
数据库的权限,才可以使用 CREATE DATABASE。
1.1.21DROP DATABASE
DROP DATABASE [IF EXISTS] database_name
DROP DATABASE 删除指定的数据库以及它所包含的表。请小心使用此语
句!用户需要获得对数据库的 DROP 权限,才可以使用 DROP DATABASE。
使用关键字 IF EXISTS,以防止由于数据库不存在而报告错误。
1.2TABLE
在本节中用到的术语如下。 临时表:创建表时使用 TEMPORARY 关键字,这样创建的表为临时表,
临时表仅存在于当前 session 中。
预租磁盘:预租磁盘空间可以预先批量分配磁盘块,这样尽量保证了
列的 DC 数据文件磁盘块连续。在顺序读取列 DC 数据时,性能会有明
显提升。
1.2.1 CREATE TABLE
CREATE TABLE 以用户给定的名字在当前数据库创建一个表。用户必须有
创建表的权限。
CREATE [TEMPORARY] TABLE [IF NOT EXISTS]
[database_name.]table_name
(column_definition [ , column_definition], ... [, key_options])
[table_options]
column_definition:
column_name data_type [NOT NULL | NULL] [DEFAULT default_value]
table_options:[COMMENT 'comment_value']
参数说明如下:
TEMPORARY:该参数为可选参数,创建临时表需要使用此关键字。
临时表的创建请参见“4.1.2.1.3 CREATE TEMPORARY TABLE”的内
容。
IF NOT EXISTS:该参数为可选参数,用户可以使用关键字 IF NOT
EXISTS 创建表,如果表已经存在,系统将报告 WARNING 信息。
database_name:该参数为可选参数,指定数据库后,在此数据库下创
建表。如果没有显示指定 database_name 参数,创建的表隶属于 USE
database_name 后的数据中的表。
table_name:表命名规则请参见“2.2 数据库、表、索引、列和别名”。
默认情况下,在当前数据库中创建表。如果没有指定当前数据库或表
已经存在,则报告错误信息。
column_name:指定表中的数据列。
data_type:指定数据列的数据类型。数据类型参见“1 数据类型”中
的内容。
NOT NULL | NULL:指定数据列的值,是否允许为 NULL。如果既没
有指定 NULL 也没有指定 NOT NULL,列被视为指定了 NULL。
default_value:指定数据列的默认值。默认值必须是一个常数,而不能
是一个函数或者一个表达式。举例来说,用户不能将一个数据列的默
认值设置为 NOW()或者 CURRENT_DATE()之类的函数。对于给定的
一个表,可以使用 SHOW CREATE TABLE 语句来查看哪些列有显式
DEFAULT 子句。
comment_value:指定数据列的备注说明。例如:stu_no id COMMENT
'学号'。
table_options:
COMMENT:指定表的备注说明。可以用 SHOW CREATE TABLE
table_name和 SHOW FULL COLUMNS FROM table_name语句来显示备注信息。
1.2.2 CREATE TABLE...AS SELECT...
语法格式:
CREATE TABLE table_name_[(column_definition,...)] AS SELECT ...
功能:
根据列定义以及投影列创建表结构,并且将 SELECT 中查询的数据复制到
所创建的表中。
参数说明如下:
AS:指定 SELECT 语句,可选关键字。
其他参数说明请参见“4.1.2.1 CREATE TABLE”参数说明部分的内容。
1.2.3 CREATE TABLE...LIKE...
语法格式:
CREATE TABLE table_name1 LIKE table_name2;
功能:
复制 table_name2 的表结构来创建表 table_name1。
1.2.4 CREATE TEMPORARY TABLE ...
功能:
在创建一个表时,用户可以使用关键词 TEMPORARY。临时表被限制在当前连接中,当连接关闭时,临时表会自动地删除。这就意味着,两个不同的连
接可以使用同一个临时表名而不会发生冲突,也不会与同名现有的表冲突(现
有表将被隐藏,直到临时表被删除)。使用此种方法,一旦客户端与 GBase 8a
server 断开连接,临时表将自动删除。注意事项: 临时表支持除 ALTER 之外的所有 DDL 及 DML 操作。
临时表不能被备份。
临时表支持在当前连接中使用查询结果导出语句导出表中数据。
1.3 ALTER TABLE
ALTER TABLE [database_name.]table_name
alter_specification [, alter_specification] ...
alter_specification:
ADD [COLUMN] column_definition [FIRST | AFTER col_name ]
| ADD [COLUMN] (column_definition,...)
| CHANGE [COLUMN] old_col_name new_col_name column_definition
| CHANGE [COLUMN] old_col_name new_col_name VARCHAR(length)
| MODIFY [COLUMN] col_name column_definition
FIRST | AFTER col_name
| MODIFY [COLUMN] col_name VARCHAR(length)
FIRST | AFTER col_name
| RENAME [TO] new_table_name
| DROP [COLUMN] col_name
| SHRINK SPACE
参数说明如下:
| ADD [COLUMN] (column_definition,...):用于增加新的数据列,如果
使用 FIRST,则新增加的列位于所有数据列的前面;如果使用 AFTER,
则新增加的列,位于指定数据列的后面。默认不使用 FIRST、AFTER,
则将增加的新列追加到末尾处。
CHANGE [COLUMN] old_col_name new_col_name column_definition:
修改列名称。除 varchar 类型以外,其他类型的列定义不支持修改。
CHANGE [COLUMN] old_col_name new_col_name VARCHAR(length):
当字段为 VARCHAR 类型时,使用 CHANGE 除修改列名称外还可以
增加字段的长度。具体使用方式及限制,参见“4.1.2.2.2 ALTER
TABLE…CHANGE|MODIFY…VARCHAR(LENGTH)”章节。
MODIFY [COLUMN] col_name column_definition FIRST | AFTER
col_name :修改表中存在列的位置。除 varchar 类型以外,其他类型的
列定义不支持修改。
MODIFY col_name VARCHAR(length) FIRST | AFTER col_name:当字
段为 varchar 类型时,使用 MODIFY 除修改列位置外还可以增加字段
的长度。具体使用方式及限制,参见“4.1.2.2.2 ALTER
TABLE…CHANGE|MODIFY…VARCHAR(LENGTH)”章节。
RENAME [TO] new_table_name:修改表名称为 new_table_name。
DROP [COLUMN] col_name:删除表中存在的列。
SHRINK SPACE:释放被删除的数据文件所占的磁盘空间。
注意事项:
目前已经支持的有:增加列、删除列、改表名、改列名、改变列的位置;
不支持的有:ORDER BY、改变列的数据类型、改变列的属性(NOT NULL,默认值、注释)、改变表的字符集。
新增列的限制有:对于新增加的列,如果设置了 NOT NULL,则需要同时
设置默认值,否则报错;不允许非 EXPRESS 引擎的表与 EXPRESS 表互转。
1.3.1 ALTER TABLE... SHRINK SPACE
语法格式: ALTER TABLE [database_names.]tbl_name SHRINK SPACE [FULL] | [FULL BLOCK_REUSE_RATIO=num]; FULL :按行级回收,完全保证有效行原始顺序,效率比较低; BLOCK_REUSE_RATIO:每个 block(DC)重用率(0~100],指 DC 的有 效数据占比 >= 该值时则重用该 DC;无法保证原始顺序; 【注】包含行存列的表不支持 shrink space 深度回收。 功能: 释放被删除的数据文件所占的磁盘空间。 能够对被删除数据(一定范围内连续数据)所占用的磁盘空间进行回收, 包括:数据文件、hash index(分段 hash)、智能索引(BSI/ASI)、delete bitmap、 全文索引等,占磁盘空间较多的文件全部支持空间回收。回收 insert select 或 load 未提交产生的垃圾文件。 注意事项: 磁盘空间回收命令仅针对表。 数据文件所占的磁盘空间回收以文件为单位,只有当这个数据文件涉及的 数据都被删除后才能回收该文件占用的磁盘空间。 如果被删除的数据只命中 DC 的部分数据,则该数据文件不能被清理。 如果删除数据命中所有数据,则有尾块数据的文件不被清理。 磁盘空间回收过程中需要一定的磁盘空间来备份部分元数据文件,在没有 可用空间的情况下执行该命令会报错,这时需要手工清理一部分空间(一般需 要 1G 空间)再执行该命令进行空间回收。
1.3.2 ALTER TABLE…CHANGE|MODIFY…VARCHAR(LENGTH)
语法格式:
ALTER TABLE [database_names.]tbl_name CHANGE old_col_name
new_col_name VARCHAR(length);
或
ALTER TABLE [database_names.]tbl_name MODIFY col_name
VARCHAR(length) [FIRST | AFTER col_name ];
功能:
使用 alter table 的 change 参数和 modify 参数,既可以修改列名称、列位置,
还可以增加表中 varchar 字段的长度。
注意事项:
修改 varchar 字段的长度,要保证不短于已有的长度,以保证原有数据不出
错 ,因此在 GBase 中,只能增加 varchar 字段的长度,不能减小 varchar 字段的
长度。
字符集为 utf8 时,修改后的长度要大于等于表定义时的该字段 varchar 的长
度,小于等于 10922。具体的最大值还要受限于表的宽度来确定,所有列长度之
和不能超过表的宽度,表的记录的最大长度为 512k。
如果创建表时定义了行存列、hash index,则不能使用本命令增加字段长度。
1.3.3RENAME TABLE
语法格式:
RENAME TABLE [database_name.]old_table_name TO
[database_name.]new_table_name;
参数说明如下:
database_name:是要修改表隶属的数据库名称,可选项;省略此参数,即
为 USE 后的数据库名称。
old_table_name:是表的原有名称。
new_table_name:是表的要修改后的新名称。
功能:
RENAME TABLE 的功能上就是将一张已经存在的表的名称修改为一个不
存在的新的表名称。
1.3.4 TRUNCATE TABLE
语法格式:
TRUNCATE TABLE [database_name.]table_name;
参数说明如下:
database_name:是要删除表隶属的数据库名称,可选项;省略此参数,即
为 USE 后的数据库名称。
table_name:是要删除其全部行的表的名称。
功能:
TRUNCATE TABLE 在功能上与不带 WHERE 子句的 DELETE 语句相同,
二者均删除表中的全部行。但 TRUNCATE TABLE 比 DELETE 速度快,且使用
的系统和事务日志资源少。
TRUNCATE TABLE 属于 DDL 语法,DELETE FROM table_name 属于 DML
语法。
TRUNCATE TABLE 删除表中的所有行,但表结构及其列、约束、索引等
保持不变。
1.3.5 DROP TABLE
语法格式:
DROP [TEMPORARY] TABLE [IF EXISTS] [database_name.]table_name
参数说明如下:
TEMPORARY:该参数为可选参数,删除临时表时建议使用此关键字。
IF EXISTS:用户可以使用关键词 IF EXISTS 防止表不存在时报告错误。当
使用 IF EXISTS 时,对于不存在的表,用户将得到一个 WARNING。
使用 DROP TABLE 移除一个表时,将移除所有的数据和表定义,用户必须
有表的 DROP 权限,所以,一定要小心地使用这个命令!
1.3 VIEW
视图是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含一系
列带有名称的列。数据来自由定义视图的查询所引用的表,并且在引用视图时
动态生成。对其中所引用的基础表来说,视图的作用类似于筛选。定义视图的
筛选可以来自当前或其它数据库的一个或多个表,或者其它视图。分布式查询
也可用于定义使用多个异类源数据的视图。
需要注意的是:GBase 8a 禁止对视图进行 INSERT、UPDATE 和 DELETE
操作。
视图具有以下的作用:
简单性。看到的就是需要的。视图不仅可以简化用户对数据的理解,也可以简化他们的操作。那些被经常使用的查询可以被定义为视图,从而使得用户
不必为以后的操作每次指定全部的条件。
安全性。通过视图用户只能查询和修改他们所能见到的数据。数据库中的
其它数据则既看不见也取不到。数据库授权命令可以使每个用户对数据库的检
索限制到特定的数据库对象上,但不能授权到数据库特定行和特定的列上。通
过视图,用户可以被限制在数据的不同子集上。
1.3.1 CREATE VIEW
语法格式:
CREATE [OR REPLACE] VIEW [database_name.]view_name [(column_list)]
AS select_statement
此语句用来创建一个新的视图,或者使用 OR REPLACE 子句来替换已经存
在的视图。
select_statement 是提供给定义视图的 SELECT 语句。本语句可以从其它表
或者视图中提取数据。
select_statement 是提供给定义视图的 select 语句,语法如下:
select select_expr [comment comment_value],… from table_references
1.3.2 ALTER VIEW
语法格式:
ALTER VIEW [database_name.]view_name [(column_list)] AS
select_statement
1.3.3 DROP VIEW
语法格式:
DROP VIEW [IF EXISTS] [database_name.]view_name
DROP VIEW 删除一个视图。用户必须有对每个视图的 DROP 权限。
用户可以使用关键词 IF EXISTS 防止视图不存在时报告错误。
DROP VIEW 每次只能删除一张视图。
1.4 INDEX
1.4.1 CREATE INDEX
语法格式:
CREATE INDEX index_name ON [database_name.]table_name(column_name)
[key_block_size = size_value] USING HASH [GLOBAL|LOCAL]
index_name:索引名。
database_name:数据库名。可省略,省略时,必须首先使用 USE 命令,指
定当前数据库。
table_name:表名。
column_name:使用索引的列名。
LOCAL:在表的每一个 DC 上创建哈希索引。
GLOBAL:默认创建 GLOBAL 的哈希索引。创建全局哈希索引,全局创建
索引针对整列,数据按页存储,每个数据块占用多少个页可以在创建索引时指
定。
key_block_size = size_value:当使用 GLOBAL 关键字时,可以配合使用它,
这个参数表示指定每个数据块的大小。
一般来说,二进制类型的列不适合使用 HASH INDEX,或者该列数据量较
大,但 DISTINCT 值较少时,也不适合使用 HASH INDEX。
使用 GLOBAL 还是 LOCAL 来定义索引的范围,需要根据实际业务来具体
考虑。
同一表上不能创建相同名称的哈希索引,同一表的同一列上能且只能创建
一个哈希索引,任何 GBase 8a 支持的数据类型的列上都可以创建哈希索引。
创建哈希索引后,基于索引列的等值查询的性能会提高,尤其是表中的数
据量非常大的情况,在小数据量的情况下,哈希索引对性能的提升效果不明显。
1.4.2 DROP INDEX
语法格式:
DROP INDEX index_name ON [database_name.]table_name
1.5 预租磁盘
预租磁盘空间可以预先批量分配磁盘块,这样尽量保证了列的 DC 数据文
件磁盘块连续。这样在顺序读取列 DC 数据时,性能会有明显提升。
创建表时,可以指定表的自动扩展大小。当表中的存储数据超过制定的预
租大小空间时,系统会自动按照预租磁盘大小空间进行自动扩展。目前预租磁
盘空间大小可以按照 MB 和 GB 大小来设定,扩展大小在[1M,2G)范围内。
支持对预租磁盘的 ALTER 的 DDL 操作(关闭预租磁盘空间)。
修改预租磁盘的扩展空间(修改预租磁盘空间大小)。
预租磁盘的预租空间是按照列级增长的。
创建预租磁盘空间的语法:
CREATE TABLE [IF NOT EXISTS] table_name
(col type,...)
AUTOEXTEND ON NEXT NUM[M/G]; - 477 -
NUM:以 M(megabytes),G(gigabytes)为单位。注意以下原则:
NUM 的有效范围为 1M ≤ NUM < 2G。
修改预租磁盘空间大小的语法:
ALTER TABLE table_name AUTOEXTEND ON NEXT NUM[M/G] ;
关闭预租磁盘空间的语法:
ALTER TABLE table_name AUTOEXTEND OFF;
1.6 列和表的压缩
6.1 列级压缩
除了使用 GBase 8a 配置参数可以指定数据存储时的压缩,系统还提供了
DDL 语法,在创建或修改表时,对表中的一列或多列进行数据压缩的定义。方
便用户进行单独设置。
使用列压缩定义后,列压缩定义 > 表级定义压缩 > 系统参数全局定义压缩
方式。也就是说,列压缩拥有最高级别的语法有效性。
用户在配置文件中打开压缩的时候,使用 3-1 压缩(字符型列-数值型列)
时,新建的表将以 3-1 压缩算法存储数据,如果使用本章介绍的语法创建新表
或者 ALTER 原有表,指定使用了 5-5 压缩,那么就会按照 5-5 压缩算法存储数
据,而不会使用 3-1 压缩算法存储数据。
1.6.1 创建压缩列
语法格式: CREATE [TEMPORARY] TABLE [IF NOT EXISTS] [database_name.]table_name (column_definition [ , column_definition], ... [, key_options]) [table_options] column_definition: column_name data_type [NOT NULL | NULL] [DEFAULT default_value] COMPRESS (compress_type)参数说明如下: compress_type:表中数值类型列的压缩方式。具体如下: 0:不使用压缩 1:对数字类型使用深度压缩 5:对数字类型使用轻度压缩 compress_type:表中字符串类型列的压缩方式。具体如下: 0:不使用压缩 3:对字符串类型使用深度压缩 5:对字符串类型使用轻度压缩
1.6.2 修改压缩列
语法格式: ALTER TABLE [IF NOT EXISTS] [database_name.]table_name; ALTER [column] column_name COMPRESS (compress_type); 修改列压缩值的语法不能批更新列压缩值。 compress_type:表中数值类型列的压缩方式。具体如下: 0:不使用压缩 1:对数字类型使用深度压缩 5:对数字类型使用轻度压缩 compress_type:表中字符串类型列的压缩方式。具体如下: 0:不使用压缩。1:忽略,不压缩(目前和 0 效果一样) 3:对字符串类型使用深度压缩 5:对字符串类型使用轻度压缩 修改列的压缩值后,修改后的列数据按照新压缩算法进行存储,修改前的 列压缩值存储方式不变。
1.7 行列混存
1.7.1 行列混存的定义
由于 GBase 8a 是列存储的架构,因此当列数较多,访问的数据记录又非常
离散时,会造成大量的离散 I/O,引起 I/O 性能低下,严重影响执行性能。
GBase 8a 提供行列混存功能,通过冗余行存储可以有效提高 I/O 性能。
行列混存具有以下功能:
支持 SQL 语法,包括建表时定义行存列,对已存在的表创建行存列,删除
行存列;
支持快速创建,并行创建行存列;
减少冗余存储,行存列支持压缩存储;
提升 I/O 性能,行存列可以按更小粒度的 Data Page 读取数据,而不是 DC;
系统会自动判断某场景是否需要使用行存数据;
存储冗余方式灵活,用户可自定义数据存储及冗余方式;
行存列维护,DML 语句自动维护行存列,包括,INSERT、快速 UPDATE、
DELETE、LOAD 等。
建表语法:
CREATE TABLE tablename (column-definitions,
[GROUPED_DEFINITIONS]
);GROUPED_DEFINITION:
GROUPED [grouped_name](column_references)[COMPRESS(num)]
参数说明如下:
GROUPED:关键字,表示定义的是行存列。
grouped_name:表示行存列的名称,可以知道行存列名称。如果不指定名
称,则默认为后面的 column_references 中第一个列的名称,如果该名称重名,
则在名称后面加上“_#”(#为从 2 开始的一个数字)。
column_references:行存列中包含的物理列的集合,各列间以“,”分隔。
COMPRESS(num):为行存列指定压缩方式,取值为 0、3、5 中的一个。
修改表(创建/删除行存列)语法:
ALTER TABLE table_name ADD GROUPED_DEF
ALTER TABLE table_name DROP GROUPED grouped_name
行存列的创建可以在 CREATE TABLE 时指定,也可以使用 ALTER
TABLE...ADD GROUPED 语句。
1.7.2 行列混存的约束
行列混存有以下使用约束: 同一表中不允许创建同名的行存列。 同一字段不允许出现在两个行存列定义中。 除删除行存列语句外,行存列不允许在任何语句中被直接引用。 行存列的定义不允许修改,在确实需要修改的情况下,只能先删除,再根 据新的定义创建。 行存列定义中包含的物理列不允许删除和修改数据类型,但可以修改列名和列在表中的顺序。 行存列只允许使用 0、3、5 压缩方式,使用其它压缩方式会发生错误。 行存列的名字,不能与行存列所创建的表中的索引名名称重名。
二 DML 语句
GBase 8a 支持标准的 DML 语句。
2.1 INSERT
语法格式:
INSERT [INTO] [database_name.]table_name [(col_name,...)]
VALUES ({expr | DEFAULT},...),(...),...
或
INSERT [INTO] [database_name.]table_name [(col_name,...)] SELECT ...
FROM [database_name.]table_name ...
INSERT 将新行插入到一个已存在的表中。INSERT...VALUES 形式的语句
基于明确的值插入记录行。INSERT ... SELECT 形式的语句从另一个或多个表中
选取出值,并将其插入。
参数说明如下:
table_name:是要被插入数据的表。
col_name:指出语句指定的值赋给哪个列。
如果在 INSERT...VALUES 或 INSERT...SELECT 中没有指定 column 列表,那么所有列的值必须在 VALUES()列表中或由 SELECT 提供。如果用户不知道
表的列的次序,可以使用 DESC table_name 来查看。
使用关键词 DEFAULT,明确地把列设置为默认值。这样,编写向所有列
赋值的 INSERT 语句时可以更容易,因为使用 DEFAULT 可以避免编写出不完
整的、未包含全部列值的 VALUES 清单。如果不使用 DEFAULT,用户必须注
明每一个列的名称,与 VALUES 中的每个值对应。
可以使用 DEFAULT(col_name)作为设置列缺省值的一个更通用的形式。
如果 column 列表和 VALUES 列表都为空,INSERT 将创建一个行,它的每
一列都设置为它的默认值。
可以指定一个表达式 expr 来提供列值。例如,插入一个 INT 型的数据表达
式可以写为 INSERT INTO t(a) VALUES(3+5);
2.2 UPDATE
语法格式:
UPDATE [database_name.]table_name
SET col_name1=expr1 [, col_name2=expr2 ...]
[WHERE where_definition]
当更新列的值是一个合法的表达式时,也可以进行正确的更新赋值操作。
首先创建表 t0 和 t2,并插入数据。
gbase> DROP TABLE IF EXISTS t0;
Query OK, 0 rows affectedgbase> CREATE TABLE t0(id int);
Query OK, 0 rows affected
gbase> DROP TABLE IF EXISTS t2;
Query OK, 0 rows affected
gbase> CREATE TABLE t2(id int);
Query OK, 0 rows affected
gbase> INSERT INTO t0(id) VALUES(1),(2),(3),(4),(5),(6),(2),(3),(1);
Query OK, 9 rows affected
Records: 9 Duplicates: 0 Warnings: 0
gbase> INSERT INTO t2(id) VALUES(1),(2),(4);
Query OK, 3 rows affected
Records: 3 Duplicates: 0 Warnings:
2.2.1 快速 UPDATE 模式
快速 UPDATE 模式,即先删除符合更新条件的数据,再在表的末尾插入需
要更新的新数据。
相对于传统的行存储数据库来说,列存储的数据中 UPDATE更新少量行时,
操作效率相对来说是耗时的,因此,GBase 8a 针对此特点,专门设计了快速
UPDATE 模式,用以提高数据更新操作。
快速 UPDATE 模式目前只支持针对表对象的操作。
要使用快速 UPDATE 模式,必须在客户端使用 SET gbase_fast_update =1;
的命令打开快速 UPDATE 模式。更新大批量数据的时候建议使用默认 UPDATE
模式,更新少量数据的时候建议使用快速 UPDATE 模式。
SET gbase_fast_update =0;表示关闭快速 UPDATE 模式。
SET gbase_fast_update =1;表示开启快速 UPDATE 模式。
2.3 DELETE
语法格式:
DELETE FROM [database_name.]table_name [tbl_alias] [WHERE
where_definition]
其中,关键字[FROM]和表别名[tbl_alias]是可选关键字。
当 DELETE 语句中包含别名时,可以省略 FROM 关键字。
2.4 SELECT
语法格式: SELECT [ALL | DISTINCT | DISTINCTROW ] select_expr, ... [FROM table_references [WHERE where_definition] [GROUP BY {col_name | expr | position} , ...] [HAVING where_definition] [ORDER BY {col_name | expr | position} [ASC | DESC] , ...] [LIMIT {[offset,] row_count | row_count OFFSET offset}] [PROCEDURE procedure_name(argument_list)]] [INTO OUTFILE 'file_name' export_options] 在 SELECT 关键字之后可以给出大量的选项,它们会影响到语句的操作。 ALL,DISTINCT 和 DISTINCTROW 选项指定了是否返回重复的行,缺省 为 ALL(所有匹配的行都返回)。DISTINCT 和 DISTINCTROW 是同义的,用 于删除结果集中重复的行。 select_expr:指查询显示的列,可以使用 AS 来为 SELECT 显示的列命名别 名,别名不要和 SELECT 显示的列名重复。 table_references:指定从其中找出行的一个或多个表。它的语法在 JOIN 语法中有描述。 where_definition:含有 WHERE 关键字,其后是查询所要满足的一个或多 个条件的表达式。 [GROUP BY {col_name | expr | position}, ...] [HAVING where_definition] 参 见“4.2.4.1 GROUP BY ...”。 [ORDER BY {col_name | expr | position} [ASC | DESC] , ...] 参见“4.2.4.2 ORDER BY...”。 [LIMIT {[offset,] row_count | row_count OFFSET offset}] 参见“4.2.4.3 LIMIT ...”。 [INTO OUTFILE 'file_name' export_options]
2.4.1 GROUP BY ...
GROUP BY {col_name | expr | position}, ... [HAVING where_definition]
参数说明如下:
col_name:指定分组的数据列,多列之间用“,”分隔。col_name 可以是
SELECT 中使用 AS 定义的别名。
expr:指定分组的表达式,多列之间用“,”分隔。
注意:上面的 col_name 和 expr 中定义的数据列或表达式,可以不是 SELECT
col_name_1,…, col_name_n FROM 之间的数据列,这一点是 GBase 8a 中比较特
殊的语法。
position:在 SELECT col_name_1,..., col_name_n FROM之间的 col_name_1,...,
col_name_n 的序号,position 是整数型数值,从 1 开始。
2.4.2 ORDER BY...
ORDER BY {col_name | expr | position} [ASC | DESC] , ...
参数说明如下:
ORDER BY 用于对结果集进行排序,数据列列名称或者表达式。
col_name:指定排序的数据列,多列之间用“,”分隔。col_name 可以是
SELECT 中使用 AS 定义的别名。
expr:指定排序的表达式,多列之间用“,”分隔。
position:在 SELECT col_name_1,……, col_name_n FROM 之间的
col_name_1,……, col_name_n 的序号,position 是整数型数值,从 1 开始。
2.4.3 LIMIT ...
LIMIT {[offset,] row_count | row_count OFFSET offset}
参数说明如下:
LIMIT row_count:row_count 是一个整数型数值,表示从记录集开始返回
row_count 行结果集。如果 row_count 指定的数值大于 SELECT 后的结果集,那
么 row_count 将不起作用。
LIMIT row_count
等价于
LIMIT 0, row_count
或者等价于
LIMIT row_count OFFSET 0
LIMIT row_count OFFSET offset:row_count 指定返回结果集的行数,offset
指定结果集的偏移量,初偏移量的起始值是 0(而不是 1),即偏移量 0 对应
SELECT 返回的第一行结果集。
下面的语句含义为从 SELECT 结果集的偏移量 5 的位置开始,返回 10 行结
果集。
SELECT * FROM ssbm.customer LIMIT 5,10;
2.5 JOIN
对于 SELECT 语句中的 TABLE_references 部分,GBase SQL 支持下面的
JOIN 语法:
table_reference, table_reference
table_reference [INNER | CROSS | FULL] JOIN table_reference
[join_condition]
table_reference [LEFT | RIGHT [OUTER]] JOIN table_reference
[join_condition]
table_reference 定义为:
[database_name.]table_name [[AS] alias]
join_condition 定义为:
[database_name.]table_name [[AS] alias]
ON 部分是用来在结果集中限定哪些行是需要的,一般不要在这部分附加任
何条件,而是在 WHERE 子句中指定这些条件。这项规定也有例外。
表的引用可以通过[database_name.]table_name AS alias_name 或
[database_name.]table_name alias_name 来赋予一个别名:
gbase> SELECT t1.c_name,t2.lo_orderkey FROM ssbm.customer AS
t1,ssbm.lineorder AS t2 WHERE t1.c_custkey = t2.lo_custkey LIMIT 5;
2.6 UNION
SELECT ...UNION [ALL | DISTINCT]SELECT ...
[UNION [ALL | DISTINCT]
SELECT ...]
UNION 用来将多个 SELECT 语句的结果组合到一个结果集中。
在每个 SELECT 语句对应位置上的选择列,应该有相同的类型。(例如,
第一个语句选出的第一列应该与其它语句选出的第一列的类型相同)。第一个
SELECT 语句中用到的列名称被作为返回结果的列名称。
SELECT 语句是一般的查询语句,但是有以下约束:
1、不同的数据类型,不能使用 UNIO 和 UNION ALL,例如:数值型,字
符型,日期和时间型之间不能使用 UNION 和 UNION ALL,但是 DATETIME
和 TIMESTAMP 类型可以使用 UNION 和 UNION ALL,其它的日期和时间类型
则不行。
2、如果 UNION和 UNION ALL两边的数据类型为 CHAR类型,进行 UNION
和 UNION ALL 操作时,结果返回 VARCHAR 类型。
2.7 INTERSECT
语法格式:
SELECT ...
INTERSECT
SELECT…;
功能:INTERSECT(交运算符),返回每个 SELECT 查询结果中相同的结果
集,也就是将多个查询结果集中的公共部分作为最终返回的结果集。另外交运
算不忽略空值。
2.8 MINUS
语法格式:
SELECT ... MINUS SELECT…;
功能:
MINUS(差运算符)返回结果集为第一个 SELECT 语句的结果集,并且这个
结果集的查询结果所包含的信息不能出现在第二个查询语句结果集中。另外差
运算不忽略空值。
2.9 MERGE
2.9.1 语法格式
语法格式:
MERGE [INTO] [database_name.]table_name
USING table_reference
ON conditional_exp
[WHEN MATCHED THEN UPDATE SET col_name1=expr1 [,
col_name2=expr2] ...
[WHEN NOT MATCHED THEN INSERT [(col_name3,...)] VALUES
(expr3,...)]
2.9.2 MERGE 示例
三 分区表
3.1 CREATE TABLE PARTITION
分区表是根据一定规则,将数据库中的一张表分解成多个更小的容易管理
的部分,从逻辑上看,只有一张表,但底层却是由多个物理分区组成。
分区表包括普通分区表和子分区表。
目前常用的分区方法有 RANGE 分区、LIST 分区、KEY 分区、HASH 分区,
在分区的管理上目前支持创建分区、添加分区、删除分区。
RANGE 分区表和 LIST 分区表支持子分区,子分区的分区类型可以为
[LINEAR] HASH 和[LINEAR] KEY。
information_schema.partitions 中可以查到所创建的分区表信息。
分区表支持分区列类型:
数值型:INT,BIGINT,SMALLINT,FLOAT。
时间类型(作为分区函数的输入值使用):DATE,DATETIME,TIME。
3.1.1 创建 RANGE 分区表
3.1.2 创建 LIST 分区
3.1.3 创建 HASH 分区
3.1.4 创建 KEY 分区
3.2 ALTER TABLE…ADD PARTITION
注意 添加分区时,分区条件不满足规则,报错;
添加分区时,分区名字重复,报错;
添加分区时,分区个数大于 8192,报错;
添加分区时,分区名字不符合命名规范,报错;
添加分区时,若分区为非 RANGE 或 LIST 分区,报错。
3.3 ALTER TABLE…DROP PARTITION
注意 删除分区表分区时,若只有 1 个分区时,报错;
删除分区表分区时,若同时删除所有分区,报错;
删除分区表分区时,若是非 RANGE 或 LIST 分区,报错。
3.4 分区表 DML
UPDATE 操作不支持更新 DISTRIBUTED BY 列的值、自增列的值、分区表中
分区字段的值




