博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
“取出数据表中第10条到第20条记录”的sql语句+select top 使用方法
阅读量:6232 次
发布时间:2019-06-22

本文共 3127 字,大约阅读时间需要 10 分钟。

1.首先。select top使用方法:

參考问题  

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排序的有序集合【注意,按某个属性排序。该排序属性的数据列值最好是不反复的。假设有反复的。那排序属性值相等的这些行在结果集中的顺序事先是不能确定的】

  栗子例如以下~

 

我们以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)的疑惑。在博客园找到这样一处文章《》

-------------------------------引用開始-----------------------------------

数据表例如以下:

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的细节,还是没有搞明确呢,往后再多看看-多实践再总结咯

你可能感兴趣的文章
ObjectOutputStream和ObjectInputStream
查看>>
nagios客户端未启动报错
查看>>
南京大学周志华教授当选欧洲科学院外籍院士
查看>>
《OpenGL ES应用开发实践指南:Android卷》—— 1.3 初始化OpenGL
查看>>
马士兵教学语录
查看>>
计算机网络与Internet应用
查看>>
MongodDB学习笔记(二)(复制)
查看>>
oracle在线迁移同步数据,数据库报错
查看>>
linux性能剖析工具
查看>>
VS2005环境下采用makefile编译、使用libjpeg.lib函数库
查看>>
EBS多语言
查看>>
说说设计模式~ 模版模式(Template)
查看>>
【linux】文件隐藏属性
查看>>
Java 命名规则
查看>>
RTC设备驱动
查看>>
小公司的管理
查看>>
无废话WCF入门教程三[WCF的宿主]
查看>>
iOS手势识别的详细使用(拖动,缩放,旋转,点击,手势依赖,自定义手势)
查看>>
详细解析:如何制作嵌入式Linux文件系统
查看>>
C# 两个独立exe程序直接通信
查看>>