先以一个淘宝的题目作为开始:
有一张表t_stu;其中三个字段:name,gender,grade;要求用一条sql语句查出男生前3名和女生前3名。
create table t_stu(name varchar2(100),sex varchar2(10),grade number);
--添加的测试数据如下
jack boy 100 lili girl 90 lucy girl 98 tom boy 99 lilei boy 98 hanmeimei girl 97 wang boy 89 green girl 88
立刻可以先排序,然后使用rownum选择出来,代码如下:
select * from ( select t.*,rownum as rid from t_stu t where sex = 'boy' order by grade desc ) where rid <= 3 union select * from ( select t.*,rownum as rid from t_stu t where sex = 'girl' order by grade desc ) where rid <= 3
如果我们的需求有变化,查询每个班级中的第一名的学生成绩,假设班级很多,要求使用group by 分组,那么该如何写出SQL语句呢。
扩展我们的t_stu表,增加一个班级字段,如下:
alter table t_stu add class varchar2(10);
--修改测试数据
jack boy 100 1 lili girl 90 1 lucy girl 98 2 tom boy 99 2 lilei boy 98 3 hanmeimei girl 97 3 wang boy 89 4 green girl 88 4