MySQL、SqlServer、Oracle三大主流数据库分页查询
MySQL、Oracle和SQLServer的分页查询语句

MySQL、Oracle和SQLServer的分页查询语句 假设当前是第PageNo页,每页有PageSize条记录,现在分别⽤Mysql、Oracle和SQL Server分页查询student表。
1、Mysql的分页查询: 1 SELECT2 *3 FROM4 student5 LIMIT (PageNo - 1) * PageSize,PageSize;理解:(Limit n,m) =>从第n⾏开始取m条记录,n从0开始算。
2、Oracel的分页查询:1 SELECT2 *3 FROM4 (5 SELECT6 ROWNUM rn ,*7 FROM8 student9 WHERE10 Rownum <= pageNo * pageSize11 )12 WHERE13 rn > (pageNo - 1) * pageSize理解:假设pageNo = 1,pageSize = 10,先从student表取出⾏号⼩于等于10的记录,然后再从这些记录取出rn⼤于0的记录,从⽽达到分页⽬的。
ROWNUM从1开始。
3、SQL Server分页查询:1 SELECT2 TOP PageSize *3 FROM4 (5 SELECT6 ROW_NUMBER () OVER (ORDER BY id ASC) RowNumber ,*7 FROM8 student9 ) A10 WHERE11 A.RowNumber > (PageNo - 1) * PageSize理解:假设pageNo = 1,pageSize = 10,先按照student表的id升序排序,rownumber作为⾏号,然后再取出从第1⾏开始的10条记录。
分页查询有的数据库可能有⼏种⽅式,这⾥写的可能也不是效率最⾼的查询⽅式,但这是我⽤的最顺⼿的分页查询,如果有兴趣也可以对其他的分页查询的⽅式研究⼀下。
SQLServer数据分页查询

SQLServer数据分页查询最近学习了⼀下SQL的分页查询,总结了以下⼏种⽅法。
⾸先建⽴了⼀个表,随意插⼊的⼀些测试数据,表结构和数据如下图:现在假设我们要做的是每页5条数据,⽽现在我们要取第三页的数据。
(数据太少,就每页5条了)⽅法⼀:select top 5 *from [StuDB].[dbo].[ScoreInfo]where [SID] not in(select top 10 [SID]from [StuDB].[dbo].[ScoreInfo]order by [SID])order by [SID]结果:此⽅法是先取出前10条的SID(前两页),排除前10条数据的SID,然后在剩下的数据⾥⾯取出前5条数据。
缺点就是它会遍历表中所有数据两次,数据量⼤时性能不好。
⽅法⼆:select top 5 *from [StuDB].[dbo].[ScoreInfo]where [SID]>(select MAX(t.[SID]) from (select top 10 [SID] from [StuDB].[dbo].[ScoreInfo] order by [SID]) t )order by [SID]结果:此⽅法是先取出前10条数据的SID,然后取出SID的最⼤值,再从数据⾥⾯取出⼤于前10条SID的最⼤值的前5条数据。
缺点是性能⽐较差,和⽅法⼀⼤同⼩异。
⽅法三:select *from (select *,ROW_NUMBER() over(order by [SID]) ROW_ID from [StuDB].[dbo].[ScoreInfo]) twhere t.[SID] between (5*(3-1)+1) and 5*3结果:此⽅法的特点就是使⽤ ROW_NUMBER() 函数,这个⽅法性能⽐前两种⽅法要好,只会遍历⼀次所有的数据。
适⽤于Sql Server 2000之后的版本(不含)。
Oracle之分页查询

Oracle,SQl,MySql实现分页查询MYSQL的简单查询Limit可以实现分页SELECT * FROM `e-commerce`.computer c where c.price=15 Having c.id in (1,2) order by c.id desc limit 0,1 ;SELECT ername FROM `user` u join contact_info c on (u.id=er_id) andc.address='123';update customer set username='zhouxiaoyu' where id = 1;delete from customer where id=1;insert into customer value(1,'zxy','123456',21,'645144985@');SELECT * FROM customer c;SELECT * FROM `e-commerce`.computer c where c.price=15 group by c.price Having c.id in (1,2);SELECT * FROM `e-commerce`.computer c where c.price=15 Having c.id in (1,2) order by c.id desc;Oracle分页查询格式:SELECT * FROM(SELECT A.*, ROWNUM RNFROM (SELECT * FROM TABLE_NAME) AWHERE ROWNUM <= 40)WHERE RN >= 21其中最内层的查询SELECT * FROM TABLE_NAME表示不进行翻页的原始查询语句。
ROWNUM <= 40和RN >= 21控制分页查询的每页的范围。
数据库分页技术大全(超级经典)

