SQL 5 限制结果集行数(MySQL & Oracle)
来源:互联网 发布:无法过去摄像头数据 编辑:程序博客网 时间:2024/06/12 20:38
在进行数据检索时,有时候需要只检索结果集中部分行,比如说“检索排在前3名的学生”、“检索工资水平排在第三位~第七位的员工信息”,这种功能被称为“限制结果集行数”。虽然在主流的数据库系统中都提供了限制结果集行数的方法,但是无论是语法还是使用方式都存在很大的差异。
1. MySQL
MySQL提供了LIMIT关键字用来限制返回的结果集,LIMIT放在SELECT语句的最后位置,语法为
“LIMIT首行行号,要返回的结果集的最大数目”。比如下面的SQL语句
SELECT * FROM T_Employee ORDER BY FSalary DESC LIMIT 2,5
+----------+--------+------+---------+-------------+---------------+
| FNumber | FName | FAge | FSalary | FSubCompany | FDepartment |
+----------+--------+------+---------+-------------+---------------+
| IT001 | Smith | 28 | 5500.00 | Beijing | InfoTech |
| SALES001 | Timmy | 25 | 5300.00 | Beijing | Sales |
| HR001 | Jane | 23 | 4300.00 | Beijing | HumanResource |
| DEV003 | Potter | NULL | 3333.00 | Guangzhou | Development |
| HR002 | Tina | 25 | 3300.00 | Beijing | HumanResource |
+----------+--------+------+---------+-------------+---------------+
很显然,下面的SQL语句将返回按照工资降序排列的前5条记录:
SELECT * FROM T_Employee ORDER BY FSalary DESC LIMIT 0, 5
+----------+-------+------+---------+-------------+---------------+
| FNumber | FName | FAge | FSalary | FSubCompany | FDepartment |
+----------+-------+------+---------+-------------+---------------+
| DEV001 | Tom | 25 | 8300.00 | Beijing | Development |
| SALES002 | Stone | 35 | 8300.00 | Beijing | Sales |
| IT001 | Smith | 28 | 5500.00 | Beijing | InfoTech |
| SALES001 | Timmy | 25 | 5300.00 | Beijing | Sales |
| HR001 | Jane | 23 | 4300.00 | Beijing | HumanResource |
+----------+-------+------+---------+-------------+---------------+
2. Oracle
Oracle中支持窗口函数ROW_NUMBER()。
SELECT * FROM (
SELECT ROW_NUMBER() OVER(ORDER BY FSalary DESC) row_num,
FNumber, FName, FSalary, FAge, FROM T_Employee
)
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<= 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为1,因为不符合“WHERE rownum BWTWEEN 3 AND 5 ”所以没有被放到检索结果中;当检索到第二跳的时候,因为第一条数据没有放到结果集中,所以第二条数据的rownum仍然为1, 而不是我们所想的2;由此看来,可依次类推。
因此如果要使用rownum来实现“按照工资从高到低的顺序去胡第三个~第五个员工的信息”的功能,就必须借助于窗口函数ROW_NUMBER()。
- SQL 5 限制结果集行数(MySQL & Oracle)
- SQL查询之限制结果集行数(分页)
- SQL 分页限制结果集行数
- SQL基础--限制结果集的行数
- 流行数据库SQL差异分析之“限制结果集行数”
- 数据库限制结果集行数(可用于分页)
- DB2 限制结果集返回的行数
- 各种数据库限制结果集行数总结
- 黑马程序员—学习笔记之SQL数据分组、限制结果集行数
- JDBC连接mysql获取结果集行数
- MySQL、Oracle、MS SQLserver限制查询所返回的行数
- 阿录帮帮忙—数据库分页:结果集行数(mysql,mssqlserver,DB2,Oracle)
- sql结果集限制与字符串拼接
- 如何在oracle和Mysql中限制返回结果集的大小
- ORACLE中限制记录集的返回行数
- oracle,db2,mysql ,sqlserver限制结果表的大小
- SQL查询结果集游标循环获得行数据
- 关于Oracle、Mysql、SQLServer中指定查询结果中返回的行数问题!
- ria 里面的写文件例子
- shell -- include 文件
- mxml 读取 xml 的例子
- shell --函数
- SAP PRINT WORD/DOC DIRECTLY
- SQL 5 限制结果集行数(MySQL & Oracle)
- ubuntu10.10安装体验方法大汇总
- 网站架构(页面静态化,图片服务器分离,负载均衡)方案全解析
- shell 编程——for in 循环
- shell编程——循环语句
- Ubuntu 10.04 Eclipse C/C++平台搭建
- UNIX通用系统变量和shell命令行参数
- COM 代理存根模式下COM组件的实现和加载
- shell 变量