rank,order by 看上去都是排序,但rank的功能简直不要太灵活太强大。
order by就只是个排序,比如:select 学生姓名,科目,分数 from 成绩表 order by 分数 desc。
但是,当学生非常多时,order by只看出学生的大致成绩分布,不能看出具体的名次。如果要知道名次,就得rank配合上场了,如:select 学生姓名,科目,分数,rank() over(order by 分数 desc ) as 名次 from 成绩表 。用这个排序有个好处,如果有并列名次的,后面的名次会自动累积增加。比如有三个并列第2的,再下一个名次就是5。如果不想名次累积增加,就写成:select 学生姓名,科目 ,分数,dense_rank() over(order by 分数 desc ) as 名次 from 成绩表。这样在三个并列第2之后,名次仍然是第3。
以上方式是拉通排名次的,不管语文数学还是英语,都由高到低排名次。
rank还可以分区域查询,也就是说如果大家想各个科目分别排序,可以这么写:select 学生姓名,科目,分数,rank() over(partition by 科目 order by 分数 desc ) as 名次 from 成绩表。