SQL查询:求选修了1号课程和2号课程的学生的姓名及成绩

NetCarp 2005-04-26 11:26:47
题目是这样的:
有以下三个表
student表:sno(学号),sname(姓名),sex(性别),dept(系)
course课程表:cno(课程号),课程名(cname)
sc选课表:sno,cno,grade(成绩)
求:选修了1号课程和2号课程的学生的姓名及成绩

我是这样做的(在sql server 2000的查询分析器中调试):
select sname,grade
from sc,student
where sc.cno in(
select cno
from course
where cno='1' or cno='2') and sc.sno=student.sno
group by sname
having count(grade)='2'
提示信息为:
服务器: 消息 8120,级别 16,状态 1,行 1
列 'sc.Grade' 在选择列表中无效,因为该列既不包含在聚合函数中,也不包含在 GROUP BY 子句中。

若我将上述查询语句改为
select sname
from sc,student
where sc.cno in(
select cno
from course
where cno='1' or cno='2') and sc.sno=student.sno
group by sname
having count(grade)='2'
可以正确获得选修了1号和2号课程的学生的姓名。

请问该如何解决这个问题,谢谢先。
...全文
20636 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
magicfire 2005-04-28
  • 打赏
  • 举报
回复 1
平时做查询的时候表做关联的时候从FROM里面连,而在查询分析器里要在FROM前面连接还要用INNER JOIN。。。
hsj20041004 2005-04-26
  • 打赏
  • 举报
回复

这样就好了!!你试一试!!!
select sname,min(grade)
from sc ,student
where sc.cno in(
select cno
from course
where cno='1' or cno='2') and sc.sno=student.sno
group by sname
having count(grade)='2'
paoluo 2005-04-26
  • 打赏
  • 举报
回复
在查询分析器里面写的语句和平时用的SQL语句不一样???什么意思??你写的不一样吗??

magicfire 2005-04-26
  • 打赏
  • 举报
回复
弱弱的问一下,为什么在查询分析器里面写的语句和平时用的SQL语句不一样啊,是因为那是Transact-sql吗?
playyuer 2005-04-26
  • 打赏
  • 举报
回复
exists
jihanzhong 2005-04-26
  • 打赏
  • 举报
回复
楼上好强,建议改名为: 一天到晚在csdn上游泳并且为广大菜鸟服务的鱼
paoluo 2005-04-26
  • 打赏
  • 举报
回复
--建立测试环境
Create table student
(sno Varchar(10),
sname Varchar(10))

Create table course
(cno Varchar(10),
cname Varchar(10))

Create table sc
(sno Varchar(10),
cno Varchar(10),
grade Int)
GO
--插入数据
Insert student Values('01','XS1')
Insert student Values('02','XS2')
Insert student Values('03','XS3')
Insert student Values('04','XS4')
Insert student Values('05','XS5')

Insert course Values('1','KC1')
Insert course Values('2','KC2')
Insert course Values('3','KC3')

Insert sc Values('01','1',90)
Insert sc Values('01','2',80)
Insert sc Values('01','3',70)
Insert sc Values('02','2',85)
Insert sc Values('02','3',85)
Insert sc Values('03','1',92)
Insert sc Values('03','2',82)
Insert sc Values('04','1',92)
Insert sc Values('05','2',82)
Insert sc Values('05','3',83)
GO
--测试
Select sname,D.cname,A.grade,E.cname,B.grade from sc A
Inner Join sc B On A.sno=B.sno And A.cno='1' And B.cno='2'
Left Join student C On A.sno=C.sno
Left Join course D On A.cno=D.cno
Left Join course E On B.cno=E.cno
--删除测试环境
Drop table student,course,sc
--结果
/*
sname cname grade cname grade
XS1 KC1 90 KC2 80
XS3 KC1 92 KC2 82
*/
paoluo 2005-04-26
  • 打赏
  • 举报
回复
sex(性别),dept(系)这两个字段在这里没什么用,所以去掉了。

我再加点数据给你测试下。
paoluo 2005-04-26
  • 打赏
  • 举报
回复
--建立测试环境
Create table student
(sno Varchar(10),
sname Varchar(10))

Create table course
(cno Varchar(10),
cname Varchar(10))

Create table sc
(sno Varchar(10),
cno Varchar(10),
grade Int)
GO
--插入数据
Insert student Values('01','XS1')
Insert student Values('02','XS2')
Insert student Values('03','XS3')

Insert course Values('1','KC1')
Insert course Values('2','KC2')

Insert sc Values('01','1',90)
Insert sc Values('01','2',80)
Insert sc Values('02','2',85)
Insert sc Values('03','2',82)
GO
--测试
Select sname,D.cname,A.grade,E.cname,B.grade from sc A
Inner Join sc B On A.sno=B.sno And A.cno='1' And B.cno='2'
Left Join student C On A.sno=C.sno
Left Join course D On A.cno=D.cno
Left Join course E On B.cno=E.cno
--删除测试环境
Drop table student,course,sc
--结果
/*
sname cname grade cname grade
XS1 KC1 90 KC2 80
*/
NetCarp 2005-04-26
  • 打赏
  • 举报
回复
首先,谢谢各位的关注。

to paoluo,jihanzhong:
我是想列出同时选修了1号课程和2号课程的学生的姓名及这两科的成绩,而不是选修了1号课程或者2号课程之一的学生的姓名及成绩。
jihanzhong 2005-04-26
  • 打赏
  • 举报
回复
有以下三个表
student表:sno(学号),sname(姓名),sex(性别),dept(系)
course课程表:cno(课程号),课程名(cname)
sc选课表:sno,cno,grade(成绩)
求:选修了1号课程和2号课程的学生的姓名及成绩


同时选1,2还是 选了1或2?
paoluo 2005-04-26
  • 打赏
  • 举报
回复
楼主是不是想查出同时选修了1号课程和2号课程的学生??还是说只是列出选修了1号课程的学生或选修了2号课程的学生。
NetCarp 2005-04-26
  • 打赏
  • 举报
回复
to chenqianlong:
这种想法我试过的,不行,虽然没有任何错误提示信息,但是也没有显示任何结果。
chenqianlong 2005-04-26
  • 打赏
  • 举报
回复
select sname,grade
from sc,student
where sc.cno in(
select cno
from course
where cno='1' or cno='2') and sc.sno=student.sno
group by sname,grade
having count(grade)='2'
NetCarp 2005-04-26
  • 打赏
  • 举报
回复 1
我用下面的语句实现了题目的要求,不知还有其它的写法不,比如用exists。

select sname,grade
from sc,student
where sc.sno in(select sno
from sc
where sc.cno='1') and
sc.sno in(select sno
from sc
where sc.cno='2') and sc.sno=student.sno

34,835

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