数据库分页技术1.mysql--记住mysql 中limit后是从零开始的主体格式如下:select * from tablename limit m,n--比如要查第6行到第20行select * from tablename limit 5,15右边两种写法等价: select * from table limit 10select * from table limit 0, 10 --都是查询前十行limit [m,] nm:为起始行(即从结果集的第几行开始查找),从0开始,且可以省略,即直接写limit n 这是默认从第0行开始n:为查询条数,不能为负数例子如下:select * from tablename limit 2,20表示从第2行开始,取20条数据SELECT * FROM table LIMIT [offset,] rows | rows OFFSET offsetLIMIT 子句可以被用于强制SELECT 语句返回指定的记录数。
LIMIT 接受一个或两个数字参数。
参数必须是一个整数常量。
如果给定两个参数,第一个参数指定第一个返回记录行的偏移量,第二个参数指定返回记录行的最大数目。
初始记录行的偏移量是0(而不是1):为了与PostgreSQL 兼容,MySQL 也支持句法:LIMIT # OFFSET #。
mysql> SELECT * FROM table LIMIT 5,10; // 检索记录行6-15//为了检索从某一个偏移量到记录集的结束所有的记录行,可以指定第二个参数为-1:mysql> SELECT * FROM table LIMIT 95,-1; // 检索记录行96-last.//如果只给定一个参数,它表示返回最大的记录行数目:mysql> SELECT * FROM table LIMIT 5; //检索前5 个记录行//换句话说,LIMIT n 等价于LIMIT 0,n。
oracle学习存储过程分页

分页查询一.由于oracle和mysql,SqlServer不同,在分页的过程也比较麻烦。
有一个部门表dept。
1.要查询前三行可以使用rownum做限制。
select * from dept where rownum<=3--查询前三条2.还可以查询排序好的前三行。
select * from (select * from dept order by dnoasc) where rownum<=3--排好序后,查询前三条3.如果要查询第二个前三行就比较麻烦了,rownum对大于限制没有作用。
可以这样写select dno,dname from(select dno,dname,rownum as rowno from dept order by dnoasc)where rowno>3 and rowno<=6;--获得第二个前三行二.在pl/sql编程中。
可以创建存储过程来实现分页查询的功能。
创建存储过程需要两个输入变量,当前页数curPage和页面大小pageSize。
基本算法是:每次查询的行数需要大于当前页数减一乘以页面大小,小于和等于点前页数和页面大小的乘积。
即:rownum>(curPage-1)*pageSize and rownum<=curpage*pageSize;代码:create or replace procedure proc_Page(in_curpage in number,in_pagesize in number)isv_m number :=(in_curpage-1)*in_pagesize;v_n number :=in_pagesize*in_curpage;cursorc_page is select t1.* from(select dept.*,rownumrn from dept where rownum<=v_n) t1 where rn>v_m;beginfor temp in c_page loopdbms_output.put_line('编号:'||temp.dno||' 姓名:'||temp.dname);end loop;end;--Sql窗口执行beginproc_Page(2,2);commit;end;--命令窗口执行SQL> set serveroutput on--打开开关显示,默认为offSQL> exec proc_Page(2,2)--执行sql三.在java中调用存储过程实现分页。
如何在MySQL中实现数据分页查询

如何在MySQL中实现数据分页查询导语:随着数据量的增加和用户的不断增长,对数据的处理和展示方式也发生了很大的改变。
在网站开发中,数据分页查询成为了解决数据展示和数据传输的重要手段之一。
本文将为大家介绍在MySQL中如何实现数据分页查询,帮助读者更好地开发和优化网站。
一、背景介绍随着互联网的快速发展,用户对大数据量的处理需求越来越高,传统的一次性加载所有数据的方式已经无法满足用户需求。
数据分页查询通过将数据分为若干个页面,每次只加载部分数据,避免了数据传输和展示过程中的延迟和冗余。
因此,实现数据分页查询成为了提高网站性能和用户体验的重要手段。
二、MySQL数据分页查询原理在MySQL中,数据分页查询的原理是通过LIMIT语句和OFFSET参数实现的。
LIMIT语句用于限制查询结果返回的行数,OFFSET参数用于指定查询结果的起始行数。
通过不同的OFFSET和LIMIT参数值,可以实现不同页面的数据查询和展示。
三、如何使用LIMIT和OFFSET进行数据分页查询使用LIMIT和OFFSET进行数据分页查询非常简单,只需要在查询语句中添加相应的限制条件即可。
下面以一个示例为例,详细介绍如何实现数据分页查询。
1. 确定每页显示的数据量和当前页码在进行数据分页查询之前,首先需要确定每页显示的数据量和当前页码。
这两个参数通常由前端传递给后端,用于指定每次查询的数据条数和当前要查询的页面。
2. 构建SQL查询语句根据前端传递的参数,使用LIMIT和OFFSET构建SQL查询语句。
假设每页显示10条数据,当前页码为1,则查询语句可以如下所示:```SELECT * FROM table_name LIMIT 10 OFFSET 0;```其中,table_name表示要查询的数据表名,LIMIT 10表示每次查询返回10条数据,OFFSET 0表示从第一条数据开始查询。
3. 执行查询并获取结果使用SQL语句执行查询,并获取查询结果。
mysql数据库分表后怎么进行分页查询?Mysql分库分表方案?

