0%

SQL-ROW_NUMBER

Oracle中为行号分配唯一编号,可以使用ROWNUM伪列,不过内置的SQL函数ROW_NUMBER是一个更好的选择。

ROWNUM

ROWNUM伪列返回查询出来数据的顺序,即按照插入时间排的序。

返回十条数据

1
2
3
SELECT *
FROM employees
WHERE ROWNUM < 11;

返回十条数据,并排序

如果没有索引,将会先按插入时间选出10条,再进行排序;如果有索引,将会先排序,再选出10条。

1
2
3
4
SELECT *
FROM employees
WHERE ROWNUM < 11
ORDER BY last_name;

先排序,再选出10条

1
2
3
SELECT *
FROM (SELECT * FROM employees ORDER BY employee_id)
WHERE ROWNUM < 11;

ROWNUM大于正数

将不会返回数据,比如

1
2
3
SELECT *
FROM employees
WHERE ROWNUM > 1;

ROW_NUMBER

语法

1
2
ROW_NUMBER( )
OVER ([ query_partition_clause ] order_by_clause)

示例

查询每个部门工资最高的三条数据

1
2
3
4
5
6
7
8
9
SELECT department_id, first_name, last_name, salary
FROM
(
SELECT
department_id, first_name, last_name, salary,
ROW_NUMBER() OVER (PARTITION BY department_id ORDER BY salary desc) rn
FROM employees
)
WHERE rn <= 3

Mysql

MySQL从8.0版本开始,也支持ROW_NUMBER函数

参考资料