返回首页

gbase数据、南大通用产品文档:GBase8a19:28:

更新日期:2024年09月11日

node (172.168.83.14)
backup begin

间。然后,该语句返回对应于那个城市的邮政编码。
仅在 SELECT 语句的 WHERE 子句中的 UDR 的调用中可声明 SLV。对该
SLV 的引用的作用域包括同一 SELECT 语句的其他部分。然而,下列 SELECT

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1511
语句是无效的,因为 SLV 声明是在 Projection 子句的 projection 列表之中,而
不是在 WHERE 子句中:
-- 无效的 SELECT 语句
SELECT title, contains(body, 'dog and cat', rank # INT), rank
FROM documents;
当您声明 SLV 时,您指定的数据类型必须与 CREATE FUNCTION 语句中对应
的 OUT 或 INOUT 参数的数据类型相同。如果您使用不同的但相兼容的数据类
型,比如 INTEGER 和 FLOAT,则数据库服务器自动地在数据类型之间执行强
制转型。
SLV 与 UDR 变量以及涉及 SQL 语句的表的列名称共享该命名空间。 因此,数据
库使用下列优先顺序的降序来解决下列对象之间的名称冲突:

UDR 变量

列名称

SLV
在 UDF 的调用将 OUT 或 INOUT 参数的值指定到 SLV 之后,您可在同一查
询的其他部分引用该 SLV。要获取更多信息,请参阅 语句本地的变量表达式。
语句本地的变量表达式
“语句本地的变量表达式”指定您可在同一 SELECT 语句中的其他地方使用的语句
本地的变量(SLV)。
语句本地的变量表达式

元素
描述
限制
语法
SLV_variable
在同一查询中的用户定义
的函数的调用中指定的语
句本地的变量(SLV)
SLV_variable 仅在查询
执行期间存在。在该查询
中它的名称必须是唯一的
标识符
请您在 SELECT 语句的 WHERE 子句中对用户定义的函数的调用中定义 SLV。
必须以一个或多个 OUT 或 INOUT 参数来定义用户定义的函数。对用户定义的

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1512
函数的调用将 OUT 或 INOUT 参数的值指定到 SLV。要获取更多信息,请参阅
语句本地的变量声明。
一旦用户定义的函数将它的 OUT 或 INOUT 参数指定到 SLV,您可在同一 SELECT
语句的其他部分中使用这些值,服从下列引用的作用域规则:

在定义 SLV 的查询(或子查询)中该 SLV 是只读的。

SLV 的作用域从定义该 SLV 的查询向下扩展至所有嵌套的子查询内。

在嵌套的查询中,SLV 的作用域不向上扩展。
换句话说,如果查询包含一个或多个子查询,则在该查询中定义的 SLV
对于那个查询的所有子查询也是可见的。 但如果在子查询中定义 SLV,
则它对于父查询是不可见的。

在包括 UNION 运算符的查询中,该 SLV 仅在定义它的查询中是可见
的。
该 SLV 对于在 UNION 中指定的任何其他查询都不是可见的。

对于 INSERT、DELETE 和 UPDATE 语句,在该语句的 SELECT 部分
之外,SLV 不是可见的。
在 DML 语句的此 SELECT 部分中,上述作用域规则都适用。
重要: 仅对于在单个 SQL 语句期间,语句本地的变量在作用域中。
下列 SELECT 语句调用 WHERE 子句中的 find_location( ) 函数,并定义
rank SLV。在此,find_location( ) 接受表示纬度和经度的两个值,并返回最近
的城市的名称,带有表示该城市人口等级的 INTEGER 类型的额外的值。
SELECT zip_code_t FROM address
WHERE address.city = find_location(32.1, 35.7, rank # INT)
AND rank < 101;
当成功地完成 find_location() 函数的执行时,该函数已初始化了 rank SLV。
然后,SELECT 在第二个 WHERE 子句条件中使用此 rank 值。在此示例中,
“语句本地的变量表达式”是第二个 WHERE 子句条件中的变量 rank:
rank < 101
一个 UDF 可有的 OUT 和 INOUT 城市以及 SLV 的数目不受限制。(早于
Version 9.4 的 GBase 8s 产品将用户定义的函数限制为单个 OUT 参数且没有
INOUT 参数,因此限定 SLV 的数目不超过一个。)

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1513
如果在一个语句的迭代中未执行初始化该 SLV 的用户定义的函数,则每一 SLV
有一 NULL 值。跨语句的迭代中,不保持 SLV 的值。在每一迭代的开始时刻,
数据库服务器将该 SLV 值设置为 NULL。
下列部分语句调用两个带有 OUT 参数的用户定义的函数,以 SLV 名称 out1 和
out2 引用其值:
SELECT...
WHERE func_2(x, out1 # INTEGER) < 100
AND (out1 = 12 OR out1 = 13)
AND func_3(a, out2 # FLOAT) = "SAN FRANCISCO"
AND out2 = 3.1416;
如果函数将来自本地数据库服务器的另一数据库的一个或多个 OUT 或 INOUT
参数值指定到 SLV,则这些值必须为内建的数据类型,或其基础类型为内建的数
据类型(以及您显式地强制转型为内建的数据类型)的 DISTINCT 数据类型,或
必须为您显式地强制转型为内建的数据类型的的 opaque UDT。在所有的参与数据
库中,所有 opaque UDT、DISTINCT 类型、类型层级和强制转型的定义都必须完
全相同。
要获取关于如何编写带有 OUT 或 INOUT 参数的用户定义的函数的信息,请参
阅 GBase 8s 用户定义的例程和数据类型开发者指南 。
聚集表达式
聚集表达式使用聚集函数来汇总选择的数据库数据。内建的聚集函数有下列语
法:
聚集表达式

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1514

聚集作用域限定符

元素
描述
限制
语法
column
要应用聚集函数的列
请参阅后面页上的单
个关键字的标题
标识符
alias、
synonym、
table、
view
包含 column 的同义
词、表、视图或别名
同义词 以及它指向
的表或视图必须存在
标识符
您不可在作为 WHERE 子句的一部分的条件中使用聚集表达式,除非您在子查询
内使用该聚集表达式。您不可将聚集函数应用于 BYTE 或 TEXT 列。要了解其
他一般的限制,请参阅 聚集表达式中有效的表达式的子集。
聚集函数为一组查询到的行返回一个值。下列示例展示 SELECT 语句中的聚集函
数:
SELECT SUM(total_price) FROM items WHERE order_num = 1013;
SELECT COUNT(*) FROM orders WHERE order_num = 1001;

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1515
SELECT MAX(LENGTH(fname) + LENGTH(lname)) FROM customer;
如果您使用聚集函数以及 Projection 子句的 projection 列表中的一个或多个列,
则您必须包括所有列名称,不将这些用作 GROUP BY 子句中的聚集或时间表达
式的一部分。
聚集表达式的类型
SQL 语句可包括内建的聚集和用户定义的聚集。内建的聚集包括在 聚集表达式
中的语法图中展示的除了“用户定义的聚集”类别之外的所有聚集。用户定义的聚
集是用户以 CREATE AGGREGATE 语句创建的任何新的聚集。
内建的聚集
内建的聚集是由数据库服务器定义的聚集函数,比如 AVG、SUM 和 COUNT。
这些聚集仅与诸如 INTEGER 和 FLOAT 这样的内建的数据类型一起工作。您可
将这些内建的聚集扩展到与扩展的数据类型工作。要扩展内建的聚集,您必须创
建重置若干二目运算符的 UDR。
在仅重置内建的聚集的二目运算符之后,您可在 SQL 语句中随同扩展的数据类型
使用那个聚集。例如,如果您已重载了 SUM 聚集的 plus 运算符来与指定的行类
型工作,并将此行类型指定到 complex_tab 表的 complex 列,则您可将 SUM 聚
集应用到 complex 列:
SELECT SUM(complex) FROM complex_tab;
要获取更多关于如何扩展内建的聚集的信息,请参阅 GBase 8s 用户定义的例程
和数据类型开发者指南 。要获取关于如何调用内建的聚集的信息,请参阅下面页
中个别内建的聚集的描述。
用户定义的聚集
用户定义的聚集是您定义的来执行数据库服务器不提供的聚集计算的聚集。例
如,您可创建名为 SUMSQ 的用户定义的聚集,返回指定列的平方值的合计。用
户定义的聚集可与内建的数据类型或扩展的数据类型或两者一起工作,这依赖于
您如何为用户定义的聚集定义支持函数。
要创建用户定义的聚集,请使用 CREATE AGGREGATE 语句。在此语句中,您命名
新的聚集并为该聚集指定支持函数。一旦您创建了新的聚集及其支持函数,则可
在 SQL 语句中使用该聚集。例如,如果您创建了 SUMSQ 聚集并指定了它与

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1516
FLOAT 数据类型一起工作,则您可将 SUMSQ 聚集应用于 test 表中名为 digits
的 FLOAT 列:
SELECT SUMSQ(digits) FROM test;
要获取更多关于如何创建用户定义的聚集的信息,请参阅 CREATE AGGREGATE
语句 以及 GBase 8s 用户定义的例程和数据类型开发者指南 中对用户定义的聚
集的讨论。要获取如何调用用户定义的聚集的信息,请参阅 用户定义的聚集。
聚集表达式中有效的表达式的子集
如在 聚集表达式 和 用户定义的聚集 的图中指明的那样,当您使用聚集表达式
时,不是所有表达式都可用。例如,聚集函数的参数自身不可包含聚集函数。在
下列上下文中,您不可使用聚集函数:

在 WHERE 子句中,但有这两个例外:
o
除非在 WHERE 子句内的子查询的 Projection 子句中指定该聚
集,
o
或除非该查询在来自父查询的相关列上,且 WHERE 子句在
HAVING 子句内的子查询中。

作为聚集函数的一个参数。
下列嵌套的聚集表达式不是有效的:
MAX (AVG (order_num))

在任何下列数据类型的列上:
o
大对象(BLOB、BYTE、CLOB、TEXT)
o
集合数据类型(LIST、MULTISET、SET)
o
ROW 数据类型(命名的或未命名的)
o
OPAQUE 数据类型(除了支持 opaque 类型的用户定义的聚集函
数)。
您不可使用集合数据类型的列作为下列聚集函数的参数:

AVG

SUM

MIN

MAX

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1517
内建的聚集的表达式或 column 参数(除了 COUNT、MAX、MIN 和 RANGE
之外)必须返回数值或 INTERVAL 数据类型,但 RANGE 也接受 DATE 和
DATETIME 参数。
对于 SUM 和 AVG,您不可直接地使用两个 DATE 值之间的差异作为聚集的参数,
但您可使用 DATE 差异作为算术表达式参数内的运算对象。例如:
SELECT . . . AVG(ship_date - order_date);
返回错误 -1201,但下列等同的表达式是有效的:
SELECT . . . AVG((ship_date - order_date)*1);
下列查询片段使用有效的语法来为两个列表达式声明别名:
SELECT . . .
SUM(orders.ship_charge) as o2,
COUNT(DISTINCT
CASE WHEN orders.backlog MATCHES 'n'
THEN orders.order_num END ) AS o3,
. . .
在此,SUM 的参数是 MONEY(6) 列值,且 COUNT DISTINCT 聚集采用 CASE 表
达式作为它的参数。
包括或排除结果集中的重复值
您可使用 ALL、DISTINCT 或 UNIQUE 关键字来限定聚集函数的作用域。
如果您包括聚集作用域限定符,则它必须为参数列表中的第一项。
ALL 关键字指定在计算中使用从列或表达式选择的所有值,包括任何重复的值。
由于 ALL 是聚集函数的缺省的作用域,因此下列两个聚集表达式是等同的,且它
们的返回值基于 ship_weight 列中所有符合条件的行的值:
AVG(ship_weight)
AVG(ALL ship_weight)
包括 DISTINCT 关键字作为聚集函数的第一个参数将它的后续的参数限定到来自
指定的列的唯一值。在此上下文中,UNIQUE 与 DISTINCT 关键字是同义词。
下列两个聚集表达式是等同的,且他们的返回值基于 ship_weight 列的符合条件
的行中唯一值的集合:
AVG(DISTINCT ship_weight)

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1518
AVG(UNIQUE ship_weight)
如果几个符合条件的行有相同的 ship_weight 值,则在计算该聚集的值中仅包括
那个值的一个实例。
如果查询包括 Projection 子句中的 DISTINCT 或 UNIQUE 关键字(而不是
ALL 关键字或没有关键字),其 Select 列表还包括其参数列表以 DISTINCT 或
UNIQUE 关键字开头的聚集函数,则数据库服务器发出错误,如在下列示例中所
示:
SELECT DISTINCT AVG(DISTINCT ship_weight)
FROM orders;
也就是说,在 Projection 子句和聚集函数的同一查询中,要将结果集限制到唯一
的值是无效的。
然而,如果 Projection 子句为指定 SELECT 语句的 DISTINCT 或 UNIQUE 关
键字,则该查询可包括一个或多个聚集函数,每一函数包括 DISTINCT 或
UNIQUE 关键字作为参数列表中的第一个规范,如在下列示例中所示:
SELECT AVG(UNIQUE ship_weight), COUNT (DISTINCT customer_num)
FROM orders;
AVG 函数
AVG 函数返回指定的列或表达式中所有值的平均值。
您仅可对数值列应用 AVG 函数。下列示例中的查询找到头盔的平均价格:
SELECT AVG(unit_price) FROM stock WHERE stock_num = 110;
通过将 unit_price 值的总和除以符合条件的行的基数来计算返回值。
如果您使用 DISTINCT 或 UNIQUE 关键字作为第一个参数,则仅从指定的列或表
达式中 distinct 值计算平均值(表示平均)。在下列示例中,当计算总和和基
数时,仅包括任何重复的值的一个实例:
SELECT AVG(DISTINCT unit_price) FROM stock WHERE stock_num = 110;
如果该数据集不包括重复的值,则上述两个示例都返回同样的 AVG 值。
忽略 NULL 值,除非该列或表达式中的每个值都是 NULL。如果每个值都是
NULL,则 AVG 函数为那个列或表达式返回 NULL。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1519
COUNT 函数概述
COUNT 函数实际是使得您能够根据 COUNT 关键字之后的参数,以不同的方式
对列值进行计数的一组函数。
在下列小节中,说明 COUNT 函数的每一形式。要了解 COUNT 函数的不同形
式的对比,请参阅 COUNT 函数的参数。
COUNT(*) 函数
COUNT (*) 函数返回满足 SELECT 语句的 WHERE 子句的行数。
下列示例找到在 stock 表中有多少行在 manu_code 列中有值 HRO:
SELECT COUNT(*) FROM stock WHERE manu_code = 'HRO';
下列示例查询“系统监视接口”(SMI)表之一来找到 customer 表中 extent 的数
目:
SELECT COUNT(*) FROM sysextents WHERE dbs_name = 'stores' AND
tabname = customer";
您可使用 COUNT(*) 作为此一般格式的查询中的 Projection 子句来从 SMI 表获
取信息。要了解关于 sysextents 和其他 SMI 表的信息,请参阅描述
sysmaster 数据库的 GBase 8s 管理员参考手册 章节。
如果 SELECT 语句没有 WHERE 子句,则 COUNT (*) 函数返回该表中行的总
数。下列示例找到在 stock 表中有多少行:
SELECT COUNT(*) FROM stock;
如果 SELECT 语句包含 GROUP BY 子句,则 COUNT (*) 函数反映在每一组中
值的数目。下列示例按第一个名称分组;如果数据库服务器发现同一名称多次出
现,则选择这些行:
SELECT fname, COUNT(*) FROM customer GROUP BY fname
HAVING COUNT(*) > 1;
如果一行或多行的值为 NULL,则 COUNT (*) 函数在计数中包括 NULL 列,
除非 WHERE 子句显式地省略它们。
COUNT DISTINCT 和 COUNT UNIQUE 函数
COUNT DISTINCT 和 COUNT UNIQUE 函数返回唯一的值。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1520
COUNT DISTINCT 函数返回列或表达式中唯一值的数目,如下例所示。
SELECT COUNT (DISTINCT item_num) FROM items;
如果 COUNT DISTINCT 函数遇到 NULL 值,则它忽略它们,除非指定的列中
的每个值都是 NULL。如果每个列值都是 NULL,则 COUNT DISTINCT 函数
返回零(0)。
UNIQUE 关键字与 COUNT 函数中的 DISTINCT 关键字有相同的含义。UNIQUE 关键
字指导数据库服务器返回列或表达式中唯一的非 NULL 值的数目。下列示例调用
COUNT UNIQUE 函数,但它等同于调用 COUNT DISTINCT 函数的前一示例:
SELECT COUNT (UNIQUE item_num) FROM items;
如果 Projection 子句未指定 SELECT 语句的 DISTINCT 或 UNIQUE 关键字,
则该查询可包括多个 COUNT 函数,每一函数包括 DISTINCT 或 UNIQUE 关
键字作为参数列表中的第一个规范,如下例所示:
SELECT COUNT (UNIQUE item_num), COUNT (DISTINCT order_num) FROM
items;
COUNT 列函数
COUNT 列函数返回列或表达式中非 NULL 值的总数目,如下例所示:
SELECT COUNT (item_num) FROM items;
为清楚起见,可将 ALL 关键字置于指定的列名称前面,但不论您包括 ALL 关
键字还是省略它,查询结果都一样。
下列示例展示如何在 COUNT 列函数中包括 ALL 关键字:
SELECT COUNT (ALL item_num) FROM items;
COUNT 函数的参数
COUNT 函数接受其他内建的聚集函数的参数列表中允许的相同的表达式作为它
的参数,以及仅 COUNT 支持的星号(*)表示法。支持下列内建的表达式的类
别作为 COUNT 的参数,如下列示例所示:

算术表达式
COUNT(times(gbasedbt.sysfragments.evalpos,2))
SELECT COUNT(a+1), COUNT(2*a), COUNT(5/a), COUNT(times(a, 2))
FROM myTable;

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1521

位逻辑函数
COUNT(BITAND(gbasedbt.systables.flags,1))
SELECT COUNT(BITAND(a,1)), COUNT(BITOR(8, 20)),
COUNT(BITXOR(41, 33)),
COUNT(BITANDNOT(20,-20)), COUNT(BITNOT(8)) FROM myTable;

强制转型表达式
COUNT(NULL::int)

条件表达式
COUNT(CASE WHEN stock.description = "baseball gloves" THEN 1
ELSE NULL END)
SELECT COUNT(CASE WHEN s=14 THEN 1 ELSE NULL END) AS
cnt14 FROM all_types;
SELECT COUNT(NVL (ch, 'Addr unk')) FROM all_types;
SELECT COUNT(NULLIF(ch, NULL)) FROM all_types;

常量表达式
COUNT(CURRENT_ROLE)
COUNT(DATETIME (2007-12-6) YEAR TO DAY)
SELECT COUNT("XX"), COUNT(99),COUNT("t") FROM
sysmaster:sysdual;
SELECT COUNT(SET{6, 9, 9, 4}) FROM sysmaster:sysdual;
SELECT COUNT("ROW(7, 3, 6.0, 2.0)") FROM sysmaster:sysdual;
SELECT COUNT(USER), COUNT(CURRENT), COUNT(SYSDATE)
from sysmaster:sysdual;
SELECT COUNT(CURRENT_ROLE), COUNT(DEFAULT_ROLE) from
sysmaster:sysdual;
SELECT COUNT(DBSERVERNAME), COUNT(TODAY),
COUNT(CURRENT) from sysmaster:sysdual;
SELECT COUNT(DATETIME (2007-12-6) YEAR TO DAY) from
sysmaster:sysdual;
SELECT COUNT(INTERVAL (16) DAY TO DAY) FROM
sysmaster:sysdual;
SELECT COUNT(5 UNITS DAY) FROM sysmaster:sysdual;

函数表达式

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1522
COUNT(LENGTH ('abc') + LENGTH (stock.description}
COUNT(DBINFO('sessionid'))
COUNT(user_proc()) --> proc() 是用户定义例程列表达式
COUNT(gbasedbt.sysfragauth.fragment)
您还可使用星号(*)字符,或列名称,或带有 ALL、DISTINCT 或 UNIQUE
聚集作用域限定符的列名称作为 COUNT 函数的参数,来检索关于表的不同类型的
信息。下面的表格总结带有星号或列名称参数的 COUNT 函数的每一下列形式的含
义。
COUNT 函数
描述
COUNT (*)
返回满足查询的行的数目。如果您未指定 WHERE 子
句,此函数返回表中行的总数目。
COUNT (DISTINCT)
或 COUNT (UNIQUE)
返回指定的类中唯一的非 NULL 值的数目
COUNT (column) 或
COUNT (ALL column)
返回指定的列中非 NULL 值的总数目
有些示例可帮助展示引用一列的不同形式的 COUNT 函数之间的差异。大部分下
列示例查询对应的是 stores_demo 演示数据库中 orders 表的 ship_instruct 列。
要获取关于 orders 表的模式以及 ship_instruct 列中的数据值的信息,请参阅
GBase 8s SQL 参考指南 中对演示数据库的描述。
COUNT(*) 函数的示例
在下列示例中,用户想要知道 orders 表中行的总数目。于是,用户在不带有
WHERE 子句的 SELECT 语句中调用 COUNT(*) 函数:
SELECT COUNT(*) AS total_rows FROM orders;
下列表格展示此查询的结果。
total_rows
23

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1523
在下列示例中,用户想要知道在 orders 表中有多少行在 ship_instruct 列中有
NULL 值。用户在带有 WHERE 子句的 SELECT 语句中调用 COUNT(*) 函数,
并在 WHERE 子句中指定 IS NULL 条件:
SELECT COUNT (*) AS no_ship_instruct FROM orders
WHERE ship_instruct IS NULL;
下列表格展示此查询的结果。
no_ship_instruct
2
在下列示例中,用户想要知道在 orders 表中有多少行在 ship_instruct 列中有
值 express。 于是,用户在 projection 列表中调用 COUNT(*) 函数,并在
WHERE 子句中指定等于(=)关系运算符。
SELECT COUNT (*) AS ship_express FROM ORDERS
WHERE ship_instruct = 'express';
下列表格展示此查询的结果。
ship_express
6
COUNT DISTINCT 函数的示例
在下一示例中,用户想要知道在 orders 表的 ship_instruct 列中有多少个唯一
的非 NULL 值。用户在 SELECT 语句的 projection 列表中调用 COUNT
DISTINCT 函数:
SELECT COUNT(DISTINCT ship_instruct) AS unique_notnulls
FROM orders;
下列表格展示此查询的结果。
unique_notnulls
16
COUNT column 函数的示例

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1524
在下列示例中,用户想要知道在 orders 表的 ship_instruct 列中有多少非
NULL 值。该用户在 SELECT 语句的 Projection 列表中调用 COUNT(column) 函
数:
SELECT COUNT(ship_instruct) AS total_notnulls FROM orders;
下列表格展示此查询的结果。
total_notnulls
21
对于 ship_instruct 列中非 NULL 值的一个类似的查询可在跟在 COUNT 关键
字之后的圆括号中包括 ALL 关键字:
SELECT COUNT(ALL ship_instruct) AS all_notnulls FROM orders;
下列表格展示该查询结果,不论您包括还是省略 ALL 关键字(因为缺省值为
ALL),查询结果都一样。
all_notnulls
21
MAX 函数
MAX 函数返回指定的列或表达式中的最大值。
使用 DISTINCT 关键字不会更改结果。在下列示例中的查询找到在库的但已被订
购的最贵的项:
SELECT MAX(unit_price) FROM stock
WHERE NOT EXISTS (SELECT * FROM items
WHERE stock.stock_num = items.stock_num AND
stock.manu_code = items.manu_code);
忽略 NULL,除非该列中的每个值都是 NULL。如果每个列值都是 NULL,则
MAX 函数为那个列返回 NULL。
MIN 函数
MIN 函数返回列或表达式中的最低值。使用 DISTINCT 关键字不会更改结果。下
列示例找到 stock 表中最廉价的项:

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1525
SELECT MIN(unit_price) FROM stock;
忽略 NULL 值,除非该列中的每个值都是 NULL。如果每个列值都是 NULL。
则 MIN 函数为那列返回 NULL。
SUM 函数
SUM 返回指定的列或表达式中所有值的总和,如下例所示:
SELECT SUM(total_price) FROM items WHERE order_num = 1013;
如果您包括 DISTINCT 或 UNIQUE 关键字,则返回的值仅对于该列或表达式中的
distinct 值:
SELECT SUM(DISTINCT total_price) FROM items WHERE order_num = 1013;
忽略 NULL 值,除非该列中的每个值都是 NULL。如果每个列值都是 NULL,
则 SUM 为那列返回 NULL。您不可使用带有非数值列的 SUM 函数。
RANGE 函数
RANGE 函数返回数值列表达式参数的值的范围。
它计算最大值与最小值之间的差异,如下所示:
range(expr) = max(expr) - min(expr);
您仅可对数值列应用 RANGE 函数。下列查询找到人口的年龄范围:
SELECT RANGE(age) FROM u_pop;
与其他聚集一样,当查询包括 GROUP BY 子句时,RANGE 函数应用于组中的
行,如下列示例所示:
SELECT RANGE(age) FROM u_pop GROUP BY birth;
由于将 DATE 值在内部存储为整数,因此,您可对 DATE 列使用 RANGE 函
数。对于 DATE 列,返回值是该列中最早日期与最晚日期之间的天数。
忽略 NULL 值,除非列中的每个值都是 NULL。如果每个列值都是 NULL,则
RANGE 函数为那列返回 NULL。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1526
重要: 以 32 位数字精度执行 RANGE 函数的所有计算,对于许多输入数据集,
这都应足够。然而,当所有输入数据值都有 16 位数字或更高的精度时,该计算
会丢失精度或返回不正确的结果。
STDEV 函数
STDEV 函数计算数据集的标准差,这是 VARIANCE 函数的平方根。您仅可对数值
列应用 STDEV 函数。下一查询找到标准差:
SELECT STDEV(age) FROM u_pop WHERE u_pop.age > 0;
同其他聚集一样,当查询包括 GROUP BY 子句时,对组的行应用 STDEV 函数,
如下例所示:
SELECT STDEV(age) FROM u_pop GROUP BY birth WHERE STDEV(age) >
0;
忽略 NULL 值,除非指定的列中的每个值都是 NULL。如果每个列值都是 NULL,
则 STDEV 为那列返回 NULL。
Important: 以 32 位数字精度执行 STDEV 函数的所有计算,对于许多输入数据
集,这应足够。然而,如果所有输入数据值都有 16 位数字或更高的精度,则该
计算会丢失精度或返回不准确的结果。
您不可在 DATE 类型的列上使用此函数。
在带有 GOURP BY 子句的 SELECT 语句内,对于计数 1,STDEV 返回零。您
可通过适当的查询构造(例如,"HAVING COUNT(*) > 1")省略此特殊情况。
否则,仅有少量实例的数据集可能阻塞剩余的查询结果。
VARIANCE 函数
VARIANCE 函数返回总体方差的估计值,即标准差的平方。
VARIANCE 计算下列值:
(SUM(Xi2) - (SUM(Xi)2)/N)/(N - 1)
在此公式中,

Xi 是该列中的每一值,

N 是该列中非 NULL 值的总数目(除非所有值都是 NULL,在此情况
下,逻辑上未定义方差,且 VARIANCE 函数返回 NULL)。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1527
您仅可对数值列应用 VARIANCE 函数。
下列查询估算人口的 age 值的方差:
SELECT VARIANCE(age) FROM u_pop WHERE u_pop.age > 0;
同其他聚集一样,当查询包括 GROUP BY 子句时,对组的行应用 VARIANCE 函
数,如此例所示:
SELECT VARIANCE(age) FROM u_pop GROUP BY birth
WHERE VARIANCE(age) > 0;
如前面指出的那样,VARIANCE 忽略 NULL 值,除非对于指定的列每个限定的
行都是 NULL。如果每个值都是 NULL,则 VARIANCE 为那列返回 NULL 结
果。(这通常表示丢失数据,且不可避免地不是潜在的总体方差的一个好的估
计。)
如果限定的非 NULL 列值的总数目 N 等于 1,则 VARIANCE 函数返回零(真实总
体方差的另一不可信的估算)。要忽略此特殊情况,您可修改查询。例如,您可
以包括 HAVING COUNT(*) > 1 子句。
重要: 以 32 位数字精度执行 VARIANCE 函数的所有计算,对于许多输入数据
集,这应足够了。然而,当所有输入数据值都有 16 位数字或更高的精度时,该
计算会丢失精度或返回不正确的结果。
虽然在内部将 DATE 数据存储为整数,但您不可在 DATE 数据类型的列上使用
VARIANCE 函数。
ESQL/C 中的错误检查
聚集函数往往就返回一行。如果未选择行,则函数返回 NULL。您可使用
COUNT (*) 函数来确定是否选择了任何行,且您可使用指示符变量来确定是否某
些选择了的行为空。以与聚集函数相关联的游标取回行,往往返回一行;因此,
对于首次 FETCH 尝试,表示数据结束的 100 从不会返回到 sqlcode 变量内。
您还可使用 GET DIAGNOSTICS 语句进行错误检查。
聚集函数行为的总结
一个示例可帮助总结聚集函数的行为。假设 testtable 有单个名为 num 的
INTEGER 列。此表的内容如下。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1528
num
2
2
2
3
3
4
(NULL)
您可使用聚集函数来获取关于 num 列和 testtable 表的信息。下列查询使用
AVG 函数来获取 num 列中所有非 NULL 值的平均值:
SELECT AVG(num) AS average_number FROM testtable;
下列表格展示此查询的结果。
average_number

命令导入数据。
各库公共全局对象导出。

仅导出表空间信息。

仅导出角色信息。

导出角色与表空间。
gs_dump 和gs_dumpall 通过-U 指定执行导出的用户帐户。如果当前使用的帐户不具备
导出所要求的权限时,会无法导出数据。此时,可在导出命令中设置--role 参数来指定具备
权限的角色。在执行命令后,gs_dump 和gs_dumpall 会使用--role 参数指定的角色,完成导
出动作。可使用该功能的场景请参见表15-10-1,详细操作请参见10.1.4 无权限角色导出数
据。
gs_dump 和gs_dumpall 通过对导出的数据文件加密,导入时对加密的数据文件进行解
密,可以防止数据信息泄露,为数据库的安全提供保证。注意,使用gs_dump 加密的纯文
本格式文件,如果导出的数据库中包含存储过程,不支持使用gsql 命令恢复文件,请使用
另外三种模式导出数据库,并使用gs_restore 恢复。

GBase 8c V5 开发者手册
南大通用数据技术股份有限公司
338
gs_dump 和gs_dumpall 工具在进行数据导出时,其他用户可以访问数据库(读或写)。
gs_dump 和gs_dumpall 工具支持导出完整一致的数据。例如,T1 时刻启动gs_dump 导
出A 数据库,或者启动gs_dumpall 导出GBase 8c 数据库,那么导出数据结果将会是T1 时
刻A 数据库或者该GBase 8c 数据库的数据状态,T1 时刻之后对A 数据库或GBase 8c 数据
库的修改不会被导出。
注意事项

禁止修改导出的文件和内容,否则可能无法恢复成功。

如果数据库中包含的对象数量(数据表、视图、索引)在50 万以上,为了提高性能且
避免出现内存问题,建议通过gs_guc 工具设置数据库节点的如下参数(如果参数值大
于如下建议值,则无需设置)。例如:
gs_guc set -Z coordinator -N all -I all -c 'max_prepared_transactions = 1000'
gs_guc set -Z coordinator -N all -I all -c 'max_locks_per_transaction = 512'

为了保证数据一致性和完整性,
导出工具会对需要转储的表设置共享锁。
如果表在别的
事务中设置了共享锁,gs_dump 和gs_dumpall 会等待锁释放后锁定表。如果无法在指
定时间内锁定某个表,转储会失败。用户可以通过指定--lock-wait- timeout 选项,自定
义等待锁超时时间。

由于gs_dumpall 读取所有数据库中的表,因此必须以GBase 8c 管理员身份进行连接,
才能导出完整文件。在使用gsql 执行脚本文件导入时,同样需要管理员权限,以便添
加用户和组,以及创建数据库。