现在我要查询至少选修了S1选修的全部课程的学生的学号

jiang5495 2009-12-01 12:32:37
我有如下的数据表,表名为S,各字段含意分别人,学号,课程号,和分数。
现在我要查询至少选修了S1选修的全部课程的学生的学号,
请问SQL语句怎么写?
SNO CNO SCORE
S1 C1 90
S1 C2 85
S2 C5 57
S2 C6 80
S2 C7 80
S3 C1 80
S3 C2 89
S3 C4 23
S4 C1 34
S4 C2 79
S4 C3 34
S5 C2 89
...全文
2942 35 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
35 条回复
切换为时间正序
请发表友善的回复…
发表回复
流智 2011-05-08
  • 打赏
  • 举报
回复
Select sname from S where not exists
(select cno from SC where sno='s1' and cno not in
(select cno from SC where S.sno=sno))
jacoblx 2010-04-28
  • 打赏
  • 举报
回复
8楼,14楼正解啊,怎么理解呢?书上就是这样的
sych888 2009-12-02
  • 打赏
  • 举报
回复 1
select S# from SC where C# in (select C# from SC where S#='s1')
group by S# having count(*)>=(select count(*) from SC where S#='s1');
bj_kevin51 2009-12-01
  • 打赏
  • 举报
回复
这种面试题,太2了!
lang071234 2009-12-01
  • 打赏
  • 举报
回复
还是没看懂。还以为等一会会有人答复呢。。在等等。。刚才占沙发好了
yanglinqiang 2009-12-01
  • 打赏
  • 举报
回复

create table S(SNO varchar(4),CNO varchar(4), SCORE int)
insert into S select 'S1','C1','90'
union all select 'S1','C2','85'
union all select 'S2','C5','57'
union all select 'S2','C6','80'
union all select 'S2','C7','80'
union all select 'S3','C1','80'
union all select 'S3','C2','89'
union all select 'S3','C4','23'
union all select 'S4','C1','34'
union all select 'S4','C2','79'
union all select 'S4','C3','34'
union all select 'S5','C2','89'
;with tb as
(
select num=count(1),a.SNO
from S a,S b
where a.CNO=b.CNO and b.SNO='s1'
group by a.SNO)
select SNO from tb where num>=(select num from tb where SNO='s1')

--SNO
------
--S1
--S3
--S4
--
--(3 行受影响)

nianran520 2009-12-01
  • 打赏
  • 举报
回复

declare @table table([SNO] varchar(2),[CNO] varchar(2),[SCORE] int)
insert @table
select 'S1','C1',90 union all
select 'S1','C2',85 union all
select 'S2','C5',57 union all
select 'S2','C6',80 union all
select 'S2','C7',80 union all
select 'S3','C1',80 union all
select 'S3','C2',89 union all
select 'S3','C4',23 union all
select 'S4','C1',34 union all
select 'S4','C2',79 union all
select 'S4','C3',34 union all
select 'S5','C2',89

select SNO
from
(
select SNO,count(1) as times from @table
where CNO in (select CNO from @table where SNO = 'S1')
group by SNO
) t
where times = (select count(1) from @table where SNO = 'S1')
--结果
--------------
S1
S3
S4
jiang5495 2009-12-01
  • 打赏
  • 举报
回复
也就是说S1选修的课程,
目的学生都选修了,
比如说S1选修了C!,C2两门课,
那么S2选了C!,C2,C3是满足条件的查询结果,
不知我有没有解释清楚
-狙击手- 2009-12-01
  • 打赏
  • 举报
回复
至少选修了S1选修的全部课程的学生的学号

--

解释一下
-狙击手- 2009-12-01
  • 打赏
  • 举报
回复
没看懂
icelovey 2009-12-01
  • 打赏
  • 举报
回复 1

-- =============================================
-- Author: T.O.P
-- Create date: 2009/12/01
-- Version: SQL SERVER 2005
-- =============================================
declare @tb table([SNO] varchar(2),[CNO] varchar(2),[SCORE] int)
insert @tb
select 'S1','C1',90 union all
select 'S1','C2',85 union all
select 'S2','C5',57 union all
select 'S2','C6',80 union all
select 'S2','C7',80 union all
select 'S3','C1',80 union all
select 'S3','C2',89 union all
select 'S3','C4',23 union all
select 'S4','C1',34 union all
select 'S4','C2',79 union all
select 'S4','C3',34 union all
select 'S5','C2',89

