南大通用GBase8s 常用SQL语句(200)

使用 FIRST 选项
FIRST max 选项指定结果集包括不多于 max 行(或正好 max,如果 max 不大于符合条件的行的数目的话)。 不返回满足选择条件的任何附加的行。下例最多从表 tab1 检索 10 行:
SELECT FIRST 10 a, b FROM tab1;
GBase 8s 可使用主变量或在本地变量中指定 max 的 SPL 输入参数的值。
随同 ORDER BY 子句,您可检索符合条件的行的前 max 行。例如,下列查询找到薪酬最高的 10 名雇员:
SELECT FIRST 10 name, salary FROM emp ORDER BY salary DESC;
您可使用在查询中的 FIRST 选项,该查询的结果集在另一 SELECT 语句的 FROM 子句之内定义集合派生的表(CDT)。下列查询指定有不多于 10 行的 CDR:
SELECT *
FROM TABLE(MULTISET(SELECT FIRST 10 * FROM employees
ORDER BY employee_id)) vt(x,y), tab2
WHERE tab2.id = vt.x;
在 FROM 子句中包括表表达式的查询中,FIRST 和 SKIP 关键字还有效:
SELECT * FROM (SELECT SKIP 2 FIRST 8 col1 FROM tab1 WHERE col1 > 50 );
下一示例将 FIRST 选项用于 UNION 表达式的结果:
SELECT FIRST 10 a, b FROM tab1 UNION SELECT a, b FROM tab2;
在任何下列上下文中,FIRST 选项都无效:
在视图的定义中
在嵌套的 SELECT 语句中
在子查询中,除了在 FROM 子句中指定表表达式的那些子查询之外
在 SPL 例程之内的单 SELECT 中(此处 max = 1)
将嵌套的 SELECT 语句用作表达式的情况下
LIMIT 关键字
LIMIT 是在 Projection 子句中 FIRST 关键字的关键字同义词。然而,您不可在 FIRST 为有效的其他语法上下文中以 LIMIT 替换 FIRST,比如在 FETCH 语句中。
使用 TOP 选项
TOP选项支持以下两种方式:
TOP N :指定取得结果集中前 N 条记录。
TOP M,N :指定取得结果集中第 M 条记录之后的 N 条记录。
您可检索前 N 个符合条件的行。例如,下列查询将找到薪酬最高的 10 名雇员:
SELECT TOP 10 name, salary FROM employee ORDER BY salary DESC;
下列查询将找到薪酬第二高的雇员:
SELECT TOP 1,1 name, salary FROM employee ORDER BY salary DESC;
使用 SKIP、FIRST、TOP、LIMIT 或 MIDDLE 作为列名称
如果没有整数紧跟在 FIRST 关键字之后,则数据库服务器将 FIRST 解释为列标识符。例如,如果表 T 有列 first、second 和 third,则下列查询会从名为 first 的列返回数据:
SELECT first FROM T
同样的考虑也适用于TOP、SKIP 和 LIMIT 关键字。如果 Projection 子句中的 LIMIT 关键字之后没有字面整数也没有整数变量,则 GBase 8s 将 LIMIT 解释作为列名称。如果 FROM 子句中的数据源不具有带有该名称的列,则查询失败并报错。
使用带有 FIRST 选项(或 TOP 选项)的 SKIP 选项
如果带有 SKIP offset 选项的 Projection 子句还包括 FIRST 、TOP或 LIMIT,则结果集将以符合条件的行集合中顺序位置为(offset + 1)的行开始,而不是以第一行开始。除非符合条件的行少于(offset + max),否则位置(offset + max)上的行是结果集中的最后一行,。下列示例忽略了表 tab1 的前50 行,但返回最多 10 行的结果集,以第 51 行开始:
SELECT SKIP 50 FIRST 10 a, b FROM tab1;
下一示例在查询中使用 SKIP 和 FIRST来将不多于 5 行从表 tab1 插入到表 tab2 内,以第 11 行开始:
INSERT INTO tab2 SELECT SKIP 10 FIRST 5 * FROM tab1;
也可以使用 TOP 关键字代替 FIRST 关键字,以下示例的效果等同于上一示例:
INSERT INTO tab2 SELECT SKIP 10 TOP 5 * FROM tab1;
下列集合子查询仅返回第 11 至第 15 之间的符合条件的行作为集合派生的表,通过列 a 中的值排列这 5 行的顺序,并将此结果集存储在临时表中。
SELECT * FROM TABLE (MULTISET
(SELECT SKIP 10 FIRST 5 a FROM tab3
ORDER BY a)) INTO TEMP;
下列 INSERT 语句包含一个集合子查询,该集合子查询的结果将定义集合派生表。这些行按列 a 中的值排列顺序,并将插入到表 tab1 内。
INSERT INTO tab1 (a)
SELECT * FROM TABLE (MULTISET (SELECT SKIP 10 FIRST 5 a
FROM tab3 ORDER BY a));
将 FIRST 或 LIMIT 或 TOP 和 SKIP 选项与 ORDER 子句结合在一起的查询可对符合条件的行强加唯一顺序,因此按 max 的值增大 offset 值的连续查询可将符合条件的行划分为max 行的不相连子集。这可支持需要固定页面大小的 web 应用程序,而无需游标管理。
仅当所有参与的数据库服务器都支持 SKIP 和 FIRST 选项(或 TOP 选项),您才可在分布式查询中使用这些特性。
允许重复
您可应用 ALL、UNIQUE 或 DISTINCT 关键字来指示是否返回重复的值,如果存在的话。如果您在 Projection 子句中未指定任何这些关键字,则在缺省情况下返回所有符合条件的行。
关键字 作用
ALL 指定返回所有符合条件的行,不论是否存在重复。(这是缺省的规范。)
DISTINCT 从结果集排除重复的符合条件的行
UNIQUE 排除重复。(此处 UNIQUE 是 DISTINCT 的同义词。这是对 ANSI/ISO 标准的扩展。)
例如,下一查询返回从 items 的行中的 stock_num 和 manu_code 列的所有唯一的有顺序的值对。如果几行有相同的值对,则那个值对仅在结果集中显示一次:
SELECT DISTINCT stock_num, manu_code FROM items;
要获得数据库服务器如何标识在有 NLCASE INSENSITIVE 属性的数据库中重复的 NCHAR 和 NVARCHAR 值的信息,请参阅 在区分大小写的数据库中的 NCHAR 和 NVARCHAR 表达式。
在每一查询或子查询级别内,您可指定 SELECT 语句的 DISTINCT 或 UNIQUE 关键字不超过一次。 下列示例在查询和子查询中都使用 DISTINCT :
SELECT DISTINCT stock_num, manu_code FROM items
WHERE order_num = (SELECT DISTINCT order_num FROM orders
WHERE customer_num = 120);
上述示例是有效的,因为在每一 SELECT 语句中使用 DISTINCT 未超过一次。
如果查询在 Projection 子句中包括 DISTINCT 或 UNIQUE 关键字(而不是 ALL 关键字或无关键字),该子句的 Select 列表还包括一个其参数列表以 DISTINCT 或 UNIQUE 开头的合计函数, 则数据库服务器发出错误,如下例所示:
SELECT DISTINCT COUNT(DISTINCT ship_weight)
FROM orders;
即,对于 Projection 子句,以及对于将结果集限制为唯一值的合计函数,它在同一查询中是无效的。(在上例中,以 UNIQUE 替换 DISTINCT 关键字中的一个不能避免此错误。)
以多个合计表达式的查询
如果 Projection 子句不指定 SELECT 语句的 DISTINCT 或 UNIQUE 关键字,则该查询可包括多个内建的合计函数,每一函数包括 DISTINCT 或 UNIQUE 关键字作为参数列表中的第一个规范,如下例所示:
SELECT COUNT (DISTINCT customer_num),
COUNT (UNIQUE order_num),
AVG(DISTINCT ship_charge) FROM orders;
在同一查询级别中,对 DISTINCT 或 UNIQUE 合计表达式的支持适用于内建的合计函数,但不适用于 CREATE AGGREGATE 语句定义的用户定义的合计(UDA)函数。如果在同一查询中多于一个 UDA 表达式的参数列表以 DISTINCT 或 UNIQUE 关键字开头,则数据库服务器发出错误。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值