mysql数据库分表后怎么进⾏分页查询?Mysql分库分表⽅案?1.如果只是为了分页,可以考虑这种分表,就是表的id是范围性的,且id是连续的,⽐如第⼀张表id是1到10万,第⼆张是10万到20万,这样分页应该没什么问题。
2.如果是其他的分表⽅式,建议⽤sphinx先建索引,然后查询分页,我们公司现在就是这样⼲的Mysql分库分表⽅案1.为什么要分表:当⼀张表的数据达到⼏千万时,你查询⼀次所花的时间会变多,如果有联合查询的话,我想有可能会死在那⼉了。
分表的⽬的就在于此,减⼩数据库的负担,缩短查询时间。
mysql中有⼀种机制是表锁定和⾏锁定,是为了保证数据的完整性。
表锁定表⽰你们都不能对这张表进⾏操作,必须等我对表操作完才⾏。
⾏锁定也⼀样,别的sql必须等我对这条数据操作完了,才能对这条数据进⾏操作。
2. mysql proxy:amoeba做mysql集群,利⽤amoeba。
从上层的java程序来讲,不需要知道主服务器和从服务器的来源,即主从数据库服务器对于上层来讲是透明的。
可以通过amoeba来配置。
3.⼤数据量并且访问频繁的表,将其分为若⼲个表⽐如对于某⽹站平台的数据库表-公司表,数据量很⼤,这种能预估出来的⼤数据量表,我们就事先分出个N个表,这个N是多少,根据实际情况⽽定。
某⽹站现在的数据量⾄多是5000万条,可以设计每张表容纳的数据量是500万条,也就是拆分成10张表,那么如何判断某张表的数据是否容量已满呢?可以在程序段对于要新增数据的表,在插⼊前先做统计表记录数量的操作,当<500万条数据,就直接插⼊,当已经到达阀值,可以在程序段新创建数据库表(或者已经事先创建好),再执⾏插⼊操作。
4. 利⽤merge存储引擎来实现分表如果要把已有的⼤数据量表分开⽐较痛苦,最痛苦的事就是改代码,因为程序⾥⾯的sql语句已经写好了。
⽤merge存储引擎来实现分表, 这种⽅法⽐较适合.举例⼦:------------------- ----------华丽的分割线--------------------------------------数据库架构1、简单的MySQL主从复制:MySQL的主从复制解决了数据库的读写分离,并很好的提升了读的性能,其图如下:其主从复制的过程如下图所⽰:但是,主从复制也带来其他⼀系列性能瓶颈问题:1. 写⼊⽆法扩展2. 写⼊⽆法缓存3. 复制延时4. 锁表率上升5. 表变⼤,缓存率下降那问题产⽣总得解决的,这就产⽣下⾯的优化⽅案,⼀起来看看。
三种常用数据库(Oracle、MySQL、SQLServer)的分页之Oracle分页

三种常用数据库(Oracle、MySQL、SQLServer)的分页之Oracle分页环境Oracle 11gR2 + SQLPlus问题Oracle分页解决[sql]view plaincopyprint?1.--创建测试表2.3.SQL> create table test4. 2 (5. 3 id number primary key,6. 4 name varchar2(20) not null7. 5 );8.9.表已创建。
10.11.--创建序列12.SQL>13.SQL> create sequence seq_wgb_test;14.15.序列已创建。
16.17.--插入数据18.19.SQL> insert into test(id, name) values(seq_wgb_test.nextval, 'test1');20.21.已创建 1 行。
22.23.SQL> insert into test(id, name) values(seq_wgb_test.nextval, 'test2');24.25.已创建 1 行。
26.27.SQL>28.SQL> insert into test(id, name) values(seq_wgb_test.nextval, 'test3');29.30.已创建 1 行。
31.32.SQL>33.SQL> insert into test(id, name) values(seq_wgb_test.nextval, 'test4');34.35.已创建 1 行。
36.37.SQL>38.SQL> insert into test(id, name) values(seq_wgb_test.nextval, 'test5');39.40.已创建 1 行。
说一下mysql, oracle等常见数据库的分页实现方案

说一下mysql, oracle等常见数据库的分页实现方案1.Oracle:select * from ( select row_.*, rownum rownum_ from ( query_SQL ) row_ where rownum == min2.SQL Server:select top @pagesize * from tablename where id not in (select top @pagesize*(@page-1) id from tablename order by id) order by id3.MySQLselect * from tablename limit position, counter4.DB2select * from (select *,rownumber() as ROW_NEXT from tablename) where ROW_NEXT between min and max——————————————————————————————–1.分页方案一:(利用Not In和SELECT TOP分页)效率次之语句形式:SELECT TOP 10 * FROM TestTableWHERE(ID NOT IN (SELECT TOP 20 id FROM TestTable ORDERBY id)) ORDERBYIDSELECT TOP 页大小* FROM TestTableWHERE( ID NOT IN (SELECT TOP 每页大小-1*待查询页数-1 id FROM 表ORDERBY id)) ORDERBYID思路:先查询出待查询页之前的全部条数的id,查询ID不在这些ID中的指定数量条数2.分页方案二:(利用ID大于多少和SELECT TOP分页)效率最高语句形式:SELECT TOP 10 * FROM TestTableWHERE(ID>(SELECT MAX(id) FROM(SELECT TOP20 id FROM TestTable ORDERBYid)AST))ORDERBY IDSELECT TOP 页大小* FROM TestTableWHERE(ID>(SELECT MAX(id) FROM(SELECT TOP 每页大小*待查询页数-1 id FROM 表ORDERBY id)AS T)) ORDERBY ID思路:先获得待查询页的之前全部条数id,获得它们当中最大的ID 号,以此最大ID号为标志,查找比这个ID号大的指定条数3.分页方案三:SELECT TOP PageSize * FROM(SELECT TOP nPage*PageSize * from YOURTABLE order by id)as a order by id descSELECT TOP 每页条数* FROM (SELECT TOP 待查询页*每页条数) * from YOURTABLE order by id)as a order by id desc思路:先正排序查询出待查询页之前(包括当前页)的全部条数,然后将其倒排序,取指定条数。
主流数据库分页查询介绍

