rank() over() , row_number() over() , dense_rank() over()


注意 : 

  row_number(): 连续排序, 不会有重复,每一行记录指定一个唯一的排名.

  rank(): 跳跃排序,如果有两个第一级时,接下来就是第三级。如 1,1,3,4,5,6 或 1,2,2,2,5,6
  dense_rank(): 连续排序,如果有两个第一级时,接下来仍然是第二级. 如 1,2,2,3,4,5,6

另 :

  1. partition by 用于给结果集进行分区。就是partion by执行顺序查询出结果集后.

  2. partition by和group by有何区别?

    partition by只是将原始数据进行名次排列(记录数不变)

    group by是对原始数据进行聚合统计(记录数可能变少, 每组返回一条)

  3. order by 时null值排序 

    MySQL数据库,在order by排序的时候,如果存在NULL值,那么NULL是最小的。

      如果按照score desc 排序, 且让null值排在最前, 可以使用 :  select * from score  where course = '数学' order by -score asc ; 即:把-号(负号)放到要排序的列名前,并把asc替换为desc

    Oracle 数据库,   在order by排序的时候,如果存在NULL值,那么NULL是最大的。

      如果按照score desc 排序, 且让null值排在最后, ,可以使用select * from course order by score desc nulls last ; 

    

假设现在有一张学生成绩表course,学生表中有学号, 姓名, 科目, 分数, 现在我需要按照课程对学生的成绩进行排序。

1. rank over ()可以实现对学生排名,特点是成绩相同的两名是并列. 

2. dense_rank()和rank over()很像,但学生成绩并列后并不会空出并列所占的名次,如下1 2 2 3 4

3. row_number这个函数不需要考虑是否并列,那怕根据条件查询出来的数值相同也会进行连续排名

 row_number的用途的非常广泛,排序最好用它,一般可以用来实现web程序的分页,他会为查询出来的每一行记录生成一个序号,依次排序且不会重复,注意使用row_number函数时必须要用over子句选择对某一列进行排序才能生成序号。



SQL