一道mysql面试题,觉得有些伤脑经,记录下来

来源:互联网 发布:淘宝开店怎么上传宝贝图片 编辑:程序博客网 时间:2024/06/09 20:53

我是刚刚学php不久,后来知道php与mysql是紧密相联的,于是暂时放下php的学习,先去把mysql搞懂。

像我这种学渣,既没有基础,也没有好好努力,估计今后只能后悔了。。。(好像扯远了)

好了,上题目!

设有成绩表stu如下:

姓名  科目  分数
张三  数学   90
张三  语文   50
张三  地理   40
李四  语文   55
李四  政治   45
王五  政治   30


试查询两门及两门以上不及格同学的平均分。

要求只用一次select语句,而且不用到左拼接神马的,只会用到刚学的where和having语句。


刚开始看到这个题,我估计很多新手都会最开始就算两门及两门以上不及格的同学,结果到了后面发现张三的90分数学成绩被过滤了,结果再求后面的平均分,就没办法了。。。

我开始也是这么想的=_=(定势思维啊),最后发现这样就无法算出来了!!!后来,我认识到,如果我先算出所有同学的平均分,然后根据这些同学的挂科门数来确定是否会被筛选,不就迎刃而解了吗?

来看看具体的步骤:

1. 建表

create table stu
(
name char(3),
kemu char(2),
score smallint
)charset utf8;

2.插入数据至表stu

insert into stu
values
('张三','数学',90),
('张三','语文',50),
('张三','地理',40),
('李四','语文',55),
('李四','地理',45),
('王五','政治',30);

3.查询所有同学的平均分

select name,avg(score) from stu group by name;


4.查询所有同学不及格科目的门数

select name,sum(score < 60) from stu group by name;


5.查询不及格门数大于等于2的同学

select name,sum(score < 60) as guake from stu group by name having guake >=2;


6.将上面的合并起来,完成!

select name,sum(score < 60) as guake,avg(score) from stu group by name having guake >=2;




这样问题就解决了。答案是select name,sum(score < 60) as guake,avg(score) from stu group by name having guake >=2;


其实,问题并不是很难,但是我们有时候要改变我们的定势思维,多想想,从别的方面想一想,也许会发现更好的办法!


0 0