主流数据库分页查询介绍1 背景概述由于在项⽬中需要在页⾯上显⽰数量⾮常多的数据,在进⾏数据库查询时⾸先会把所有的数据都查询出来,然后在进⾏显⽰,这时候分页查询的操作就必不可少了,本⽂介绍Mysql、Oracle、sql Server 三种数据库进⾏分页查询的⽤法。
2 预期读者1. 数通畅联内部员⼯2. ⼴⼤计算机爱好者3 名词解释分页查询就是将将过多的结果在有限的界⾯上分多页来显⽰,⼀般将分页查询分为两类:逻辑分页、物理分页。
逻辑分页是在⽤户第⼀次访问时,将数据库的所有记录全部查询出来,添加到⼀个⼤集合中,然后存放在session对象,再通过页码计算出当前页需要显⽰的数据内容,存储到⼀个⼩的list的集合中,并将其存储到request对象中,跳转到JSP页⾯,进⾏遍历显⽰。
当⽤户第⼆次访问时,只要不关闭浏览器,还会从session中获取数据,来进⾏显⽰。
因为此种⽅法是在内存的session对象中进⾏计算分页显⽰的,⽽不是真正的将我们数据库进⾏分页的,所以叫做逻辑分页。
缺点:如果需要查询的数据量过⼤,session将耗费⼤量的内存;因为是在session中获取数据,如果第⼆次或者更多此的不关闭浏览器访问,会直接访问session,从⽽不能保证数据是最新的。
优点:统⼀代码处理⽅式,较容易跨数据库做迁移。
物理分页,使⽤数据库⾃⾝所带的分页机制,例如,Oracle数据库的rownum,或者Mysql数据库中的limit等机制来完成分页操作。
因为是对数据库的数据进⾏分页条件查询,所以叫物理分页。
每⼀次物理分页都会去连接数据库。
优点:数据能够保证最新,由于根据分页条件会查询出少量的数据,所以不会占⽤太多的内存。
CTE(Common Table Expression,公⽤表表达式)该表达式源⾃简单查询,可以认为是在单个 SELECT、INSERT、UPDATE、DELETE 或 CREATE VIEW 语句的执⾏范围内定义的临时结果集。
使用SQL语句查询MySQL,SQLServer,Oracle所有数据库名和表名,字段名

使⽤SQL语句查询MySQL,SQLServer,Oracle所有数据库名和表名,字段名MySQL中查询所有数据库名和表名查询所有数据库show databases;查询指定数据库中所有表名select table_name from information_schema.tables where table_schema='database_name' and table_type='base table';查询指定表中的所有字段名select column_name from information_schema.columns where table_schema='database_name' and table_name='table_name';查询指定表中的所有字段名和字段类型select column_name,data_type from information_schema.columns where table_schema='database_name' and table_name='table_name';SQLServer中查询所有数据库名和表名查询所有数据库select * from sysdatabases;查询当前数据库中所有表名select * from sysobjects where xtype='U';xtype='U':表⽰所有⽤户表,xtype='S':表⽰所有系统表。
查询指定表中的所有字段名select name from syscolumns where id=Object_Id('table_name');查询指定表中的所有字段名和字段类型select , from syscolumns sc,systypes st where sc.xtype=st.xtype and sc.id in(select id from sysobjects where xtype='U' and name='table_name');Oracle中查询所有数据库名和表名查询所有数据库由于Oralce没有库名,只有表空间,所以Oracle没有提供数据库名称查询⽀持,只提供了表空间名称查询。
真正高效的SQLSERVER分页查询