select distinct a.sno
from @tb A
where sno<>'S1' and not exists(
select 1 from @tb b where sno='S1' and
not exists(select 1 from @tb c where a.sno = c.sno and b.cno=c.cno)
)


--测试结果:
/*
sno
----
S3
S4

(所影响的行数为 2 行)

*/

lrjt1980 2009-12-01
  • 打赏
  • 举报
回复
条件选择语句。
kasin000 2009-12-01
  • 打赏
  • 举报
回复
我错了。
dawugui 2009-12-01
  • 打赏
  • 举报
回复
create table tb([SNO] varchar(2),[CNO] varchar(2),[SCORE] int)
insert tb
select 'S1','C1',90 union all
select 'S1','C2',85 union all
select 'S2','C5',57 union all
select 'S2','C6',80 union all
select 'S2','C7',80 union all
select 'S3','C1',80 union all
select 'S3','C2',89 union all
select 'S3','C4',23 union all
select 'S4','C1',34 union all
select 'S4','C2',79 union all
select 'S4','C3',34 union all
select 'S5','C2',89
go

select sno from tb where sno <> 'S1' and cno in
(select cno from tb where sno = 'S1')
group by sno having count(1) >= (select count(1) from tb where sno = 'S1')

drop table tb

/*
sno
----
S3
S4

(所影响的行数为 2 行)
*/
kasin000 2009-12-01
  • 打赏
  • 举报
回复
S1应该不算吧。
kasin000 2009-12-01
  • 打赏
  • 举报
回复


SNO
----
S3
S4

(2 行受影响)
kasin000 2009-12-01
  • 打赏
  • 举报
回复

declare @table table([SNO] varchar(2),[CNO] varchar(2),[SCORE] int)
insert @table
select 'S1','C1',90 union all
select 'S1','C2',85 union all
select 'S2','C5',57 union all
select 'S2','C6',80 union all
select 'S2','C7',80 union all
select 'S3','C1',80 union all
select 'S3','C2',89 union all
select 'S3','C4',23 union all
select 'S4','C1',34 union all
select 'S4','C2',79 union all
select 'S4','C3',34 union all
select 'S5','C2',89


select a.SNO
from @table a,@table b
where b.SNO='S1'
And a.SNO!=b.SNO
And a.CNO=b.CNO
group by a.SNO
having COUNT(*)>1

jiang5495 2009-12-01
  • 打赏
  • 举报
回复
[Quote=引用 23 楼 yihunshaol 的回复:]
SQL codecreatetable S(SNOvarchar(4),CNOvarchar(4), SCOREint)insertinto Sselect'S1','C1','90'unionallselect'S1','C1',90unionallselect'S1','C2',85unionallselect'S2','C5',57unionallselect'S2','C6',80unionallselect'S2','C7',80unionallselect'S3','C1',80unionallselect'S3','C2',89unionallselect'S3','C4',23unionallselect'S4','C1',34unionallselect'S4','C2',79unionallselect'S4','C3',34unionallselect'S5','C2',89--查询语句selectdistinct snofrom swhere
cnoin(selectdistinct cnofrom swhere sno='S1')

结果
S1
S3
S4
S5

[/Quote]
这个查询结果显然是错的啊
yihunshaol 2009-12-01
  • 打赏
  • 举报
回复
create table S(SNO varchar(4),CNO varchar(4), SCORE int)
insert into S select 'S1','C1','90' union all
select 'S1','C1',90 union all
select 'S1','C2',85 union all
select 'S2','C5',57 union all
select 'S2','C6',80 union all
select 'S2','C7',80 union all
select 'S3','C1',80 union all
select 'S3','C2',89 union all
select 'S3','C4',23 union all
select 'S4','C1',34 union all
select 'S4','C2',79 union all
select 'S4','C3',34 union all
select 'S5','C2',89

--查询语句
select distinct sno from s where
cno in(select distinct cno from s where sno='S1')


结果
S1
S3
S4
S5
bj_kevin51 2009-12-01
  • 打赏
  • 举报
