Oracle 限制行的子句

Wesley13
• 阅读 698

12c新特性

限制行的子句允许限制查询返回的行。可以指定偏移量,以及要返回的行数或百分比。您可以使用此子句实现Top-N报告。要获得一致的结果,请指定ORDER_by子句以确保具有确定性的排序顺序。

[ OFFSET offset { ROW | ROWS } ]
[ FETCH { FIRST | NEXT } [ { rowcount | percent PERCENT } ]
{ ROW | ROWS } { ONLY | WITH TIES } ]

OFFSET

使用此子句指定行限制开始前要跳过的行数。偏移量必须是数值或计算为数值的表达式。如果指定负数,则偏移量将被视为0。如果指定为空,或者指定的数字大于或等于查询返回的行数,则返回0行。如果偏移量包含小数,则小数部分被截断。如果不指定该子句,则偏移量为0,行限制从第一行开始。ROW和ROWS关键字的含义相同,同时提供单数和复数形式,会使OFFSET子句读起来更自然。

FETCH

使用此子句指定要返回的行数rowcount或百分比percent。如果不指定该子句,则返回所有行,从行号OFFSET+1开始到最后一行。FIRST和NEXT关键字的含义相同,用于澄清语义。

使用rowcount指定要返回的行数。rowcount必须是数值或计算结果为数值的表达式。如果指定一个负数,则行数将被视为0。如果行数大于行偏移量+1处开始的可用行数,则返回所有可用行。如果行数包含小数部分,则小数部分将被截断。如果rowcount为空,则返回0行。使用percent PERCENT指定要返回的选定行总数的百分比。百分比必须是数值或计算为数值的表达式。如果指定一个负数,则百分比将被视为0。如果百分比为空,则返回0行。如果不指定行数或百分比,则返回1行。ROW和ROWS关键字的含义相同,用于澄清语义。

关键字ONLY或WITH TIES应与ROW/ROWS关键字一起使用。ROW ONLY返回指定的行数或行百分比。ROW WITH TIES会通过检索上一行时使用的关键字,提取出其他行,但必须指定order by子句才有效。如果您没有指定ORDER_BY_子句,那么不会返回其他行。

本子句受以下限制:

不能将此子句与for_update子句一起指定。

如果指定此子句,则选择列表不能包含序列伪列currval或nextval。

如果定义查询包含行限制子句,则物化视图不符合增量刷新的条件。

如果选择列表包含具有相同名称的列,并且指定了row_limiting子句,则会发生ORA-00918错误。无论同名列在同一个表中还是在不同的表中,都会发生此错误。可以通过为同名列指定唯一的列别名来解决此问题。

 示例:

返回employees中employee_id最低的5行:

SELECT employee_id, last_name
  FROM employees
  ORDER BY employee_id
  FETCH FIRST 5 ROWS ONLY;

EMPLOYEE_ID LAST_NAME
----------- -------------------------
        100 King
        101 Kochhar
        102 De Haan
        103 Hunold
        104 Ernst

返回employees中employee_id最低的5行后的5行:

SELECT employee_id, last_name
  FROM employees
  ORDER BY employee_id
  OFFSET 5 ROWS FETCH NEXT 5 ROWS ONLY;

EMPLOYEE_ID LAST_NAME
----------- -------------------------
        105 Austin
        106 Pataballa
        107 Lorentz
        108 Greenberg
        109 Faviet

 返回employees中salary最低的5%行:

SELECT employee_id, last_name, salary
  FROM employees
  ORDER BY salary
  FETCH FIRST 5 PERCENT ROWS ONLY;

EMPLOYEE_ID LAST_NAME                     SALARY
----------- ------------------------- ----------
        132 Olson                           2100
        128 Markle                          2200
        136 Philtanker                      2200
        127 Landry                          2400
        135 Gee                             2400
        119 Colmenares                      2500

返回employees中salary最低的5%行及salary等于最低5%的最后一行的其他行:

SELECT employee_id, last_name, salary
  FROM employees
  ORDER BY salary
  FETCH FIRST 5 PERCENT ROWS WITH TIES;

