我是刚刚学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;
其实,问题并不是很难,但是我们有时候要改变我们的定势思维,多想想,从别的方面想一想,也许会发现更好的办法!