回复
顶 学习。。。
加载更多回复(14)
数据库原理实验指导书 实验名称:试验一:SQL语言嵌套查询和数据更新操作 所属课程:数据库原理 实验类型:设计型实验 实验类别:基础□ 专业基础√ 专业□ 实验学时:4学时 一、实验目的 1.熟悉和掌握对数据表中数据的查询操作和SQL命令的使用,学会灵活熟练的使用SQL 语句的各种形式; 2.加深理解关系运算的各种操作(尤其的关系的选择,投影,连接和除运算); 3.熟悉和掌握数据表中数据的插入、修改、删除操作和命令的使用; 4.加深理解表的定义对数据更新的作用 二、预习与参考 1.熟悉SQL SERVER 工作环境; 2.连接到学生-课程数据库 3.复习对表中数据查询的SQL语言命令; 4.复习对表中数据的插入、修改和删除的SQL语言命令。 三、实验要求(设计要求) 针对教材例子,通过SQL SERVER企业管理器和查询分析器两种模式,熟悉数据嵌套查询、更新操作。 四、实验方法及步骤 1.在表S、C、SC上进行简单查询; 2.在表S、C、SC上进行连接查询; 3.在表S、C、SC上进行嵌套查询; 4.使用聚合函数的查询; 5.对数据的分组查询; 6.对数据的排序查询。 7. 将数据插入当前数据库的表S、C、SC中; A:用SQL命令形式 B:用SQL SERVER提供的企业管理器以交互方式进行 8.将以上插入的数据分别以.SQL文件和.txt文件的形式保存在磁盘上; 9.修改表S、C、SC中的数据;   A:用SQL命令形式 B:用SQL SERVER提供的企业管理器以交互方式进行 10.删除表S、C、SC中的数据。 A:用SQL命令形式 B:用SQL SERVER提供的企业管理器以交互方式进行 五、实验内容 在表S,C,SC上完成以下操作: 1. 查询学生的基本信息; 2. 查询“CS”系学生的基本信息; 3. 查询“CS”系学生年龄不在19到21之间的学生学号、姓名; 4. 找出最大年龄; 5. 找出“CS”系年龄最大的学生,显示其学号、姓名; 6. 找出各系年龄最大的学生,显示其学号、姓名; 7. 统计“CS”系学生的人数; 8. 统计各系学生的人数,结果按升序排列; 9. 按系统计各系学生的平均年龄,结果按降序排列; 10. 查询每门课程课程名; 11. 查询无先修课的课程课程名和学时数; 12. 统计无先修课的课程的学时总数; 13. 统计每位学生选修课程的门数、学分及其平均成绩; 14. 统计选修每门课程学生人数及各门课程的平均成绩; 15. 找出平均成绩在85分以上的学生,结果按系分组,并按平均成绩的升序排列; 16. 查询选修了“1”或“2”号课程学生学号和姓名; 17. 查询选修了“1”和“2”号课程学生学号和姓名; 18. 查询选修课程名为“数据库系统”且成绩在60分以下的学生学号、姓名和成绩; 19. 查询每位学生选修课程学生信息(显示:学号,姓名,课程号,课程名,成绩); 20. 查询没有选修课程学生的基本信息; 21. 查询选修了3门以上课程学生学号; 22. 查询选修课程成绩至少有一门在80分以上的学生学号; 23. 查询选修课程成绩均在80分以上的学生学号; 24. 查询选修课程平均成绩在80分以上的学生学号; 25. 选做:针对SPJ数据库中的四个表S,P,J,SPJ,完成教材P74-75--习题5中的查询及教材P127--习题5中的查询。 26. 将数据分别插入表S、C、SC; 27. 将表S、C、SC中的数据分别以.SQL文件和.txt文件的形式保存在磁盘上。 28. 在表S、C、SC上练习数据的插入、修改、删除操作。(比较在表上定义/未定义主码(Primary Key)或外码(Foreign Key)时的情况) 29. 将表S、C、SC中的数据全部删除,再利用磁盘上备份的数据来恢复数据。 30. 如果要在表SC中插入某个学生的选课信息(如:学号为“200215121”,课程号为“c123”,成绩待定),应如何进行? 31. 求各系学生的平均成绩,并把结果存入数据库; 32. 将“CS”系全体学生的成绩置零; 33. 删除“CS”系全体学生的选课记录; 34. 删除学号为“S1”的相关信息; 35. 将学号为“S1”的学生学号修改为“S001”; 36. 把平均成绩大于80分的男同学的学号和平均成绩存入另一个表S——GRADE(SNO,AVG——GRADE); 37. 把选修课程名为“数据结构”的学生的成绩提高10%; 38. 把选修了“C2”号课程,且成绩低于该门课程的平均成绩的学生的成绩提高5%; 39. 把选修了“C2”号课程,且成绩低于该门课程的平均成绩的学生成绩删除掉; 40. 选做:将数据插入SPJ数据库中的四个表S,P,J,SPJ中,并以.SQL文件和.txt文件的形式保存在磁盘

34,871

社区成员

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

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