精华内容
下载资源
问答
  • Jpa 原生SQL分页查询“一个别名引发的一场血案” 问题描述: 备注:刚开始SQL 没有加任务AS 别名 第一页:正常显示 第二页:显示不正常 为什么第一页可以第二页不行,一模一样的SQL没有修改过? 百度...

    问题描述:  备注:刚开始SQL 没有加任何AS 别名

    第一页:正常显示

     

    第二页:显示不正常

     

    为什么第一页可以第二页不行,一模一样的SQL没有修改过?

    百度查了一下,没什么资料、无法下手。。。

    1. 看了日志发现第一页域第二页的SQL显示不一样

    select TOP(?)  from  第一页

     WITH query AS (SELECT inner_query.*, ROW_NUMBER() OVER (ORDER BY CURRENT_TIMESTAMP) as __hibernate_row_nr__ FROM   第二页

    明显不一样的处理逻辑

    1. select med.*  from 都可以显示出来
    2. 没有办法只能看源码了,经过多次的断点终于发现猫腻了。

    org.hibernate.dialect.pagination.SQLServer2005LimitHandler#processSql

     

    1. 第一页

     

     

       

     2.第二页逻辑

    org.hibernate.dialect.pagination.SQLServer2005LimitHandler#fillAliasInSelectClause

    org.hibernate.dialect.pagination.SQLServer2005LimitHandler#getAlias

    没错这里就是最后结局。。。。

    加上  as  别名  就可以了。。。。如果是*号默认就是全部

     

    展开全文
  • 概述很多朋友都不太理解为什么要去分页查询,今天主要用一个简单实例来解释下Oracle数据库的分页查询。。。分页查询概念分页查询就是把query到的结果集按页显示。比如一个结果集有1W行,每页按100条数据,而你获取了...

    概述

    很多朋友都不太理解为什么要去分页查询,今天主要用一个简单实例来解释下Oracle数据库的分页查询。。。


    分页查询概念

    分页查询就是把query到的结果集按页显示。比如一个结果集有1W行,每页按100条数据,而你获取了第2页的结果集。


    为什么要分页查询

    如果一个结果集有几十W行,那么在一个页面上显示肯定显示不完。同时,显示数据库记录是需要加载到内存的,而显示大量数据是消耗内存更多。

    总之,我们是为了以下目的使用分页查询:

    • 为了精确定位结果集的内容
    • 为了节约内存
    • 为了在有限的页面空间显示适度的数据

    分页查询实现

    使用Oracle的EMP表,原始sql如下:

    select * from ( select rownum rn, e.* from ( select * from EMP) e);

    结果如下:

    980791f40f939c2f3573dc8ecef5ce4b.png

    分页查询sql如下:

    select * from     ( select rownum rn, e.* from              ( select * from EMP) e      )where rn > pageSize * (page - 1) and rn <= pageSize * page

    说明:

    假设选定每页(pageSize)为5。那么EMP表目前共有三页,1~5行为1页;6~10行为1页;1~15行为1页(缺第15行,那么第3页就显示4行记录),页面从第1页开始。

    我们要查询第2页的记录,那么page = 2。

    where rn > 5 and rn <= 10

    那么第2页是由第6,7,8,9,10行记录形成的。

    select * from     ( select rownum rn, e.* from              ( select * from EMP) e      )where rn > 5 and rn <= 10

    结果如下:

    56c18caf13befda244d6193276e0ef06.png

    分页查询也可以使用betwenn ... and ...

    where rn = between (pageSize * (page - 1) + 1) and pageSize * page

    可见分页查询是取某一范围的结果集。


    讲的有点简单...大家有空也可以自己测试一下~觉得有用的朋友多帮忙转发哦!后面会分享更多devops和DBA方面的内容,感兴趣的朋友可以关注下~

    3b46f3d8d7a51344b642e64c6fb6bb80.gif
    展开全文
  • 为什么80%的码农都做不了架构师?>>> ...

    本文分析并介绍 Oracle 中的分页查找的方法。

        Oracle 中的表,除了我们建表时设计的各个字段,其实还有两个字段(此处只介绍2个),分别是 ROWID(行标示符)和 ROWNUM(行号),即使我们使用DESCRIBE命令查看表的结构,也是看不到这两个列的描述的,因为,他们其实是只在数据库内部使用的,所以也通常称他们为伪列(pseudo column)。

        下面我们先建表并添加一些数据来验证上面的说明。

         建表:

    create table users(
    id integer primary key,
    name nvarchar2(20)
    )

     

        插入数据:

     

    insert into users(id,name) values(1,'tom');
    insert into users(id,name) values(2,'cat');
    insert into users(id,name) values(3,'bob');
    insert into users(id,name) values(4,'anxpp');
    insert into users(id,name) values(5,'ez');
    insert into users(id,name) values(6,'lily');

     

    1. 使用describe命令查看表结构:

    8c084149f91edf0197e21b02bc5f0c21e32.jpg

        可以看到,确实只有建表时的两个字段。

        但我们可以查询的时候,查找到伪列的值:

    select rowid,rownum,id,name from users;

        结果:

        0ce9e79beedd6149ec9e046a57e58fafcf6.jpg

        这个 rowid 我们一般用不到,Oracle 数据库内部使用它来存储行的物理位置,是一个 18 位的数字,采用 base-64 编码。

        而这个 rownum,我们也正是使用它来进行分页查询的,它的值,就是表示的该行的行号。

        对于分页,我们只要想办法可以查询到从某一起始行到终止行就可以的,分页的逻辑可以放到程序里面。

        于是,我们理所当然会想到如下语句查询第 2 页的数据(每页2条数据,页码从 1 开始,所以起始行的行号为 (页码-1) * 每页长度 +1=3,终止行的行号为 页码*每页长度=4 )。

    select * from users where rownum>=3 rownum <= 4;

        哈哈!是不是发现没有任何结果,原因很简单,Oracle机制就是这样的:因为第一条数据行号为1,不符合>=3的条件,所以第一行被去掉,之前的第二行变为新的第一行(即这个行号不是写死的,可以理解为是动态的),如此下去,一直到最后一行,条件始终没法满足,所以就一条数据也查不出来。

        既然找到了原因,解决方法也就很明显了,我们只要将行号查询出来生成一个结果集,然后再从这个结果集中,选择行号大于我们设定的那个值就可以了,上面的分页查找正确的写法应该是这样:

    select id,name from(
    select rownum rn,u.* from users u) ua
    where ua.rn between 3 and 4;

        上面的语句还可以优化:>= 不能用,但是 <= 是可以的,我们不需要在子查询中将结果全部查出来,首先使用终止行筛选子查询的结果,SQL如下:

    select id,name from(
    select rownum rn,u.* from users u where rownum<=4) ua
    where ua.rn >= 3;

        结果:

        6f10cff62f353209aaf8212c7e761c689e4.jpg

        很多时候,我们并不是盲目的分页查找的,二十按某一个或多个字段的升序或降序分页,即包含 order by 语句的分页查询,我们先看一下 order by 的查询结果中 rownum 是怎样的:

    select rownum,id,name from users order by name;

        结果:

        2793c00165d3fa47682c1d99bca1d13e581.jpg

        可以看到,我们说行号完全是动态的,也是不准确的,这时候的行号并不是经过 order by 后新结果的增序行号。

        但有了上面的嵌套查询的经验,这里也可以好好应用一下,怎么做呢:先查找出排序好的结果集,然后应用上面的方法得到最终结果,sql 如下:

    select id,name from(
    (select rownum rn,uo.* from
    (select * from users u order by name) uo
    where rownum<=4)) ua
    where ua.rn>=3;

        按照上面的结果,正确的分页结果应该是 id 为 2 和 5 的,看下结果:

        d7eafc0e802f7002e2b17c284ed43d4fb63.jpg

        OK,结果正确。

        其实连表查询之类的,也是差不多的,多点嵌套而已,掌握了原理,随便分析一下就能写出对应的 SQL 了,而编写 SQL 时,我们也得动动脑子,毕竟 SQL 也是由优劣之分的。

     

    原文写得很好可以看下!

    本文转载自:http://blog.csdn.net/anxpp/article/details/51534006

     

    转载于:https://my.oschina.net/hp2017/blog/1857562

    展开全文
  • 不过,与我偶尔不得不发问“为什么这个API没有分页”的不满相比,这件事上的不满是什么呢?让我从无服务器架构的混乱工作中抽出一点空来谈谈分页。单向分页和双向分页通俗的讲,我见过两种常见类型的分页:简单粗暴...

    创建分页的正确姿势

    下面这些话,是在我职业生涯的几个项目中,经常喃喃的自言自语抱怨的事。

    不过,与我偶尔不得不发问“为什么这个API没有分页”的不满相比,这件事上的不满是什么呢?让我从无服务器架构的混乱工作中抽出一点空来谈谈分页。

    单向分页和双向分页


    通俗的讲,我见过两种常见类型的分页:

    • 简单粗暴的单向分页,将结果集一次性返回,冗长而低效——例如:推特的粉丝列表,或是谷歌的搜索结果;
    • 双向分页则通过一系列参数反馈或以流的形式实现,在收到第一页的结果后追加显示新的结果——例如:推特的推文时间线,或者通知系统;

    避免抽象泄漏(Leaky abstraction)


    我经常见到的一个错误的做法是,要求调用者提供一个"key"来用于结果集的排序,例如按时间戳(timestamp)或者按字母顺序来排序,这样就产生了一个“抽象泄漏”——调用者必需了解服务器端的底层机制才能使用分页。

    DynamoDB数据库的查询API就是这样一个例子。为了将查询的结果集分页,调用者必须在一系列的请求中提供ExclusiveStartKey,服务器也要在响应中包含LastEvaluatedKey。

    在实际使用过程中,你几乎可以把LastEvaluatedKey作为一个token或是cursor来对待,简单的把它放到下一页或者上一页请求中来传递。但是它不仅是一个token,它的属性名暴露了服务端的实现细节,它实际上是一个在DynamoDB数据库进行排序用的key。

    就其本身而言,这没什么大不了的。但是,不幸的是,它经常会产生成一些连锁反应,那就是这样鼓励应用程序的开发人员在进行应用程序开发时,将底层的实现细节暴露在分页信息中;下图这种情况中,客户端就需要负责跟踪相应的信息了。

    e29759935c15982eba4374573a521927.png

    恭喜你,你的数据库用来支持分页的底层机制现在已经全部泄漏给前端了!

    使分页的意图明确且一致


    另一种我常见的现象是,你必须一次又一次的把相同的请求参数发送给分页的API,例如:

    • 每页结果的最大数量
    • 分页的方向是上一页还是下一页(双向分页系统)
    • 原始查询语句(在DynamoDB数据库中,包括一系统的属性,像过滤表达式,关键字条件表达式,映射表达式和索引名)

    当偶尔来这样做时,我不会把它当作一个错误来看待,但是这样缺乏设计的机制让我很烦恼。在我遇到的所有分页API中,预期的行为始终是获取查询的下一组结果,而不是中途可以做其他查询。这样做并不合理,实际上都不把这样的机制叫做分页,更应该称其为导航!合理的做法应该是从之前接收的页面更改分页的方向。当我们在本文中进一步讨论双向分页时,将对此进行更详尽的介绍。

    单向带cursor的分页


    对于单向分页,我首选的做法是使用简单的cursor。这里重要的一个点是要使cursor变的无意义。

    对于客户端而言,当有更多的结果要提取时,服务器应该在响应中返回一个Blob。客户端不应该从中获取任何实现细节,唯一可以做的是在下一个请求中通过cursor将其发送出去。

    f420c538749e86060eb3f57fb6540348.png

    API怎样知道从哪里开始获取下一页数据


    一个简单的做法是这样的:

    • 创建一个JSON对象去捕获需要获取的下一页数据——例如:如果你用的是DynamoDB,那么就是请求下一页对象(包含ExclusiveStartKey)
    • 用base64将JSON字符串编码
    • 将base64 blob作为cursor返回

    当我们收到下一页请求时,我们可以简单的用相反的流程从请求中获取我们创建的JSON对象。

    如果其他人用base64去解码blob呢

    这是肯定的,所以你可以选择先把JSON进行加密。你也可以选择不把DynamoDB请求作为分页基础。

    你是否注意到了,在图1和图2的例子中,客户端仅在后续请求中发送cursor?这是设计使然。

    我之前提到过,客户端已经告诉我们请求是第一次请求,分页机制只在后续的请求中提供分页信息。对于我来说,这意味着分页机制不应该包含任何其他行为,除了上一次请求的cursor。反过来说,这意味着我们需要在curor中捕获取原始查询条件,以便我们构造数据库查询语句。或者我们在cursor中获取实际数据库请求,这似乎又是一个简单而实用的解决方案。

    2031c48607885b6a7e57437c4517d639.png

    双向分页中使用cursor

    使用双向分页时,你需要能够及时向前(将新的内容添加到时间线中)和向后(获取旧的内容)进行分页。因此简单的字符串cursor已经不能满足需求,我们需要两个cursor,每个方向使用一个例如:

    {    "before": "iwnVn1a8N",    "after": "M82B111C"}

    此外,在向前分页时,即使没有更多的结果,我们仍需要返回cursor,因为以后可以将新结果集添加到源中。因为我们还需要一对布尔标识:

    {    "before": "iwnVn1a8N",    "hasBefore": true,    "after": "M82B111C",    "hasAfter": true}

    当客户端获取分页信息并接收到 hasAfter标识为 false时,它就知道后续暂时没有更多结果。因此它可以决定不去主动获取下一页的结果,而变为被动定期轮询新结果。

    让我们用一个简单的例子来说明一下,想象一下如果你推特的时间线中获取推文,那么API会首先返回最新的推文。

    ae1039470dc98404323ca3169006851c.png
    • 客户端开始发出第一个请求
    • API返回一个带cursor的结果对象,因为是最后一页结果集, hasAfter标识为 false,但是 hasBefore标识为 true,因为较早的内容是有的
    • 客户端将前一个cursor加入到第二个请求中,然后发出请求,这使得其目标清晰明确
    • API返回另一个携带 hasBefore和 hasAfter都为 `true的curor对象,因为我们正好在结果流的中间
    • 客户端发出第三个也就是最后一个请求,再次仅传递从前一个响应接收到的before cursor
    • API返回一个 hasBefore为 false的cursor对象,应该我们已经没有更旧的结果了

    好的,让我们再运行另一个例子,这次我们按时间线向前翻页。

    fdd2d02a87c0119c6d71b8d5ad918f92.png
    • 客户端发出了第一个请求
    • API返回一个带cursor的结果对象, hasAfter为 false因为API返回的是最新结果集,而 hasBefore为 true因为较旧的结果集还有
    • 过了一段时间,有更多的新结果了
    • 客户端发出了第二个请求,仅将'after cursor'在加入到了请求中,让目标清晰明确
    • API仅以客户端未收到的新结果集作为响应,而响应中的cursor.hasAfter为false,因为这次返回的为最新结果;如果客户端很快又向后翻页,那么它会收到与API第一个响应相同一结果

    现在,让我们回到之前提过的分页过程中偶尔需要改变方向的问题。

    我们分页的原因是因为将所有的结果集一次性返回是不切实际而且低效的,例如:把凯蒂·佩里的108M的推特粉丝列表在一次请求-响应的过程中返回,那么服务器和app都会瘫掉。

    除了限制在一次请求-响应过程中返回数据的多少之外,我们还需要对app将缓存的数据量设置上限,以提升用户体验防止app崩溃。

    e9aada4fca060ffe2f7b68ae4fb35a5f.png

    这意味着,在某个时间点,随着用户不断滚动浏览旧推文,客户端将需要开始删除已获取的数据,否则可以会将内存耗尽。也就是说,当用记向后举动查看推文时,客户端将需要重新获取已删除的数据,从而反转分页的原始方向。

    10c76a3a05cb39146712ff4bb396df21.png

    幸运的是上面所述的方案足够灵活,可以满足你做到这一点。每一页结果都有一个关联的cursor,使你可以从任何方向获取到下一页。因此如果你需要获取被销毁的页面数据,就像你获取最新页面一样简单。

    f73fd2eb2b14ea6b44c97cf075a0b353.png

    处理间隔

    还是拿推特的例子来说。如果关闭推特app后,过段时间再打开推特,你发现推文已经被缓存到了app中;你也就意识到所有的从缓存中进行分页的方法不够灵活。相反,客户端可以使用非分页请求获取最新的推文。向下滚动时客户端按照图中所示的方法用自动获取较旧的页面,并填补间隔,直到它与缓存的数据结合在一起。

    3afd63543a3094818954c6030f395194.png

    推特app的策略随着时间的推移发生了改变,我看到的另一种策略是在时间轴中放一个可视可点击的标记,以标记缺失的推文。这使得用户有了可以选择的空间,来自己决定是否翻阅旧的推文来填补间隔。

    这就是我分享的实现单向和双向分页的简单有效的方法,希望它对你有用!

    展开全文
  • 问题:Action中进行列表页面操作报错,跟踪后发现是PageBean分页查询SQL报错 原因:分页实现类,可以进行排序操作,设置排序字段、排序顺序 而此时mapper.xml中也添加了order by 操作 最终SQL变为: ...
  • SQLSERVER 高效分页查询

    2013-01-30 22:27:00
    为什么80%的码农都做不了架构师?>>> ...
  • <... <... ...图中第一,二页结果是一样的,我在sql server2005的查询分析器上自己查询出来却又是正确,不过不用模糊查询的话,分页显示的结果倒是正确的。为什么会导致这样的结果?求大神指点。
  • 一、为什么要用分页查询 二、怎样用分页查询 三、存储过程编写 四、后台获取结果集
  • 为什么不写成这样: select T.* ,ROWNUM RN from tableName T where ROWNUM <=${pageNumber}*${pageSize} andROWNUM >(${pageNumber}-1)*${pageSize} 这样写是永远查不出结果的,原因如下: rownum是查询...
  • 分页查询

    2020-05-18 13:56:51
    思考:为什么要分页? 减少数据的处理量 1、使用Limit分页 语法:select * from user limit startIndex,pageSize; select * from user limit 3;#[0,n] 使用Mybatis实现分页,核心SQL 接口 /** * 分页查询 * ...
  • 作者:大神养成记主页:https://www.cnblogs.com/geningchao方法1: 直接使用数据库提供的SQL语句语句样式:MySQL中,可用如下方法: SELECT * FROM 表名称 LIMIT M,N适应场景:适用于数据量较少的情况(元组百/千级)原因/...
  • 作者:大神养成记主页:https://www.cnblogs.com/geningchao方法1: 直接使用数据库提供的SQL语句语句样式:MySQL中,可用如下方法: SELECT * FROM 表名称 LIMIT M,N适应场景:适用于数据量较少的情况(元组百/千级...
  • Oracle SQL分页

    2011-04-26 19:10:11
    select *from (select a1.*,rownum rwn from (select * from emp) a1 where ...=10放在前面,把rwn放在后面,互换为什么查询不了?还有就是前面要用rownum,而后面一定要用rwn才可以查询出来?     rownum是o...
  • 本文实例讲述了easyUI 实现的后台分页与前台显示功能。分享给大家供大家参考,具体如下:之前我写过...后台分页其实也很简单:每次只 sql 语句只查询前台某一页需要的数据。所以需要前台给后台传两个数据:pageNumb...
  • 最近用在使用JPA做项目,虽然JPA使用起来比mybatis方便,但是涉及到多表关联查询的时候就麻烦,往往需要自己写SQL语句。但是如果查询的时候条件不确定,比如说:查询员工可以通过工号或者姓名来查询。我们不知道他要...
  • 前言 之前我们讲过了mybatis的...为什么要将分页特意做一遍? Mybatis的分页功能很弱,它是基于内存的分页(查出所有记录再按偏移量offset和边界limit取结果),在大数据量的情况下这样的分页基本上是没有用的。 解析myba
  • 在我们日常开发中,分页查询是必不可少的,可以说每干后端程序猿大部分时间都是CURD,所以分页的查询也接触的不少,你们都是怎么实现的呢?前不久的一段时间,我的一个同事突然找我寻求帮助,他说他写的sql查询太慢...
  • 作者:大神养成记转载来源:http://sina.lt/gauW方法1: 直接使用数据库提供的SQL语句语句样式: MySQL中,可用如下方法:SELECT * FROM 表名称 LIMIT M,N适应场景: 适用于数据量较少的情况(元组百/千级)原因 / 缺点: 全...
  • 在我们日常开发中,分页查询是必不可少的,可以说每个后端程序猿大部分时间都是CURD,所以分页的查询也接触的不少,你们都是怎么实现的呢?前不久的一段时间,我的一个同事突然找我寻求帮助,他说他写的sql查询太慢...
  • 打开UC浏览器 查看更多精彩图片方法1: 直接使用数据库提供的SQL语句语句样式: MySQL中,可用如下方法: SELECT * FROM 表名称 LIMIT M,N适应场景: 适用于数据量较少的情况(元组百/千级)原因/缺点: 全表扫描,速度会很慢...
  • 为什么80%的码农都做不了架构师?>>> ...
  • 在我们日常开发中,分页查询是必不可少的,可以说每干后端程序猿大部分时间都是CURD,所以分页的查询也接触的不少,你们都是怎么实现的呢?前不久的一段时间,我的一个同事突然找我寻求帮助,他说他写的sql查询太慢...
  • mybatis动态sql分页

    2020-10-15 10:22:28
    mybatis动态sql分页mybatis动态sql模糊查询查询返回结果集的处理分页为什么要重写mybatis的分页?特殊字符处理全部代码 mybatis动态sql 1, trim :去空格 2,foreach 遍历集合,批量查询、通常用于in关键字 ...
  • SQLServer分页

    2016-06-12 10:36:00
    1、为什么分页? 当显示数据的时候,我们不会一下子把所有的数据都显示出来,比如说表中有一万条数据,难道我们要把一万条数据都一次性的显示出来吗?!即便显示给用户了,用户也看不过来。因此,不论是从效率的...
  • 使用es-sql聚合查询时,发现无法进行分页操作。   结果16条:   当使用limit语法进行分页之后,发现并没有效果(以取5条记录一页例)。 首先查询前5条记录: 返回的记录如下图:   然后再...
  • 在Oracle中使用分页查询什么是分页查询为什么要分页在哪分页Oracle的ROWNUMOracle如何写分页SQL 什么是分页查询 分页查询就是将所要浏览的内容进行合理分页,方便用户查询观看。用户每次看到的不是全部,而是其中一...

空空如也

空空如也

1 2 3 4 5 ... 18
收藏数 354
精华内容 141
关键字:

为什么sql分页查询