`

sql语句中限制结果集行数

    博客分类:
  • sql
阅读更多

sql语句中限制结果集行数

  在进行数据检索的时候有时候需要只检索结果集中的部分行,比如说“检索成绩排前三
名的学生”、“检索工资水平排在第3位到第7位的员工信息”,这种功能被称为“限制结果集
行数”。在虽然主流的数据库系统中都提供了限制结果集行数的方法,但是无论是语法还是
使用方式都存在着很大的差异,即使是同一个数据库系统的不同版本(比如MSSQLServer2000
和MSSQLServer2005)也存在着一定的差异。因此本节将按照数据库系统来讲解每种数据库
系统对限制结果集行数的特性支持。

1,Mysql

  MYSQL中提供了LIMIT关键字用来限制返回的结果集,LIMIT放在SELECT语句的最后位置,
语法为“LIMIT 首行行号,要返回的结果集的最大数目”。比如下面的SQL语句将返回按照工
资降序排列的从第二行开始(行号从0开始)的最多五条记录:
SELECT * FROM T_Employee ORDER BY FSalary DESC LIMIT 2,5

2,Oracle

  Oracle中支持窗口函数ROW_NUMBER(),其用法和MSSQLServer2005中相同,

  ROW_NUMBER()函数可以计算每一行数据在结果集中的行号(从1开始计数),其使用语法
如下:
ROW_NUMBER OVER(排序规则)

 

 

比如我们执
行下面的SQL语句: 

SELECT * FROM 
( 
SELECT ROW_NUMBER() OVER(ORDER BY FSalary DESC) row_num, 
FNumber,FName,FSalary,FAge FROM T_Employee 
) a 
WHERE a.row_num>=3 AND a.row_num<=5 

  

  Oracle支持标准的函数ROW_NUMBER(),不过Oracle中提供了更方便的特性用来计算行号,
也就在Oracle中可以无需自行计算行号,Oracle为每个结果集都增加了一个默认的表示行号
的列,这个列的名称为rownum。比如我们执行下面的SQL语句: 

SELECT rownum,FNumber,FName,FSalary,FAge FROM T_Employee 

  

  使用rownum我们可以很轻松的取得结果集中前N条的数据行,比如我们执行下面的SQL
语句可以得到按工资从高到底排序的前6名员工的信息: 

SELECT * FROM T_Employee 
WHERE rownum<=6 
ORDER BY FSalary Desc 

  

  看到这里,您可能认为下面的SQL就可以非常容易的实现“按照工资从高到低的顺序取
出第三个到第五个员工信息”的功能了: 

SELECT rownum,FNumber,FName,FSalary,FAge FROM T_Employee 
WHERE rownum BETWEEN 3 AND 5 
ORDER BY FSalary DESC 

 

  执行完毕我们就能在输出结果中看到下面的执行结果: 

ROWNUM  FNUMBER  FNAME  FSALARY  FAGE 

 

  检索结果为空!!!这非常出乎我们的意料。让我们来回顾一下rownum的含义:rownum
为结果集中每一行的行号(从1开始计数)。对于下面的SQL: 

SELECT * FROM T_Employee 
WHERE rownum<=6 
ORDER BY FSalary Desc 

 

  当进行检索的时候,对于第一条数据,其rownum为1,因为符合“WHERE rownum<=6”
所以被放到了检索结果中;当检索到第二条数据的时候,其rownum为2,因为符合“WHERE
rownum<=6”所以被放到了检索结果中……依次类推,直到第七行。所以这句SQL语句能够实
现“按照工资从高到低的顺序取出第三个到第五个员工信息”的功能。
  而对于这句SQL语句: 

SELECT rownum,FNumber,FName,FSalary,FAge FROM T_Employee 
WHERE rownum BETWEEN 3 AND 5 
ORDER BY FSalary DESC 

 

  当进行检索的时候,对于第一条数据,其rownum为1,因为不符合“WHERE rownum

BETWEEN 3 AND 5”,所以没有被放到了检索结果中;当检索到第二条数据的时候,因为第
一条数据没有放到结果集中,所以第二条数据的rownum仍然为1,而不是我们想像的2,所以因
为不符合“WHERE rownum<=6”,没有被放到了检索结果中;当检索到第三条数据的时候,
因为第一、二条数据没有放到结果集中,所以第三条数据的rownum仍然为1,而不是我们想像

的3,所以因为不符合“WHERE rownum<=6”,没有被放到了检索结果中……依此类推,这样
所有的数据行都没有被放到结果集中。
  因此如果要使用rownum来实现“按照工资从高到低的顺序取出第三个到第五个员工信息”
的功能,就必须借助于窗口函数ROW_NUMBER()。

 

3,MsSqlServer2000

  MSSQLServer2000中提供了TOP关键字用来返回结果集中的前N条记录,其语法为
“SELECT  TOP 限制结果集数目  字段列表  SELECT语句其余部分”,比如下面的SQL语句用来
检索工资水平排在前五位(按照工资从高到低)的员工信息: 

select top 5 * from T_Employee order by FSalary Desc 

  

  MSSQLServer2000没有直接提供返回提供“检索从第5行开始的10条数据”、“检索第五行
至第十二行的数据”等这样的取区间范围的功能,不过可以采用其他方法来变通实现,最常
使用的方法就是用子查询
,比如要实现检索按照工资从高到低排序检索从第六名开始一共
三个人的信息,那么就可以首先将前五名的主键取出来,在检索的时候检索排除了这五名员
工的前三个人,SQL如下:

SELECT top 3 * FROM T_Employee 
WHERE FNumber NOT IN 
(SELECT TOP 5 FNumber FROM T_Employee ORDER BY FSalary DESC) 
 ORDER BY FSalary DESC  

 

分享到:
评论

相关推荐

    SQL 语句 帮助文档

    - **集合操作**:UNION、INTERSECT和EXCEPT用于合并或比较结果集。 - **存储过程**:预编译的SQL语句集合,可封装复杂的逻辑并重复使用。 - **触发器**:在特定数据更改事件(如INSERT、UPDATE或DELETE)发生时...

    sql语句妙用,各种sql语句的详细用法与讲解

    - 限制返回行数:`TOP n`用于限制返回的行数,如`SELECT TOP 2 * FROM testtab`会返回表的前两行;`TOP n PERCENT`则按百分比返回数据,如`SELECT TOP 20 PERCENT * FROM testtab`返回总行数的20%。 以上只是SQL...

    SQL语句使用教程

    你可以根据需要选择特定的列,使用WHERE子句进行条件过滤,GROUP BY进行数据分组,HAVING来筛选分组后的结果,ORDER BY进行排序,以及LIMIT来限制返回的行数。 2. INSERT语句:当你需要向数据库中添加新记录时,...

    sql语句规范

    * 在可能的情况下,限制结果集的行数,以减少网络负担 * 避免数据类型的隐性转换,以提高数据库的性能 2.WHERE 子句规范 * 避免在 WHERE 子句中对字段使用函数或表达式操作,以免引擎放弃索引 * 使用 LIKE 语句时...

    SQL_Server,Oracle,DB2数据库SQL语句比较

    `FETCH FIRST`是DB2中用于限制结果集行数的语法。 ### 2. 获取当前日期 SQL Server中使用`SELECT GETDATE()`返回当前的日期和时间。 Oracle中使用`SELECT SYSDATE FROM DUAL`获取当前系统时间。DUAL是一个特殊的...

    经典sql语句笔记(sql 关键字)

    不同的SQL语句可能涉及不同的参数,如`LIMIT`语句中的偏移量和限制数量,`INSERT`语句中的列名和值列表,`UPDATE`语句中的设置的新值等。具体参数取值需根据具体查询和数据库系统而定。 总的来说,SQL是一门强大的...

    SQL语句总结

    10. **子查询(Subqueries)**:子查询是在另一个查询内部的查询,它可以作为外部查询的一部分,提供临时的结果集。 11. **连接(Joins)**:除了基础的JOIN操作,还有自连接(Self JOIN)和多表连接,用于处理涉及...

    常用的SQL语句.pdf

    【SQL语句基础】 SQL(Structured Query Language)是用于管理和处理关系数据库的标准语言,它包含了数据查询、数据更新、数据插入和数据删除等操作。SQL并非一种完整的编程语言,而是一种特殊的、高度结构化的查询...

    SQL-usage.zip_sql+usage_sql语句中usage

    你可以根据需要选择一个或多个列,也可以使用WHERE子句过滤结果,GROUP BY进行数据分组,HAVING用于对分组后的数据进行条件筛选,ORDER BY进行排序,LIMIT限制返回的行数,甚至使用JOIN操作连接多个表的数据。...

    sql中as的用法和一些经典的sql语句.doc

    "SQL中的AS用法和经典SQL语句整理" SQL语言中,AS关键字用于为表或列指定别名,以便于查询和简化语句。在本文中,我们将总结一些常用的SQL语句,并解释AS用法的细节。 一、DELETE语句 DELETE语句用于删除表中的...

    sql server 2005 使用笔记之常用函数和经典sql语句

    在SQL Server 2005中,数据库管理和数据查询是其核心功能,而函数和SQL语句则是实现这些功能的重要工具。这篇笔记主要探讨的是SQL Server 2005中的常用函数以及一些经典的SQL语句,这对于数据库管理员和开发人员来说...

    50个常用sql语句.rar

    27. **TOP关键字**:在某些SQL方言中,用于限制返回的行数,通常与ORDER BY一起使用。 28. **LEFT JOIN、RIGHT JOIN和FULL JOIN**:不同类型的JOIN操作,用于包含左表、右表或两者的所有记录。 29. **PIVOT和...

    mysql查询语句通过limit来限制查询的行数

    例如,下面的SQL语句将会选取`usertb`表中`age`大于20的用户,但只返回第一行的结果: ```sql SELECT name FROM usertb WHERE age &gt; 20 LIMIT 0, 1; ``` 这里`0`是偏移量,表示从第一行开始(因为索引是从0开始的...

    非常全面的sql语句全集

    从给定的文件信息中,我们可以提炼出一系列与SQL相关的知识点,这些知识涵盖了从基本的SQL语句到高级的数据操作技巧。以下是对标题、描述、以及部分列出的内容进行的详细解读: ### SQL语言概述 SQL(Structured ...

    jdbc 分页 sql语句

    2. **ROWNUM与子查询结合**:接下来,在外层查询中使用`ROWNUM`来限制返回的结果集行数。这里使用了一个技巧性的方法: - 首先,给内层查询加上`ROWNUM`,并命名为`rw`。 - 然后,再次使用子查询,将内层查询的...

    SQL语句教程大全

    ### SQL语句教程大全 #### 一、SQL基础指令概览 SQL(Structured Query Language),即结构化查询语言,是一种用于管理关系型数据库的标准语言。它不仅被用于数据的存储和检索,还广泛应用于数据的更新、删除以及...

    SQL语句大全(存储过程、函数、基本语法)

    这个压缩包中的"SQL语句大全"很可能是一个详细的指南,涵盖了SQL的各种方面,包括基本语法、函数以及存储过程。下面将对这些主题进行深入的阐述。 首先,SQL的基本语法是所有查询的基础。它包括了SELECT语句,用于...

    sql语句使用经典例子

    以下将详细解释标题和描述中提到的经典SQL语句使用例子。 1. **数据表的查询 (SELECT)** - `SELECT`语句用于从数据表中选取指定的字段。例如: ```sql SELECT id, gsmc, add, tel FROM haf; ``` - 使用`*`表示...

    SQL语句中SELECT语句的执行顺序

    ### SQL语句中SELECT语句的执行顺序 在SQL语言中,`SELECT`语句是进行数据查询的核心工具。为了确保查询结果的准确性和效率,理解`SELECT`语句内部的执行顺序至关重要。本文将详细解析`SELECT`语句各子句的执行...

    经典SQL语句大全

    右外连接(右连接):结果集既包括连接表的匹配连接行,也包括右连接表的所有行。 C:full/cross (outer) join: 全外连接:不仅包括符号连接表的匹配行,还包括两个连接表中的所有记录。 12、分组:Group by: ...

Global site tag (gtag.js) - Google Analytics