真正⾼效的SQLSERVER分页查询Sqlserver数据库分页查询⼀直是Sqlserver的短板,闲来⽆事,想出⼏种⽅法,假设有表ARTICLE,字段ID、YEAR...(其他省略),数据53210条(客户真实数据,量不⼤),分页查询每页30条,查询第1500页(即第45001-45030条数据),字段ID聚集索引,YEAR⽆索引,Sqlserver版本:2008R2第⼀种⽅案、最简单、普通的⽅法:SELECT TOP30*FROM ARTICLE WHERE ID NOT IN(SELECT TOP45000 ID FROM ARTICLE ORDER BY YEAR DESC, ID DESC) ORDER BY YEAR DESC,ID DESC 平均查询100次所需时间:45s第⼆种⽅案:SELECT*FROM( SELECT TOP30*FROM (SELECT TOP45030*FROM ARTICLE ORDER BY YEAR DESC, ID DESC) f ORDER BY f.YEAR ASC, f.ID DESC) s ORDER BY s.YEAR DESC,s.ID DESC平均查询100次所需时间:138S第三种⽅案:SELECT*FROM ARTICLE w1,(SELECT TOP30 ID FROM(SELECT TOP50030 ID, YEAR FROM ARTICLE ORDER BY YEAR DESC, ID DESC) w ORDER BY w.YEAR ASC, w.ID ASC) w2 WHERE w1.ID = w2.ID ORDER BY w1.YEAR DESC, w1.ID DESC平均查询100次所需时间:21S第四种⽅案:SELECT*FROM ARTICLE w1WHERE ID in(SELECT top30 ID FROM(SELECT top45030 ID, YEAR FROM ARTICLE ORDER BY YEAR DESC, ID DESC) w ORDER BY w.YEAR ASC, w.ID ASC)ORDER BY w1.YEAR DESC, w1.ID DESC平均查询100次所需时间:20S第五种⽅案:SELECT w2.n, w1.*FROM ARTICLE w1,( SELECT TOP50030 row_number() OVER (ORDER BY YEAR DESC, ID DESC) n, ID FROM ARTICLE) w2 WHERE w1.ID = w2.ID AND w2.n >50000ORDER BY w2.n ASC平均查询100次所需时间:15S查询第1000-1030条记录第⼀种⽅案:SELECT TOP30*FROM ARTICLE WHERE ID NOT IN(SELECT TOP1000 ID FROM ARTICLE ORDER BY YEAR DESC, ID DESC) ORDER BY YEAR DESC,ID DESC 平均查询100次所需时间:80s第⼆种⽅案:SELECT*FROM( SELECT TOP30*FROM (SELECT TOP1030*FROM ARTICLE ORDER BY YEAR DESC, ID DESC) f ORDER BY f.YEAR ASC, f.ID DESC) s ORDER BY s.YEAR DESC,s.ID DESC平均查询100次所需时间:30S第三种⽅案:SELECT*FROM ARTICLE w1,(SELECT TOP30 ID FROM(SELECT TOP1030 ID, YEAR FROM ARTICLE ORDER BY YEAR DESC, ID DESC) w ORDER BY w.YEAR ASC, w.ID ASC) w2 WHERE w1.ID = w2.ID ORDER BY w1.YEAR DESC, w1.ID DESC平均查询100次所需时间:12S第四种⽅案:SELECT*FROM ARTICLE w1WHERE ID in(SELECT top30 ID FROM(SELECT top1030 ID, YEAR FROM ARTICLE ORDER BY YEAR DESC, ID DESC) w ORDER BY w.YEAR ASC, w.ID ASC)ORDER BY w1.YEAR DESC, w1.ID DESC平均查询100次所需时间:13S第五种⽅案:SELECT w2.n, w1.*FROM ARTICLE w1,( SELECT TOP1030 row_number() OVER (ORDER BY YEAR DESC, ID DESC) n, ID FROM ARTICLE) w2 WHERE w1.ID = w2.ID AND w2.n >1000 ORDER BY w2.n ASC平均查询100次所需时间:14S由此可见在查询页数靠前时,效率3>4>5>2>1,页码靠后时5>4>3>1>2,再根据⽤户习惯,⼀般⽤户的检索只看最前⾯⼏页,因此选择3 4 5⽅案均可,若综合考虑⽅案5是最好的选择,但是要注意SQL2000不⽀持row_number()函数,由于时间和条件的限制没有做更深⼊、范围更⼴的测试,有兴趣的可以仔细研究下。
mysql 分页查询语句数据库查询

mysql 分页查询语句数据库查询2011-09-28 15:47:56 我来说两句收藏我要投稿SQL Server关于分页 SQL 的资料许多,有的使用存储过程,有的使用游标。
本人不喜欢使用游标,我觉得它耗资、效率低;使用存储过程是个不错的选择,因为存储过程是颠末预编译的,执行效率高,也更灵活。
先看看单条 SQL 语句的分页 SQL 吧。
方法1:适用于 SQL Server 2000/2005SELECT TOP 页大小 * FROM table1 WHERE id NOT IN ( SELECT TOP 页大小*(页数-1) id FROM table1 ORDER BY id ) ORDER BY id方法2:适用于 SQL Server 2000/2005SELECT TOP 页大小 * FROM table1 WHERE id > ( SELECT ISNULL(MAX(id),0) FROM ( SELECT TOP 页大小*(页数-1) id FROM table1 ORDER BY id ) A ) ORDER BY id 方法3:适用于 SQL Server 2005SELECT TOP 页大小 * FROM ( SELECT ROW_NUMBER() OVER (ORDER BY id) AS RowNumber,* FROM table1 ) A WHERE RowNumber > 页大小*(页数-1)说明,页大小:每页的行数;页数:第几页。
使用时,请把“页大小”以及“页大小*(页数-1)”替换成数码。
MYSQLSELECT * FROM TT LIMIT 1,20SELECT * FROM TT LIMIT 21,30/*如果你是几千上万数据,就直接使用mysql自带的函数 limit的普通用法就ok了,如果是100万以上的数据,可能就要讲方法了,下面我们来做个百万级数据的分页查询语句.mysql> select * from news where id>=(select id from news limit 490000,1) limit 10; //0.18 sec //很明显,这种方式胜出 .mysql> select * from news limit 490000,10 //0.22 sec;*/以下的文章主要介绍的是MySQL分页的实际操作方案,其实关于实现MySQL分页的最简单的方法就是利用利用mysql数据库的LIMIT函数,LIMIT [offset,] rows可以从MySQL数据库表中第M条记录开始检索N条记录的语句为:SELECT * FROM 表名称 LIMIT M,N例如从表Sys_option(主键为sys_id)中从第10条记录开始检索20条记录,语句如下:select * from sys_option limit 10,20select * from table [查询条件] order by id limit ?,? OracleOracle的分页查询语句基本上可以按照这篇了,下一篇文章会通过例子来申述。
数据库分页查询方法

