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
分享到:
相关推荐
- **集合操作**:UNION、INTERSECT和EXCEPT用于合并或比较结果集。 - **存储过程**:预编译的SQL语句集合,可封装复杂的逻辑并重复使用。 - **触发器**:在特定数据更改事件(如INSERT、UPDATE或DELETE)发生时...
你可以根据需要选择特定的列,使用WHERE子句进行条件过滤,GROUP BY进行数据分组,HAVING来筛选分组后的结果,ORDER BY进行排序,以及LIMIT来限制返回的行数。 2. INSERT语句:当你需要向数据库中添加新记录时,...
* 在可能的情况下,限制结果集的行数,以减少网络负担 * 避免数据类型的隐性转换,以提高数据库的性能 2.WHERE 子句规范 * 避免在 WHERE 子句中对字段使用函数或表达式操作,以免引擎放弃索引 * 使用 LIKE 语句时...
`FETCH FIRST`是DB2中用于限制结果集行数的语法。 ### 2. 获取当前日期 SQL Server中使用`SELECT GETDATE()`返回当前的日期和时间。 Oracle中使用`SELECT SYSDATE FROM DUAL`获取当前系统时间。DUAL是一个特殊的...
不同的SQL语句可能涉及不同的参数,如`LIMIT`语句中的偏移量和限制数量,`INSERT`语句中的列名和值列表,`UPDATE`语句中的设置的新值等。具体参数取值需根据具体查询和数据库系统而定。 总的来说,SQL是一门强大的...
10. **子查询(Subqueries)**:子查询是在另一个查询内部的查询,它可以作为外部查询的一部分,提供临时的结果集。 11. **连接(Joins)**:除了基础的JOIN操作,还有自连接(Self JOIN)和多表连接,用于处理涉及...
【SQL语句基础】 SQL(Structured Query Language)是用于管理和处理关系数据库的标准语言,它包含了数据查询、数据更新、数据插入和数据删除等操作。SQL并非一种完整的编程语言,而是一种特殊的、高度结构化的查询...
你可以根据需要选择一个或多个列,也可以使用WHERE子句过滤结果,GROUP BY进行数据分组,HAVING用于对分组后的数据进行条件筛选,ORDER BY进行排序,LIMIT限制返回的行数,甚至使用JOIN操作连接多个表的数据。...
"SQL中的AS用法和经典SQL语句整理" SQL语言中,AS关键字用于为表或列指定别名,以便于查询和简化语句。在本文中,我们将总结一些常用的SQL语句,并解释AS用法的细节。 一、DELETE语句 DELETE语句用于删除表中的...
在SQL Server 2005中,数据库管理和数据查询是其核心功能,而函数和SQL语句则是实现这些功能的重要工具。这篇笔记主要探讨的是SQL Server 2005中的常用函数以及一些经典的SQL语句,这对于数据库管理员和开发人员来说...
27. **TOP关键字**:在某些SQL方言中,用于限制返回的行数,通常与ORDER BY一起使用。 28. **LEFT JOIN、RIGHT JOIN和FULL JOIN**:不同类型的JOIN操作,用于包含左表、右表或两者的所有记录。 29. **PIVOT和...
例如,下面的SQL语句将会选取`usertb`表中`age`大于20的用户,但只返回第一行的结果: ```sql SELECT name FROM usertb WHERE age > 20 LIMIT 0, 1; ``` 这里`0`是偏移量,表示从第一行开始(因为索引是从0开始的...
从给定的文件信息中,我们可以提炼出一系列与SQL相关的知识点,这些知识涵盖了从基本的SQL语句到高级的数据操作技巧。以下是对标题、描述、以及部分列出的内容进行的详细解读: ### SQL语言概述 SQL(Structured ...
2. **ROWNUM与子查询结合**:接下来,在外层查询中使用`ROWNUM`来限制返回的结果集行数。这里使用了一个技巧性的方法: - 首先,给内层查询加上`ROWNUM`,并命名为`rw`。 - 然后,再次使用子查询,将内层查询的...
### SQL语句教程大全 #### 一、SQL基础指令概览 SQL(Structured Query Language),即结构化查询语言,是一种用于管理关系型数据库的标准语言。它不仅被用于数据的存储和检索,还广泛应用于数据的更新、删除以及...
这个压缩包中的"SQL语句大全"很可能是一个详细的指南,涵盖了SQL的各种方面,包括基本语法、函数以及存储过程。下面将对这些主题进行深入的阐述。 首先,SQL的基本语法是所有查询的基础。它包括了SELECT语句,用于...
以下将详细解释标题和描述中提到的经典SQL语句使用例子。 1. **数据表的查询 (SELECT)** - `SELECT`语句用于从数据表中选取指定的字段。例如: ```sql SELECT id, gsmc, add, tel FROM haf; ``` - 使用`*`表示...
### SQL语句中SELECT语句的执行顺序 在SQL语言中,`SELECT`语句是进行数据查询的核心工具。为了确保查询结果的准确性和效率,理解`SELECT`语句内部的执行顺序至关重要。本文将详细解析`SELECT`语句各子句的执行...
右外连接(右连接):结果集既包括连接表的匹配连接行,也包括右连接表的所有行。 C:full/cross (outer) join: 全外连接:不仅包括符号连接表的匹配行,还包括两个连接表中的所有记录。 12、分组:Group by: ...