Mysql查询各门课程成绩大于85分的学生名单—纠正网上大部分文章的错误

最近在面试中遇见一个Mysql面试题内容如下:

一张score表 中有如图所示数据,写出查询 所有成绩都大于85分的学生姓名的sql。

第一反应 所有成绩 根据name group by。

然后在min(chengji)>85.

写出的sql如下

SELECT * from chengji1 GROUP BY `name`  HAVING MIN(chengji)>=85;
SELECT * from chengji1  GROUP BY `name` HAVING MIN(chengji)>=85 ORDER BY chengji;


当然orderby 加不加一样。

自认为没问题。出于好奇回家自己创建了这个表插入了这些数据,想要验证一下结果。结果出乎意料的杯具了。

王五是被查询出来了。很奇怪啊。于是上网查查正确的sql如何写。结果发现80%以上的文章写得sql与我写得一样。只是他们的成绩是大于80,王五符合条件,所以没有暴漏出问题。

于是我增加数据进行再次尝试。

查询结果如下图

依旧是不正确的。网上查不到没办法了,自己研究把。

先用最原始的子查询把。sql如下:
 

SELECT DISTINCT a.name
FROM score a
WHERE a.name NOT IN(SELECT DISTINCT b.name FROM score b WHERE b.chengji < 85);

思路是查询出所有不符合条件的姓名,然后where 姓名不包含在子查询结果中的,如果一人有两门成绩大于85,这样可能会出现重复名字,加个DISTINCT去重一下。

这样是肯定没问题的。

然后进一步的去调整。

select name from score
group by name
having name not in (
select name from score
where chengji <85)

使用这个sql就不用使用DISTINCT关键字了。让group by来执行。

也没有问题。但是都是通过子查询,有没有更优的方法呢。想了一下原因是不是因为有的学生是两门成绩,但是有的学生是三门。于是我想到了一个方法,通过数量上进行判断每个人有几门成绩与他成绩大于85的次数进行比较。sql如下:

select name from score
group by name
having count(chengji) =sum(case  when chengji>85 then 1 else 0 end );

创建表语句

CREATE TABLE `score` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(10) DEFAULT NULL,
  `kecheng` varchar(10) DEFAULT NULL,
  `chengji` varchar(10) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=14 DEFAULT CHARSET=utf8;

插入数据的语句

INSERT INTO score(id,`name`,kecheng,chengji) VALUES(1,'张三','语文',81);
INSERT INTO score(id,name,kecheng,chengji) VALUES(2,'张三','数学',75);
INSERT INTO score(id,name,kecheng,chengji) VALUES(3,'李四','语文',76);
INSERT INTO score(id,name,kecheng,chengji) VALUES(4,'李四','数学',90);
INSERT INTO score(id,name,kecheng,chengji) VALUES(5,'王五','语文',81);
INSERT INTO score(id,name,kecheng,chengji) VALUES(6,'王五','数学',100);
INSERT INTO score(id,name,kecheng,chengji) VALUES(7,'王五','英语',90);
INSERT INTO score(id,name,kecheng,chengji) VALUES(8,'赵六','语文',89);
INSERT INTO score(id,name,kecheng,chengji) VALUES(9,'赵六','数学',100);
INSERT INTO score(id,name,kecheng,chengji) VALUES(10,'赵六','英语',90);
INSERT INTO score(id,name,kecheng,chengji) VALUES(11,'吴七','语文',81);
INSERT INTO score(id,name,kecheng,chengji) VALUES(12,'吴七','数学',79);
INSERT INTO score(id,name,kecheng,chengji) VALUES(13,'吴七','英语',67);

哈哈 成功了。这是我想到的最好的查询方式了。小伙伴们你们还有什么想法欢迎积极参与讨论。共同来找到一个最好的sql。

 

 

 

 

  • 10
    点赞
  • 48
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 15
    评论
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

songfelicity

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值