数据库分页查询⽅法可能会有⼈说这些⽹上都有,但我的主要⽬的是把这些知识通过我实际的应⽤总结归纳⼀下,以⽅便⼤家查询使⽤。
下⾯就分别给⼤家介绍、讲解⼀下三种数据库实现分页查询的⽅法。
⼀、 MySQL 数据库分页查询MySQL数据库实现分页⽐较简单,提供了LIMIT函数。
⼀般只需要直接写到sql语句后⾯就⾏了。
LIMIT⼦句可以⽤来限制由SELECT语句返回过来的数据数量,它有⼀个或两个参数,如果给出两个参数,第⼀个参数指定返回的第⼀⾏在所有数据中的位置,从0开始(注意不是1),第⼆个参数指定最多返回⾏数。
例如:select * from table WHERE … LIMIT 10; #返回前10⾏select * from table WHERE … LIMIT 0,10; #返回前10⾏select * from table WHERE … LIMIT 10,20; #返回第10-20⾏数据⼆、 SQLServer数据库分页查询SQLServer数据库⼜分为SQLServer2000和SQLServer2005。
⼀般⽐较简单的⽅法是通过TOP函数来实现。
如下:SELECT TOP 10 * FROM sql WHERE (code NOT IN (SELECT TOP 20 code FROM TestTable ORDER BY id))ORDER BY ID这条语句,从理论上讲,整条语句的执⾏时间应该⽐⼦句的执⾏时间长,但事实相反。
因为,⼦句执⾏后返回的是20条记录,⽽整条语句仅返回10条语句,所以影响数据库响应时间最⼤的因素是物理I/O操作。
⽽限制物理I/O操作此处的最有效⽅法之⼀就是使⽤TOP关键词了。
TOP关键词是SQL SERVER中经过系统优化过的⼀个⽤来提取前⼏条或前⼏个百分⽐数据的词。
以上语句的有⼀个致命的缺点,就是它含有NOT IN字样,要换成⽤not exists来代替not in,⼆者的执⾏效率实际上是没有区别的。
SQLServer、MySql和Oracle的分页

我们在编写MIS系统和Web应用程序等系统时,都涉及到与数据库的交互,如果数据库中数据量很大的话,一次检索所有的记录,会占用系统很大的资源,因此我们常常采用,需要多少数据就只从数据库中取多少条记录,即采用分页语句。
根据自己使用过的内容,把常见数据库Sql Server,Oracle和My sql的分页语句,从数据库表中的第M条数据开始取N条记录的语句总结如下:SQL Server从数据库表中的第M条记录开始取N条记录,利用Top关键字:注意如果Select 语句中既有top,又有order by,则是从排序好的结果集中选择:SELECT *FROM ( SELECT Top N *FROM (SELECT Top (M + N - 1) * FROM 表名称 Order by 主键 desc) t1 ) t2Order by 主键 asc例如从表Sys_option(主键为sys_id)中从10条记录还是检索20条记录,语句如下:SELECT *FROM ( SELECT TOP 20 *FROM (SELECT TOP 29 * FROM Sys_option order by sys_id desc) t1) t2Order by sys_id ascOralce数据库从数据库表中第M条记录开始检索N条记录SELECT *FROM (SELECT ROWNUM r,t1.* From 表名称 t1 where rownum < M + N) t2where t2.r >= M例如从表Sys_option(主键为sys_id)中从10条记录还是检索20条记录,语句如下:SELECT *FROM (SELECT ROWNUM R,t1.* From Sys_option where rownum < 30 ) t2Where t2.R >= 10如果你对Oracle数据库分页不是很熟悉的话,本页后面有专门对Oracle分页技术的讲解。
sqlserver数据库分页查询技术

