最近在面试中遇见一个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。

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

  1. 数据库:一条sql语句查询每门课程都大于80分的学生姓名

    描述:已知student表有姓名-name,分数-grade,课程-course,它们多对多对多,一条sql语句查询每门课程都大于80分的学生姓名? 分析: ①每门课程,涉及到课程数量统计 SELEC ...

  2. select每门可说大于90分_用一条sql语句查询出“每门”课程都大于80分的学生姓名...

    展开全部 首先需要进行分析: 要查询出每门课程都大于80分的学生姓名,因为一个学生有多门课程,所以会出62616964757a686964616fe78988e69d8331333366306534现 ...

  3. 查询出每门课都大于85 分的学生姓名

    用一条SQL 语句 查询出每门课都大于85 分的学生姓名 name   course   score Mary    语文       87 Mary     数学       75 Jeky     ...

  4. mysql查询每门课程成绩最好的前两名学生id和姓名

    创建库:create database db6; 库下面创建表: 班级表: mysql> create table class(cid int not null unique auto_incr ...

  5. 案例:用一条 SQL 语句查询出每门课都大于 80 分的学生姓名

    用一条sql语句查询出每门课都大于80分的学生姓名 首先需要进行分析: 要查询出每门课程都大于80分的学生姓名,因为一个学生有多门课程,所以会出现下面三种情况. 第一可能所有课程都大于80分. 第二可 ...

  6. 用一条SQL 语句 查询出每门课都大于80 分的学生姓名

    1老规矩,首先分析题目理清楚思路再做题,上图: 2.如上图,查询每门课都大于80分的学生姓名,那么第一反应这还不简单: Select Distinct Name From Student Where ...

  7. mysql查询成绩大于89分_查询每门课程成绩都大于80分学生的姓名

    转载的sql语句 .1 查询每门课程成绩都大于80分学生的学号 数据库 表 student name score course A 85  语文 A 75  数学 A 82  英语 B   75  语 ...

  8. 洪君:查出“张”姓学生中平均成绩大于75分的学生信息查询出每门课程的成绩都大于80的学生

    查询出"张"姓学生中平均成绩大于75分的学生信息 表名:student_score  name course score  张青 语文 72  王华 数学 72  张华 英语 81 ...

  9. 有一个班4个学生,5门课程①求第1门课程的平均分;②找出有两门以上课程不及格的学生,输出他们的学号和全部课程成绩及平均成绩;③找出平均成绩在90分以上或全部课程成绩在85分以上的学生分别编3个函数实

    有一个班4个学生,5门课程. ①求第1门课程的平均分; ②找出有两门以上课程不及格的学生,输出他们的学号和全部课程成绩及平均成绩; ③找出平均成绩在90分以上或全部课程成绩在85分以上的学生. 分别编 ...

最新文章

  1. Python语言的有限状态机实现样例
  2. CentOS下软件的安装
  3. 使用Tomcat+MyEclipse开发Java Web配置
  4. 春节前51Aspx源码发布详情
  5. 【人工智能】如何Finetune一个小网络到移动端(时空性能分析篇)
  6. kvm虚拟机安装esxi服务器,VMware vSphere虚拟机迁移至KVM virt-v2v方案
  7. ListView系列(七)——Adapter内的onItemClick监听器四个arg参数 (转)
  8. 使用GDAL下载并转换SRTM的DEM数据(二)
  9. 为什么要自定义ClassLoader进行类加载
  10. 两万字《Java完全自学手册》15张导图,送给所有的零基础小白(建议收藏)
  11. 利用Python进行百度文库内容爬取(一)
  12. Markdown 数学符号大全
  13. Excel如何复制一摸一样的表格或建立副本
  14. python中怎么统计英文字符的个数_【Python练习1】统计一串字符中英文字母、空格、数字和其他字符的个数...
  15. 在Excel中单元格内画斜分割线,且线两边写上内容
  16. jnz和djnz_单片机指令
  17. 陕西省ti杯竞赛题目_2017年全国大学生电子设计竞赛和陕西省(TI杯)校际联赛暨西安电子科技大学校内选拔赛...
  18. 微软亚洲研究院院友会,AI大牛新动向|AI科技评论周刊
  19. VASP学习1入门知识
  20. java基础学习总结(二)——开篇(转载于孤傲苍狼博主的心得体会)

热门文章

  1. RSA结合DES解决上下行接口的安全性问题
  2. CommonUtils 工具类
  3. 常见的状态码1xx、2xx、3xx、4xx、5xx、
  4. 摄像头安装指南( spca5xx)
  5. c语言tab什么意思_C语言所有的知识点干货
  6. 二维码是如何设计出来的?
  7. Python可视化|matplotlib05-绘图风格大全
  8. Android 打包签名 从生成keystore到完成签名
  9. 计算机组成原理 汇编语言
  10. 《Adobe Illustrator CC经典教程》—第0课0.15节使用画笔