设为首页 收藏本站
查看: 1751|回复: 1

[经验分享] “取出数据表中第10条到第20条记录”的sql语句+select top 用法

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2014-12-23 10:37:27 | 显示全部楼层 |阅读模式
select * from table --  取所有数据,返回无序集合
select top n * from table  -- 根据表内数据存储顺序取前n条,返回无序集合
select * from table order by id desc -- 取所有数据,按id逆序返回有序列表
select top n * from table order by id desc-- 先按id逆序,再取前n条,返回按id排序的有序集合【注意,按某个属性排序,该排序属性的数据列值最好是不重复的,如果有重复的,那排序属性值相等的这些行在结果集中的顺序事先是不能确定的】
  栗子如下~ Center.jpg
我们以pid作为排序属性值,第16行,第19行和第20行的pid值相等。现在取以pid排序的倒数5条记录:
Connection con=new SQLConnection().getConnection();
String sql="select top 5 * from test order by pid desc";

System.out.println("select begins...");
Statement statement=con.createStatement();  
ResultSet result =  statement.executeQuery(sql);   
while (result.next()) {  
        System.out.println(result.getInt(1)+","+result.getString(2)+","+result.getString(3));  
}
System.out.println("select ends...");
con.close();
statement.close();
result.close();
con=null;
statement=null;
result=null;


结果:
select begins...
3,as,9
16,tt,8  【三者顺序事先不能确定】
19,gh,8
20,jk,8
6,bb,7
select ends...



2. 类似于“查询第10条到第20条记录”的sql语句写法 ===  常应用于分页显示上


1) String sql="select  top 10 * from (select * from test where id<21) m order by m.id desc"; //注意id为主键,子查询取出前20条记录,主查询先降序再取前10条,但结果是降序的,所以后续处理时要注意


2)查询第m条到第n条记录:
String sql="select top n-m+1 * from test where (id not in(select top m-1 id from test))"; //可以是正常顺序的第m条到第n条记录写法,很推荐哦~



3)【有些小毛病,我自己也不知道错在哪了,写出来,若有某位看客知道烦请留言一下哦~】
  String sql = "select top 10 * from  (select top 20 * from test) a order by a.id desc";
以上述表中数据试了一下,结果是:【为什么是从第12条到第21条嘞?想不明白】
21,kl,100
20,jk,8
19,gh,8
18,aas,18
17,qw,19
16,tt,8
15,ww,15
14,hh,13
13,gg,16
12,ui,11

   
关于3)的疑惑,在博客园找到这样一处文章《来谈谈SQL数据库中"简单的"SELECT TOP—可能有你从未注意到的细节
-------------------------------引用开始-----------------------------------

数据表如下:
ID  EMPNO  NAME  AGE  
1   26929   Jerome   28
2   28394   Quince  27
3   20983   Green   30
4   27189   Mike     30
5   23167   Arishy   30
6   26371   Yager   29
我写了SQL语句想取得第3、4笔数据,测试分页玩的。
select  top 2 * from (select top 4 * from Member ) m  order by m.RowID desc
我执行中间那一段子查询:select top 4 * from Member
取得的是:
1   26929   Jerome   28
2   28394   Quince  27
3   20983   Green   30
4   27189   Mike     30
但是整个SQL语句的结果却是:【确实遇到过这样的问题,但是不知道原因....】
5   23167   Arishy   30
6   26371   Yager    29

  select top 2 * from (select top 4 * from table) m order by m.id desc ----- 扫描完table后先降序然后再在4行中取2行   【有点疑问,不是扫描完table--取4行--降序--取2行么??】  select top 2 * from (select top 4 * from table order by id asc) m order by m.id desc ----- 扫描完table后先升序取4行然后再把这4行降序取2行


问题涉及到SQL中的子查询:
出现在from子句中的表我们称为派生表。派生表是虚拟的,未被物理具体化,也就是说当编译
的时候,如(select top 2 * from (select top 4 * from table) m order by m.id
desc ),外部查询和内部查询会被合并,并生成一个计划。

(注意事项:在派生表里面一般不允许使用order by除非指定了top,也就是说select top
2 * from (select * from zhuisuo order by id asc) m order by m.id desc这句语句是不
能执行的)。派生表是个虚拟表要被外部引用,而order by返回的不是表而是游标.所以只用order by的话是被限制的。然而为什么使用top加order by又可以了?是因为top可以从order by返回的游标里选择指定数量生成一个表并返回。

再举例关于top需要注意的细节
1、使用top返回随机行,很多人会想到用RAND函数从而得到这样一个语句
select top 4 id,name from table order by rand();
经过多次查询后,你会失望的发现它没有返回随机行。这是因为每个查询只调用它一次而不是每
行调用它一次。
2、注意insert中使用top,正确的倒叙插入top方法应该是:
insert into table
select  top (4) * from table order by id desc
------------------------------引用结束----------------------------
详细见原博客,关于top的细节,还是没有搞明白呢,往后再多看看-多实践再总结咯


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-38496-1-1.html 上篇帖子: Unable to start MySQL service. Another MySQL daemon is already running with the 下篇帖子: 使用MySQL的yum源安装MySQL5.7 sql语句 数据表 记录
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表