最近看到一个SQL面试题,觉得可以作为范例熟悉一下,虽然这道题不难,但是看到大家都讨论关于用什么函数来处理时,我认为问题变复杂了,应该谈谈我的感想了。题目如下:
求:1、每个科目的最高分。
2、java成绩最高的姓名
3、java成绩第二高的姓名
我用MySQL测试的:
1.每个科目的最高分:
SELECT kemu,max(score) FROM table GROUP BY kemu;
分析:找出成绩最高的人后,根据科目分组就可以得到每组的最高分的人。
思路应用:以后再遇到求某几种大的类型下小类型中的最高值的问题,这个主要应用的是数据库中的分组,可以将此思路应用其中,如:
1.关于求某种产品价格最高的产品
2.求某几个地区销售量最高的店铺
3.求某几种类型数据中子类型中数量最高的集合
2.java成绩最高的姓名:
SELECT name FROM table WHERE kemu='java' and
score=(SELECT max(score) FROM table WHERE kemu='java');
分析:从表格中查询名称时,提出两点条件1.科目是java,2.科目是java的最高分
如果是名字和分数都要的话就很简单了直接打出:
SELECT name,max(cj) AS max_cj FROM table WHERE kemu='java';
思路应用:关于此类问题,主要是在一个大类型集合中求某一种类型下关联类型中最高的值,我们可以应用的方面有:
1.求某一科目中得分最高的成绩、名字等
2.求某一地区中销售最高的单位
3.求某一类型产品下销量最高的产品
3.java成绩第二高的姓名:
SELECT name FROM table WHERE kemu='java' GROUP BY name
ORDER BY cj DESC LIMIT 1,1;
分析:在查询姓名时根据[color=blue]kemu='java' [/color]这个条件,然后根据姓名分组,然后根据成绩排序,最后在列表中根据TOP 方法 LIMIT 选取从0开始的第二个姓名,只取1个人。OK了!这个题目主要考察了分组,排名和TOP取值方面的知识,难度相对最高。如果遇到这样的题,应该把大的问题一个个分散成小问题,然后一个个的解决小问题,然后拼凑起来,大问题就可以解决了。
思路应用:这个题目主要是在一个大类型集合中求某一种类型的某种排名中的某一个值,是大家在分析时最容易混淆的地方。其实针对这种题目,进行分解问题来一步步实现答案是一种很好的方法。这种题的应用有:
1.求这个科目根据某种条件排名第几的值
2.求这个地区根据某一条件排名第几的店铺
3.求这个类型产品根据某一条件排名在第几位的产品
最后总结一下:不论什么题,对于程序员,都应该吃透,不仅仅是会做了,关键是能把这个知识传达给你是思想和精髓找出来,再进一步说就是分析这道题:是什么?
能做什么?
怎么做?
为什么这么做?
我能用它来做什么?
就拿刚才的问题来说,从SQL的角度来讲,这道题
是什么? 是一个班级的学生成绩表。
能做什么? 能够来显示班级里每个学生学科成绩好坏的排名,让老师和学生一目了然
怎么做? 通过SQL语句中的分组,排序,TOP排名取值来实现
为什么这么做? 不排序的表和名单不能客观及时详细的显示出我们要的信息
我能用它来做什么? 可以通过这种排序或者分组方法得到其他类型问题的解决方案
我们不一定在实际应用中把每件事分析的这么细,但是我们要养成一种习惯,就是获取精髓,得人之鱼不如得人之渔。我们在开发中会遇到各种各样的问题,如果不把陌生的知识吃透,我们的水平肯定不能大步提高。也不能及时掌握新的技术,肯定会被淘汰,所有,程序员,很有必要做总结知识的工作。