SQL Server 数据库分页查询技术1.引言在列表查询时由于数据量非常多,一次性查出来会非常慢,就算一次查出来了,也不能一次性显示给客户端,所以要把数据进行分批查询出来,每页显示一定量的数据,这就是数据要分页。
2.常用的数据分页方法我们经常会碰到要取n到m条记录,就是有分页思想,下面罗列一下一般的方法。
我本地的一张表 tbl_FlightsDetail,有300多W记录,主键FlightsDetailID(Guid),要求按照FlightsDetailID排序取 3000001 到3000010 之间的10条记录,也是百万级。
方法1 定位法 (利用ID大于多少)语句形式:select top10*from tbl_FlightsDetail where FlightsDetailID>(select max(FlightsDetailID) from (select top3000000 FlightsDetailID fromtbl_FlightsDetail order by FlightsDetailID) as t) order by FlightsDetailID执行计划:先查出 top 300000,再聚合取这个集合中最大的Id1,再过滤 id大于id1的集合(上图中使用到索引),再取top 10 条。
方法2 (利用Not In)语句形式:select top10*from tbl_FlightsDetail where FlightsDetailID not in (select top3000000 FlightsDetailID fromtbl_FlightsDetail order by FlightsDetailID) order by FlightsDetailID执行计划:和方法一类似,只是过滤where条件不一样,这里用到的是not in,上图中没有用到索引,耗时8秒。
SQL查询前10条记录(SqlServermysqloracle)语法分析