EMPLOYEE_ID LAST_NAME                     SALARY
----------- ------------------------- ----------
        132 Olson                           2100
        128 Markle                          2200
        136 Philtanker                      2200
        127 Landry                          2400
        135 Gee                             2400
        119 Colmenares                      2500
        131 Marlow                          2500
        140 Patel                           2500
        144 Vargas                          2500
        182 Sullivan                        2500
        191 Perkins                         2500
点赞
收藏
评论区
推荐文章
Wesley13 Wesley13
2年前
SQL必知必会——高级数据过滤
1、组合where子句为了进行更强的过滤控制,sql允许给出多个where子句,这些子句有两种使用方式,即以and子句或or子句的方式使用。注意:1、操作符:用来联结或改变where子句中的子句的关键字,也称为逻辑操作符1.1、and操作符检索由供应商DLL01制造且价格小于等于4美元的所有产品的名称和价格;SELECTpro
Stella981 Stella981
2年前
Django ORM 高性能查询优化
一、QuerySet可切片使用Python的切片语法来限制查询集记录的数目。它等同于SQL的LIMIT和OFFSET子句。Entry.objects.all():5(LIMIT5)Entry.objects.all()5:10(
Wesley13 Wesley13
2年前
MySQL INNER JOIN子句介绍
MySQLINNERJOIN子句介绍MySQLINNERJOIN子句将一个表中的行与其他表中的行进行匹配,并允许从两个表中查询包含列的行记录。INNERJOIN子句是SELECT语句的可选部分,它出现在FROM子句(https://www.oschina.net/action/GoT
Wesley13 Wesley13
2年前
mysql——GROUP BY和HAVING
GROUPBY语法可以根据给定数据列的每个成员对查询结果进行分组统计,最终得到一个分组汇总表。select子句中的列名必须为分组列或列函数,列函数对于groupby子句定义的每个组返回一个结果。某个员工信息表结构和数据如下:  id  name  dept  salary  edlevel     hiredate   1  张
Wesley13 Wesley13
2年前
MYSQL常用查询
一、MYSQL查询的五种子句where(条件查询)、having(筛选)、groupby(分组)、orderby(排序)、limit(限制结果数)【1】where:比较运算符    ,<,,!(<),,<in(param1,p
Wesley13 Wesley13
2年前
MySQL基础命令与案列解析
SQL的基本语法规范1、sql不区分大小写,但是习惯上关键字、系统保留字、函数名称大写,表名和列名小写;2、sql使用空格或者回车来分隔每个单词都一样,习惯上每个子句换行,WHERE子句中的每个条件占一行,子查询单独占一行;3、复杂的语句最好加上注释进行说明;4、sql语句中使用分号作为分隔符,系统读取到分号才会执行语句。
3A网络 3A网络
1年前
天天写 SQL,这些神奇的特性你知道吗?
天天写SQL,这些神奇的特性你知道吗?一SQL的第一个神奇特性日常开发我们经常会对表进行聚合查询操作,但只能在SELECT子句中写下面3种内容:通过GROUPBY子句指定的聚合键、聚合函数(SUM、AVG等)、常量,不懂没关系我们来看个例子听我解释有学生班级表(tblstudentclass)以及数据如下textDROPTAB
小万哥 小万哥
5个月前
SQL DELETE 语句:删除表中记录的语法和示例,以及 SQL SELECT TOP、LIMIT、FETCH FIRST 或 ROWNUM 子句的使用
SQLDELETE语句SQLDELETE语句用于删除表中的现有记录。DELETE语法sqlDELETEFROM表名WHERE条件;注意:在删除表中的记录时要小心!请注意DELETE语句中的WHERE子句。WHERE子句指定应删除哪些记录。如果省略WHERE
小万哥 小万哥
5个月前
SQL 通配符:用于模糊搜索和匹配的 SQL 关键技巧
SQL通配符字符通配符字符用于替代字符串中的一个或多个字符。通配符字符与LIKE运算符一起使用。LIKE运算符用于在WHERE子句中搜索列中的指定模式。示例返回所有以字母'a'开头的客户:sqlSELECTFROMCustomersWHERECustome
小万哥 小万哥
5个月前
SQL 中的运算符与别名:使用示例和语法详解
SQL中的IN运算符IN运算符允许您在WHERE子句中指定多个值,它是多个OR条件的简写。示例:获取您自己的SQLServer返回所有来自'Germany'、'France'或'UK'的客户:sqlSELECTFROMCustomersWHERECount