用一条sql语句查询出“每门”课程都大于80分的学生姓名
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用一条sql语句查询出“每门”课程都大于80分的学生姓名相关的知识,希望对你有一定的参考价值。
Name chengji fengshu
张三 数学 75
张三 语文 81
李四 数学 90
李四 语文 76
王五 数学 81
王五 语文 100
王五 英语 90
首先需要进行分析:
要查询出每门课程都大于80分的学生姓名,因为一个学生有多门课程,所以会出现下面三种情况。
第一可能所有课程都大于80分。
第二可能有些课程大于80分,另外一些课程少于80分。
第三也可能所有课程都小于80分。
那么我们要查找出所有大于80分的课程的学生姓名,我们可以反向思考,找出课程小于80分(可以找出有一些课程小于80分,所有课程小于80分的学生)的学生姓名再排除这些学生剩余的就是所有课程都大于80分的学生姓名了。
分析完成后,进入数据图形化管理界面创建表并插入数据
--创建表aa
create table aa(
name varchar(10),
kecheng varchar(10),
fengshu int
)
--插入数据到表aa中
insert into aa values('张三','语文',81)
insert into aa values('张三','数学',75)
insert into aa values('李四','语文',76)
insert into aa values('李四','数学',90)
insert into aa values('王五','语文',81)
insert into aa values('王五','数学',100)
insert into aa values('王五','英语',90)
用一条SQL语句查询出每门课都大于80分的学生姓名
select distinct name from aa where name not in (select distinct name from aa where fengshu<=80)
结果如下图:
扩展资料:
除了用distinct还可以用not in 或者 not exists 实现
//not in
SELECT DISTINCT A.name FROM Student A WHERE A.name not in(SELECT Distinct S.name FROM Student S WHERE S.score <80);
//not exists
SELECT DISTINCT A.name From Student A where not exists (SELECT 1 From Student S Where S.score <80 AND S.name =A.name);
结果与前面正文一样。
参考技术A一、问题分析:
每门课都大于80分,就是说学生最低分数要大于80分,我们直观看只有"王五"这个学生每门课分数都在80分以上。
二、解决思路:
这里需要用到聚合函数min(score),查询出最低分数大于80分的学生即可。使用了聚合函数,条件就需要使用having语句。
三、sql语句设计如下
1.查询姓名,最低分数。
2.这里只能查询出最低分数的那个人。需要改进,根据用户名分组(group by name),这样就能查询出每个人的最低分数。
3.查询出了每个人的最低分数,我们只需要得到最低分数大于80的学生。通过having语句来筛选。
4.我们得到了"王五"的信息,满足我们的要求,但是不是最终的需求,最终的需求是得到每门课大于80分的学生姓名。这样,我们需要再嵌套一个语句,只得到姓名。
最终SQL:select name from (select name,min(score) from student group by name having min(score)>80) stu
参考技术B 给个思路,供参考:先查出低于80分的学生名单,然后再用姓名作为条件对比,排除刚才查到的学生
SQL Server:
select distinct [Name] from [表] where [Name] not in (
select [Name] from [表] where [fengshu]<=80
)本回答被提问者采纳 参考技术C SELECT
course.sno,
student.sname,
course.score
from test.student
left join test.course on student.sno = course.sno
GROUP BY sno HAVING min( score) >80 参考技术D select distinct name
from stu
where name not in
(select distinct name from stu where fengshu <=80);
用一条SQL语句查出每门课都大于80分的学生的姓名
用一条SQL语句查出每门课都大于80分的学生的姓名,数据表结构如下:
建表SQL如下:
SET FOREIGN_KEY_CHECKS=0; -- ---------------------------- -- Table structure for grade -- ---------------------------- DROP TABLE IF EXISTS `grade`; CREATE TABLE `grade` ( `name` varchar(255) NOT NULL, `class` varchar(255) NOT NULL, `score` tinyint(4) NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- ---------------------------- -- Records of grade -- ---------------------------- INSERT INTO `grade` VALUES (\'张三\', \'语文\', \'81\'); INSERT INTO `grade` VALUES (\'张三\', \'数学\', \'75\'); INSERT INTO `grade` VALUES (\'李四\', \'语文\', \'76\'); INSERT INTO `grade` VALUES (\'李四\', \'数学\', \'90\'); INSERT INTO `grade` VALUES (\'王五\', \'语文\', \'81\'); INSERT INTO `grade` VALUES (\'王五\', \'数学\', \'100\'); INSERT INTO `grade` VALUES (\'王五\', \'英语\', \'90\'); SET FOREIGN_KEY_CHECKS=1;
查询每门课都大于80分的同学的姓名:
SELECT DISTINCT name FROM grade WHERE name NOT IN(SELECT DISTINCT name FROM grade WHERE score <=80);
更简单的:
SELECT name FROM grade GROUP BY name HAVING MIN(score) > 80;
查询平均分大于80的学生的姓名:
SELECT name FROM (SELECT COUNT(*) AS t,SUM(score) AS num,name FROM `grade` GROUP BY name) AS a WHERE a.num > 80*t;
更简单的:
select name, avg(score) as sc from grade g1 group by name having avg(score)>80 ;
以上是关于用一条sql语句查询出“每门”课程都大于80分的学生姓名的主要内容,如果未能解决你的问题,请参考以下文章