SQL查询前10条记录(SqlServer/mysql/oracle)语法分析Sql Server :Sql代码select top X * from table_name --查询前X条记录,可以改成需要的数字。
select top n * from (select top m * from table_name order by column_name ) a order by column_namedesc --查询第N到M条记录。
常用的分页也是这种方式。
例如常用的分页方式:declare @page intdeclare @row intset @page=2 --页数set @row=3 --每页展示行数select top (@row) * from (select top (@row*@page) * from table_name order by id ) a order by iddesc --最基本的分页方式,改变@row和@page达到分页效果MYSQL查询前10条的方法(limit参数的第一个参数n(如下面的0或1)表示前n条记录是不在选择范围内,相当于hibernate的setFirstResult的参数加一;第二个参数表示要选择的记录条数,相当于hibernate的setMaxResult的参数):Sql代码select * from table_name limit 0,10 --通常0是可以省略的,直接写成 limit 10。
0代表从第0条记录后面开始,也就是从第一条开始select * from table_name limit 1,10 --则为从第一条后面的记录开始展示,也就是说从第二条开始。
MySQL查询前5条方法(假设一个表为users表,这里作为子查询时要加入别名不然会出错,还有一点要注意的是order by在limit前面,不然还没出结果前就说要前几条,怎么搞嘛,所以limit要放最后。
Oracle、SQL Server、Access数据库高效果分页技巧 电脑资料

Oracle、SQL Server、Access数据库高效果分页技巧电脑资料1、SQL Server、Aess数据库这都微软的数据库,都是一家人,基本的操作都是差不多,常采用如下分页语句:PAGESIZE:每页显示的记录数CURRENTPAGE:当前页号数据表的名字是:ponents索引主键字是:id以下是引用片段: select top PAGESIZE * from ponents where id not in (select top (PAGESIZE*(CURRENTPAGE-1)) id from ponents order by id)order by id如下列:以下是引用片段: select top 10 * from ponents where id not in (select top 10*10 id from ponents order by id) order by id从101条记录开始选择,只选择前面的10条记录2、Oracle数据库因为Oracle数据库没有Top关键字,所以这里就不能够像微软的数据据那样操作,这里有两种方法:(1)、一种是利用相反的,PAGESIZE:每页显示的记录数CURRENTPAGE:当前页号数据表的名字是:ponents索引主键字是:id以下是引用片段: select * from ponents where id notin(select id from ponents whererownum<=(PAGESIZE*(CURRENTPAGE-1))) and rownum<=PAGESIZE order by id;如下例:以下是引用片段: select * from ponents where id not in (select id from ponents where rownum<=100) and rownum<=10 order by id;从101到记录开始选择,选择前面10条,(2)、使用minus,即中文的意思就是减去。
SQLServer与MySQL中分页查询sql语句示例

SQLServer与MySQL中分页查询sql语句⽰例/***author blovedr*功能:SQLServer与MySQL中分页查询sql语句⽰例*⽇期: 2018年8⽉17⽇ 10:58*注释:学习数据库MySQL的点点记录,谢谢⽹上各位⼤神分享经验与资料,欢迎⼤神批评与交流。
*/分页查询 2018.8.16 21:39SQLServer OK 2018.8.16 21:53--显⽰第1个到第4个⼊职的雇员(按时间的先后顺序)select top 4 * from order by hiredate⾃注:显⽰第⼀个到第四个⼊职的员⼯ SQLServer OK 2018.8.16 21:53select * from emp order by hiredate--请显⽰第5个到第10个⼊职的雇员(按时间的先后顺序)select top 6 * from emp where empno not in(select top 4 empno from emp order by hiredate)order by hiredate;⾃注:排除4个,再挑6个雇员(输出前6个雇员),就是显⽰第5个到第10个⼊职的雇员(按时间的先后顺序)。
SQLServer OK 2018.8.16 22:07--请显⽰第11个到第13个⼊职的⼈的信息(按时间的先后顺序)select top 3 * from emp where empno not in(select top 10 empno from emp order by hiredate)order by hiredate;⾃注:排除10个,再挑3个雇员(输出前3个雇员),就是显⽰第11个到第13个⼊职的雇员(按时间的先后顺序)。
SQLServer OK 2018.8.16 22:07--请显⽰第5个到第9个⼈的信息(按照薪⽔的⾼低) 2018.8.16 22:11select top 5 * from emp where empno not in(select top 4 empno from emp order by sal desc)order by sal desc;⾃注:排除前4个,剩下再挑5个雇员(输出前5个雇员),就是显⽰第5个到第9个⼈的信息(按照薪⽔的⾼低)。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
MySQL、SqlServer、Oracle三大主流数据库分页查询
在这里主要讲解一下MySQL、SQLServer2000(及SQLServer2005)和ORCALE三种数据库实现分页查询的方法。可能会有人说这些网上都有,但我的主要目的是把这些知识通过我实际的应用总结归纳一下,以方便大家查询使用。
select* from table WHERE … LIMIT 10; #返回前10行
select * from table WHERE … LIMIT 0,10; #返回前10行
select * from table WHERE … LIMIT 10,20; #返回第10-20行数据
二、SQLServer数据库分页查询
使用TOP要求主键必须唯一,不能是联合主键。如果是联合主键,则查询出的结果会乱序的。
目前SQLServer2005提供了一个row_number()函数。ROW_NUMBER()就是生成一个顺序的行号,而他生成顺序的标准,就是后面紧跟的OVER(ORDER BYReportID),其中ReportID可以是联合主键。下面,我们看看怎么具体应用这个RowNo进行分页.
SELECT TOP 10 * FROM
(
SELECT top 10 ROW_NUMBER() OVER (ORDER BYReportID) ASRowNo
FROM TABLE
) AS A
WHERERowNo> " +pageIndex*10
pageIndex就是我们需要数据的页数.
但对于SQLServer2000的话,如果是联合主键,我还没有解决办法,如果大家有可跟我联系。谢谢大家了。
下面就分别给大家介绍、讲解一下三种数据库实现分页查询的方法。
一、MySQL数据库分页查询
MySQL数据库实现分页比较简单,提供了LIMIT函数。一般只需要直接写到sql语句后面就行了。
LIMIT子句可以用来限制由SELECT语句返回过来的数据数量,它有一个或两个参数,如果给出两个参数,第一个参数指定返回的第一行在所有数据中的位置,从0开始(注意不是1),第二个参数指定最多返回行数。例如:
ORDER BY ID
这条语句,从理论上讲,整条语句的执行时间应该比子句的执行时间长,但事实相反。因为,子句执行后返回的是20条记录,而整条语句仅返回10条语句,所以影响数据库响应时间最大的因素是物理I/O操作。而限制物理I /O操作此处的最有效方法之一就是使用TOP关键词了。TOP关键词是SQL SERVER中经过系统优化过的一个用来提取前几条或前几个百分比数据的词。
以上语句的有一个致命的缺点,就是它含有NOT IN字样,要换成用not exists来代替not in,二者的执行效率实际上是没有区别的。
在以上分页算法中,影响我们查询速度的关键因素有两点:TOP和NOT IN。TOP可以提高我们的查询速度,而NOT IN会减慢我们的查询速度,所以要提高我们整个分页算法的速度,就要彻底改造NOT IN,同其他方法来替代它。
最后提醒大家:oracle中慎用带有order by的分页。尤其是在oracle10g中,会出现会引起混乱,即相同记录会出现在不同页中。
SQLServer数据库又分为SQLServer2000和SQLServer2005。一般比较简单的方法是通过TOP函数来实现。如下:
SELECT TOP 10 * FROMsqlWHERE (
code NOT IN (SELECT TOP 20 code FROMTestTableORDER BY id))
我们知道,几乎任何字段,我们都可以通过max(字段)或min(字段)来提取某个字段中的最大或最小值,所以如果这个字段不重复,那么就可以利用这些不重复的字段的max或min作为分水岭,使其成为分页算法中分开每页的参照物。在这里,我们可以用操作符“>”或“<”号来完成这个使命。如:
Select top 10 * from table1 where id>200
于是就有了如下分页方案:
select top页大小*
from table1
where id>
(select max (id) from
(select top ((页码-1)*页大小) id from table1 order by id) as T
)
order by id
这种方法执行多少始终没有大的降势,后劲仍然很足。尤其对于数据量大的时候,该方法执行速度一点也不会降低。
三、ORCALE数据库分页查询
ORCALE数据库实现分页查询可以使用row_number()函数或者使用rownum虚列两种方法。
第一种:利用分析函数row_number()方法
select * from(
select t.*,row_number() over (order by t1.id)rownofrom TABLE1
)
whe二种:直接使用rownum虚列
select * from
(select t.*,rownumasrownofrom TABLE1 )
whererownobetween 10 and 20
这两种方法比较,显然第二种方法比较好。因为不用order by语句,会提高检索数据的速度的,尤其数据量越大时,第二种方法快速检索数据越明显。