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

1.首先,select top用法:

参考问题  select top n * from和select * from的区别

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)的疑惑,在博客园找到这样一处文章《来谈谈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的细节,还是没有搞明白呢,往后再多看看-多实践再总结咯



好的,`LIMIT` 是 SQL 中非常有用的子句之一,主要用于限制查询结果返回的数。它常用于分页显示、获取Top N记录等场景。下面将详细介绍它的用法及一些相关的技巧。 ### 1. **LIMIT 的基本用途** #### 功能: `LIMIT` 主要用于限定 `SELECT` 查询返回的结果集大小。它可以确保只返回特定数量的数据,特别适合处理大数据量时减少服务器负担和提高响应速度。 #### 基础语法: ```sql SELECT 列名1, 列名2, ... FROM 表名 WHERE 件 ORDER BY 排序字段 LIMIT n; ``` 其中,`n` 是你要限制的最大数。 #### 示例: 假设我们有一个名为 `employees` 的表,包含员工信息: - 获取工资最高的前五位员工: ```sql SELECT name, salary FROM employees ORDER BY salary DESC LIMIT 5; ``` - 获取前十最新入职的员工记录: ```sql SELECT * FROM employees ORDER BY hire_date DESC LIMIT 10; ``` ### 2. **带偏移量的 LIMIT (分页)** 有时我们需要实现分页效果,即每次加载一部分数据而不是全部一次性展示出来。这时可以使用带有偏移量 (`OFFSET`) 的 `LIMIT` 实现这一目标。 #### 进阶语法: ```sql SELECT 列名1, 列名2, ... FROM 表名 WHERE 件 ORDER BY 排序字段 LIMIT m OFFSET n; ``` 这里, - `m` 是每页返回的记录数目; - `n` 是跳过的记录数目(即起始位置),通常配合页面编号计算而来:`(page_number - 1) * page_size`。 #### 示例: 假设有一页最多显示10记录,当前处于第3页,则语句为: ```sql SELECT * FROM articles ORDER BY publish_time DESC LIMIT 10 OFFSET 20; ``` 这SQL表示从第21开始取10记录作为第三页的内容。(因为 `(3 - 1) * 10 = 20`) ### 3. **注意事项** - **索引优化**:当涉及到排序(`ORDER BY`) 和分页(`LIMIT...OFFSET`) 结合时,为了提升效率最好保证所使用的列上有合适的索引。 - **性能考量**:随着 `OFFSET` 数字增大,查询性能可能会下降。这是因为数据库引擎需要扫描更多的才能到达指定的位置再取出所需的部分。因此对于深度分页的情况建议探索其他方案如键集分页或游标。 - **MySQL 特殊写法**:在 MySQL 中也允许简化的形式书写 `LIMIT` 子句——直接给出两个数值,前者代表偏移量而后者是限制的数量,例如上述例子也可以写作: ```sql SELECT * FROM articles ORDER BY publish_time DESC LIMIT 20, 10; -- 第一个参数为偏移量,第二个为限制数 ``` 不过这种写法不够直观且跨数据库兼容性较差,推荐还是采用标准的形式。 ### 总结 `LIMIT` 提供了一种简单有效的方式来控制查询结果的数量及其分布情况,尤其适用于前端应用中的列表分页等功能模块中。掌握好这个工具能帮助开发者写出既高效又实用的SQL代码! ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值