达梦数据库分页用法

Posted sinat_32856657

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了达梦数据库分页用法相关的知识,希望对你有一定的参考价值。

达梦支持常用的分页方式,ROWNUM(Oracle)、TOP(SQL Server)、LIMIT(mysql)。

对于应用提供了更好的可移植性

数据准备

--创建学生表,id、姓名、年龄、成绩

CREATE TABLE STU(id INT ,name varchar2(20),age int,score int);

--插入100条数据,id递增,姓名DAMENG1递增,年龄是13到17之前的随机数,成绩是60到100之前的随机数

INSERT INTO STU SELECT LEVEL id,'DAMENG'||level name,round(FLOOR(13 + (RAND() * 5))) age,

round(FLOOR(60 + (RAND() * 41))) score

FROM DUAL  CONNECT BY LEVEL<=100;

commit;

1.top

语法

<TOP 子句>::=TOP <n>

                        | <n1>,<n2>

                        | <n> PERCENT

                        | <n> WITH TIES

                        | <n> PERCENT WITH TIES

<n>::=整数(>=0)

1. TOP <n> 选择结果的前 n 条记录;

2. TOP <n1>,<n2> 选择第 n1 条记录之后的 n2 条记录;

3. TOP <n> PERCENT 表示选择结果的前 n%条记录;

4. TOP <n> PERCENT WITH TIES 表示选择结果的前 n%条记录,同时指定结果集可以返回额外的行。额外的行是指与最后一行以相同的排序键排序的所有行。WITH TIES

必须与 ORDER BY 子句同时出现,如果没有 ORDER BY 子句,则忽略 WITH TIES。

select top 5 * from stu;

select top 5,5 * from stu;

select top 5 percent * from stu;

TOP <n> PERCENT WITH TIES表示选择结果的前 n%条记录,同时指定结果集可以返回额外的行。额外的行是指与最后一行以相同的排序键排序的所有行。WITH TIES必须与 ORDER BY 子句同时出现,如果没有 ORDER BY 子句,则忽略 WITH TIES。

其意思就是比如查询按照成绩取前5%的学生,假如5%的学生的最后一位的成绩是75,那么不在5%内的成绩是75的也查询出来。

这个有啥实际意义呢,比如我要取5%的学生评为优秀学生,假如最后一位是98分,那其他98分的学生也评为优秀学生。

select top 5 percent  * from stu order by score desc;

select top 5 percent with ties * from stu order by score desc;

可以看到分数98的学生都查询出来了,多了两条记录。

可以使用存储过程,实现每次查询多少条数据

create or replace procedure get_stuinfo(n int,m int) as

sqlstr varchar2(500);

begin

select top (n-1)*m,m * from stu;

end;

/

--需要动态执行

create or replace procedure get_stuinfo(n int,m int) as

sqlstr varchar2(500);

begin

sqlstr='select top '||(n-1)*m||','||m||' * from stu;';

execute immediate sqlstr;

end;

/

call get_stuinfo(1,5);

2.limit

语法

<LIMIT 子句>::=<LIMIT 子句 1> | <LIMIT 子句 2>

<LIMIT 子句 1>::=  LIMIT <记录数>

                                          |<记录数>,<记录数>

                                          |<记录数> OFFSET <偏移量>

<LIMIT 子句 2>::= OFFSET <偏移量> LIMIT <记录数>

<记录数>::=<整数>

<偏移量>::=<整数>

select * from stu limit 5;

select * from stu limit 5,10;

select * from stu limit 10 OFFSET 5;

select * from stu OFFSET 5 limit 10 ;

可以看到后面三条语句的查询结果相同。

3.rownum

达梦有和oracle一样的rownum的分页功能。在对表进行insert时,会按照insert的顺序,将rownum分配给每一行记录,因此在select的时候,rownum的排序是根据insert记录的顺序显示的。

select rownum,*  from stu;

--可以看到rownum的顺序与插入的顺序是一致的。

select rownum,*  from stu order by id desc;

--可以看到即时是倒序查询,rownum还是不变的。

对于多表查询或者子查询时候,rownum是根据查询结果动态分配的。

select rownum, *  from stu t1,stu t2 where t1.id=t2.id;

如果查询第一条记录,可以使用rownum=1

select * from stu where rownum =1;

那如果查询第二条记录,是否可以通过rownum=2?

select * from stu where rownum =2;

可以看到没有查询结果。因为rownum并不是当作实体数据存放在每一张表中,而是在每一次select查询的时候,动态分配的,有1才有2,如果rownum没有1,那么2也就没有了意义,所以这个查询就不会有任何结果出来。同样如果rownum>n 也是没有意义的。

select rownum,*  from stu where rownum >0;

select rownum,*  from stu where rownum >=1;

所以也就可以理解在rownum大于0或者大于等于1的时候,查询出来的是所有结果。同时也可以进一步想到,rownum>=n  n是一个小于等于1的任何数,都是返回所有结果。

n甚至可以是表达式。所以如果直接使用rownum>n,rownum<m分页是无法查询到结果的。

所以要使用rownum进行分页查询,就需要使用子查询,先将rownum查出来,把它当做表中实际的列,进行分页。

select * from (select rownum rn,*  from stu)

where rn >=1 and rn<=5;

达梦数据库通过下面哪个文件可以配置连接达梦数据库的连接符

参考技术A 1、下载最新的kettle版本 2、把达梦对应JDK版本的jdbc驱动放在D:\kettle\pdi-ce-4.4.0-stable\data-integration\libext\JDBC安装目录下面 3、在connection type中选择generic database右侧填好url和Driver本回答被提问者采纳

以上是关于达梦数据库分页用法的主要内容,如果未能解决你的问题,请参考以下文章

达梦数据库 如何启动命令行工具 disql

【SQL语句】-分页查询limit的用法

达梦数据库INI参数文件的修改,以支持oracle迁移

Oracle 分页查询rownum的用法

MyBatis 分页插件 5.1.4 发布

shell脚本应该怎样连接达梦数据库,并备份达梦数据库,然后执行sql脚本