首页 > 试题广场 >

一张学生成绩表score,部分内容如下: name ..

[单选题]
一张学生成绩表score,部分内容如下:
name       course     grade
张三        操作系统      67
张三        数据结构      86
李四        软件工程      89
用一条SQL 语句查询出每门课都大于80 分的学生姓名,SQL语句实现正确的是:(      )
  • Select distinct name from score where name not in(Select name from score where grade <= 80);
  • Select distinct name from score where name  in(Select name from score where grade <= 80);
  • Select  name from score where name not in(Select name from score where grade <= 80);
  • Select  name from score where name  in(Select name from score where grade <= 80);
where name not in(Select name from score where grade <= 80);
选择分数不在80分及以下的名字,你想小王数据结构81,小王操作系统99......就会选出多个小王。

在表中,可能会包含重复值。这并不成问题,不过,有时您也许希望仅仅列出不同(distinct)的值。

关键词 DISTINCT 用于返回唯一不同的值。

编辑于 2019-09-07 11:16:58 回复(4)
题目说要查询出每门课成绩都大于80分的学生姓名,这里是要求一个人的所有课程成绩都大于80,所以首先从表中查询出成绩小于等于80分的学生姓名,只要有一门课成绩小于等于80,这个人则会被查询出来:
Select name from score where grade <= 80
然后再用where条件, name not in -> 要查询的学生不能在刚刚获得的有一门成绩小于等于80分的学生中:
where name not in(Select name from score where grade <= 80)
通过上面语句则现在剩下的就是每门成绩都大于80分的学生,但是同一个学生会有很多门课(感觉这题没有考虑重名情况),所以要去重,同一个人显示一次即可,用distinct实现:
Select distinct name from score where name not in(Select name from score where grade <= 80);
发表于 2021-02-19 20:30:48 回复(6)
distinct用于返回唯一不同的值
编辑于 2020-04-07 21:38:31 回复(0)
直接: Select name from score group by name having min(grade) > 80 就是最低一科的分数都要大于80
发表于 2022-05-25 14:21:39 回复(0)
翻评论是小王版,张三版69和89,子查询完明明就一个结果要啥distinct
发表于 2020-07-11 21:31:20 回复(2)
我一开始想为什么不用>80,后来在MySQL去查询发现连张三也算了,因为张三有一门是80以上的,所以>80的方法不能排除一个80一下及80以上的学生的。
发表于 2022-03-16 13:33:17 回复(0)
感觉题目描述没说清楚,张三就不能是两个人,或者至少加个主键吧?
发表于 2021-10-10 12:50:58 回复(0)
关键词 not in 很巧妙的逆向思维!每门成绩都大于80,相当于姓名不会出现在分数小于等于80的名单中,避免了正向思维中要对每位同学的所有课程分数都进行验证的复杂筛选语句。
发表于 2020-11-19 00:37:10 回复(0)
distinct用于返回唯一不同的值
发表于 2020-10-26 12:22:04 回复(0)
因为题目要求大于86分,首先排除B、D,有两个张三,肯定要去重。所以选A
发表于 2020-06-27 21:42:30 回复(0)
由题干可知,score表字段name、course及grade均不为主键,而实际中name有可能重复,所以该题存在歧义。
编辑于 2020-04-19 10:35:46 回复(1)
(Select name from score where grade <= 80)--查询出存在分数小于80人员的名单
where name not in(Select name from score where grade <= 80)--查找出不在分数小于80人员名单的人员
在此题中,小于80分人员名单是(张三)  那么就相当于 where name not in ("张三")。所以我觉得可以不用去重啊
,因为这里只有一个李四,如果是个多个李四那么需要distinct去重(单纯从此题的角度考虑)


发表于 2022-07-07 16:43:12 回复(1)
尝试了一下,选C不用distinct,会导致一个用户如果有两门成绩>80,会出现名字两次。但题目中忽略了重名这个问题,所以建表的时候最好还有一个学号字段来区分,如果硬要说的话,题目有瑕疵。
发表于 2023-07-27 15:50:17 回复(0)
先查询姓名和最少的分数:select name,min(grade) from score;
再查询:select name,min(grade) from score group by name having min(grade)>80;
最后:select name from (select name,min(grade) from score group by name having min(grade)>80) stu
发表于 2023-07-08 16:09:19 回复(0)
distinct的作用在于去除重复行
发表于 2022-01-23 15:53:40 回复(0)
每个科目都大于80严格来说应该学生分组后筛选出平均分大于80的吧
发表于 2022-01-02 11:48:28 回复(0)
确实没有加去重的话会有重复名字出现
发表于 2021-11-19 09:49:11 回复(0)
distinct的作用在于去除重复行
发表于 2021-10-17 09:35:29 回复(0)
distinct 用于返回唯一不同的值!
发表于 2021-09-16 16:35:08 回复(0)
DISTINCT的作用是去重
发表于 2021-09-16 09:33:41 回复(0)