分享

SQL 查询指定行数的数据

 昵称6141201 2012-12-30

今天遇到一个关于“查询指定行数的数据”的sql查询语句问题,突然发现以前没怎么接触过,刚才想起来了,赶紧看了下文档,又上网搜了下,有了下面的东西,不知道有没有什么地方不对?

oracle:
先看一下文档中关于any和all的例子,很不错噢。
Any 
示例:
select * from emp where sal>ANY(select sal from emp where deptno=30) and deptno<>30;
--找出比deptno=30的员工最低工资高的其他部门的员工

ALL 
select * from emp where sal>ALL(select sal from emp where deptno=30) and deptno<>30;
--找出比deptno=30的员工最高工资高的其他部门的员工

 

查询指定行数的数据
SELECT <字段列表> from <table_name> WHERE ROWNUM<行数;
示例:
select * from emp where rownum<=10;--查询前10行记录
注意ROWNUM只能为1 因此不能写 select * from emp where rownum between 20 and 30;

要查第几行的数据可以使用以下方法:
select * from emp where rownum<=3 and empno not in (select empno from emp where

rownum<=3);
结果可以返回整个数据的4-6行;
不过这种方法的性能不高;如果有别的好方法请告诉我。(这是文档中的)

(今天用数据库做了一下,才发现以前自以为是的把第一个rownum<=3给改成了rownum<=6是错误的,这个查询语句的意思是:查找不是前三行的数据中的前三行数据,即每4-6行数据,而不是原来的3-6行。

同样查询11-20行如下:

select * from table_name  where rownum <=10 and id not in (select id from table_name where rownum <=10)

)


mysql:
  LIMIT子句可以被用于限制被SELECT语句返回的行数。LIMIT取一个或两个数字自变量,自变量必

须是非负的整数常数(当使用已预备的语句时除外)。

使用两个自变量时,第一个自变量指定返回的第一行的偏移量,第二个自变量指定返回的行数的最

大值。初始行的偏移量为0(不是1):

mysql> SELECT * FROM tbl LIMIT 5,10;  # Retrieve rows 6-15
为了与PostgreSQL兼容,MySQL也支持LIMIT row_count OFFSET offset语法。

如果要恢复从某个偏移量到结果集合的末端之间的所有的行,您可以对第二个参数是使用比较大的

数。本语句可以恢复从第96行到最后的所有行:

mysql> SELECT * FROM tbl LIMIT 95,18446744073709551615;
使用1个自变量时,该值指定从结果集合的开头返回的行数:

mysql> SELECT * FROM tbl LIMIT 5;     # Retrieve first 5 rows
换句话说,LIMIT n与LIMIT 0,n等价。

对于已预备的语句,您可以使用位置保持符。以下语句将从tb1表中返回一行:

mysql> SET @a=1;
mysql> PREPARE STMT FROM "SELECT * FROM tbl LIMIT ?";
mysql> EXECUTE STMT USING @a;
以下语句将从tb1表中返回第二到第六行:

mysql> SET @skip=1; SET @numrows=5;
mysql> PREPARE STMT FROM "SELECT * FROM tbl LIMIT ?, ?";
mysql> EXECUTE STMT USING @skip, @numrows;


sqlserver
我想查询一个表中的10-20行的数据,应该怎么查询吖,ID列不连续。
select top 20 * from 表名 where id not in (select top 10 id from 表名) 
取n到m条记录的语句   
    
  1.   
  select   top   m   *   from   tablename   where   id   not   in   (select   top   n  

*   from   tablename)   
    
  2.   
  select   top   m   *   into   临时表(或表变量)   from   tablename   order   by  

columnname   --   将top   m笔插入   
  set   rowcount   n   
  select   *   from   表变量   order   by   columnname   desc   
    
  3.   
  select   top   n   *   from     
  (select   top   m   *   from   tablename   order   by   columnname)   a   
  order   by   columnname   desc   
    
    
  4.如果tablename里没有其他identity列,那么:   
  select   identity(int)   id0,*   into   #temp   from   tablename   
    
  取n到m条的语句为:   
  select   *   from   #temp   where   id0   >=n   and   id0   <=   m   
    
  如果你在执行select   identity(int)   id0,*   into   #temp   from   tablename这条语句

的时候报错,那是因为你的DB中间的select   into/bulkcopy属性没有打开要先执行:   
  exec   sp_dboption   你的DB名字,'select   into/bulkcopy',true   
    
    
  5.如果表里有identity属性,那么简单:   
  select   *   from   tablename   where   identitycol   between   n   and   m   

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多