MySQL、SqlServer、Oracle三大主流数据库分页查询
- 格式:docx
- 大小:18.60 KB
- 文档页数:3
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数据分页查询最近学习了⼀下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,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和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中,数据分页查询的原理是通过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分库分表⽅案?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 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等常见数据库的分页实现方案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 语句的执⾏范围内定义的临时结果集。