今天遇到一个关于“查询指定行数的数据”的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

品略图书馆 http://www.pinlue.com/