SELECT: TOP PERCENT¶
说明¶
使用TOP子句限制结果集中返回的行数,如果指定了PERCENT,则是指返回的结果集行的百分比。
参数¶
numerical_expr
是指定返回行数的数值表达式。如果指定了PRECENT,则是指返回结果集行的百分比(由numerical_expr指定)。numerical_expr可以是普通非负数常量,也可以是带括号的合法的复杂表达式。表达式的结果值必须为非负数,否则神通数据库会提示相应的错误信息。
expr
查询目标表达式
PERCENT
指示查询只返回结果集中前numerical_expr % 的行。
注解
如果一个SELCET语句既包含TOP又包含ORDER BY子句,那么返回的行将会从排序后的结果集中选择。整个结果集按照指定的顺序建立,并且返回排序后的结果集中的前n行。如果查询没有 ORDER BY 子句,则行的顺序是随意的。
TOP、TOP PERCENT和LIMIT、OFFSET同时使用,唯一特例是不带PERCENT的TOP子句可以和OFFSET一起使用,此时其含义为返回查询结果中从offset行开始之后的前numerical_expr行。
同时,神通数据库不允许带有PERCENT的TOP子句与ROWNUM一起使用,否则神通数据库会提示相应的错误信息。
示例¶
示例1: 限制结果集行数
-- 清理环境
DROP TABLE tab1 CASCADE;
-- 创建表并插入数据
CREATE TABLE tab1 (a INT, b INT);
INSERT INTO tab1 VALUES(1, 10);
INSERT INTO tab1 VALUES(2, 20);
INSERT INTO tab1 VALUES(3, 30);
INSERT INTO tab1 VALUES(4, 40);
INSERT INTO tab1 VALUES(5, 50);
INSERT INTO tab1 VALUES(6, 60);
INSERT INTO tab1 VALUES(7, 70);
INSERT INTO tab1 VALUES(8, 80);
INSERT INTO tab1 VALUES(9, 90);
INSERT INTO tab1 VALUES(10, 100);
SELECT * FROM tab1 ORDER BY a;
A(int) |B(int) |
------------------------
1 |10 |
------------------------
2 |20 |
------------------------
3 |30 |
------------------------
4 |40 |
------------------------
5 |50 |
------------------------
6 |60 |
------------------------
7 |70 |
------------------------
8 |80 |
------------------------
9 |90 |
------------------------
10 |100 |
总数目:10
-- 限制结果集行数
SELECT TOP 5 * FROM tab1 ORDER BY a;
A(int) |B(int) |
------------------------
1 |10 |
------------------------
2 |20 |
------------------------
3 |30 |
------------------------
4 |40 |
------------------------
5 |50 |
总数目:5
-- 限制结果集行数百分比
SELECT TOP 20 PERCENT * FROM tab1 ORDER BY a;
A(int) |B(int) |
------------------------
1 |10 |
------------------------
2 |20 |
总数目:2
-- 查询全部结果集
SELECT TOP 100 PERCENT * FROM tab1 ORDER BY a;
A(int) |B(int) |
------------------------
1 |10 |
------------------------
2 |20 |
------------------------
3 |30 |
------------------------
4 |40 |
------------------------
5 |50 |
------------------------
6 |60 |
------------------------
7 |70 |
------------------------
8 |80 |
------------------------
9 |90 |
------------------------
10 |100 |
总数目:10
-- 百分比超过 100 —— 报错
SELECT TOP 1000 PERCENT * FROM tab1 ORDER BY a;
ERROR, TOP PERCENT表达式的值必须介于0到100之间
-- TOP 子句使用复杂的带括号的表达式
SELECT TOP (9 + (SELECT COUNT(*) FROM tab1)) PERCENT * FROM tab1 ORDER BY a;
A(int) |B(int) |
------------------------
1 |10 |
------------------------
2 |20 |
总数目:2
-- 不带 PERCENT 关键字的 TOP 子句 和 OFFSET 一起使用
SELECT TOP 5 * FROM tab1 ORDER BY a OFFSET 3;
A(int) |B(int) |
------------------------
4 |40 |
------------------------
5 |50 |
------------------------
6 |60 |
------------------------
7 |70 |
------------------------
8 |80 |
总数目:5
-- 带有 PERCENT 关键字的 TOP 子句 和 OFFSET 一起使用 —— 报错
SELECT TOP 50 PERCENT * FROM tab1 ORDER BY a OFFSET 3;
ERROR, 子句有冲突, Top Percent和Limit语句不允许同时使用
-- 带有 PERCENT 的 TOP 子句与 ROWNUM 一起使用 —— 报错
SELECT TOP 50 PERCENT ROWNUM, * FROM tab1 ORDER BY a;
ERROR, ROWNUMBER和TOP PERCENT冲突,不能同时出现在查询中
-- 删除表
DROP TABLE tab1;